2_division.sage (3896B)
1 2 R1.<x> = PolynomialRing(QQ) 3 R2.<x,y> = PolynomialRing(QQ) 4 5 def extended_field( f, A, B, deg_mult ): 6 # f: a polynomial whose roots are the x-coordinates of some points of an 7 # elliptic curve E: y^2 = x^3 + Ax + B. 8 # return value: a field containing the x and y coordinates of those points 9 # deg_mult: a positive integer known to be a multiple of the degree of the 10 # extended field. 11 # 12 # This function uses the properties of resultants (I can provide a pdf 13 # explaining how it works). 14 # 15 # It is useful to compute, e.g., the fields obtained by adjoining the 16 # coordinates of the n-division points of a point (using the n-uplication 17 # formulas to get the required polynomials). 18 # 19 # When used to compute the 2-division fields, it gives the same output as 20 # E.division_field(2). 21 22 23 g = y^2 - x^3 - A*x - B 24 res = f.resultant(g,x) 25 res = res.subs(y=x) 26 27 #K.<b> = f.splitting_field() 28 #print aux 29 print "+++ Computing splitting field of the following: +++" 30 31 pol = R1(res*f) 32 print pol 33 34 K.<b> = NumberField( R( pari(pol).nfsplitting(deg_mult) ) ) 35 36 return K 37 38 L = [] 39 40 for A in range(1,9): 41 for B in range(1,9): 42 43 print "Current list of examples:", len(L), "elements. List:" 44 print L 45 46 E = EllipticCurve([0,0,0,A,B]) 47 print "*************************" 48 print E 49 print "of rank ", E.rank(), "with (some) points of infinite order:", E.gens() 50 print "CM:", E.has_cm() 51 52 rep = E.galois_representation() 53 print "mod 2 rep is surjective:", rep.is_surjective(2) 54 55 if E.rank() == 0: 56 print "Stopping because rank 0" 57 print "" 58 continue 59 if len(E.gens()) == 0: 60 print "Stopping because no points of infinite order found" 61 print "" 62 continue 63 if E.has_cm(): 64 print "Stopping because CM" 65 print "" 66 print "" 67 continue 68 if not rep.is_surjective(2): 69 print "Stopping because mod 2 rep is not surjective" 70 print "" 71 continue 72 73 K_2.<a> = E.division_field(2) 74 print "2-division field:", K_2 75 P = E(0) 76 flag = False 77 for P in E.gens(): 78 if len(P.division_points(2)) == 0: 79 flag = True 80 break 81 if not flag: 82 print "Stopping because the points found are 2-divisible" 83 print "" 84 continue 85 print "Taking the 2-division of P =", P 86 87 # The following polynomial is derived from the duplication formula 88 # (Silverman, p.54) using the x-coordinate of the 2-division point as 89 # an indeterminate.x 90 f_P = R1(x^4 - 4*P[0]*x^3 - 2*A*x^2 - 4*(2*B + A*P[0])*x + A^2 - 4*B*P[0]) 91 #print f_P.roots() 92 93 M = extended_field( f_P, A, B, 24 ) # The 2-division field of P 94 print "2-division field of P:", M 95 96 if M.degree() != 24: 97 print "Stopping because 2-division of P is too small" 98 print "" 99 continue 100 101 div_pol_4 = E.division_polynomial(4) 102 103 #if div_pol_4.splitting_field('zz').degree() < 48: 104 # print "Stopping because splitting field of div_pol_4 < 48" 105 # exit() 106 107 K_4 = extended_field( div_pol_4, A, B, 96 ) 108 print "4-division field:", K_4 109 110 if K_4.degree() != 96: 111 print "Stopping because mod 4 representation not surjective" 112 print "" 113 continue 114 115 if len(f_P.roots(ring=K_4)) == 0: 116 print "Stopping because M is not contained in K_4" 117 print "" 118 continue 119 120 print "----------------" 121 print "|Example Found!|" 122 print "----------------" 123 L.append((A,B)) 124 125 print "*************************" 126 print ""