kummer-notes-code

Notes and code from my early research in Kummer Theory for Elliptic Curves.
git clone https://git.tronto.net/kummer-notes-code
Download | Log | Files | Refs | README

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 ""