From 5ea79c7ae0d44686f1df05c4a016652afbe58968 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sun, 14 Jun 2026 09:58:21 +0200 Subject: Initial commit --- misc_code/2_division.sage | 126 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100755 misc_code/2_division.sage (limited to 'misc_code/2_division.sage') diff --git a/misc_code/2_division.sage b/misc_code/2_division.sage new file mode 100755 index 0000000..68cea80 --- /dev/null +++ b/misc_code/2_division.sage @@ -0,0 +1,126 @@ + +R1. = PolynomialRing(QQ) +R2. = PolynomialRing(QQ) + +def extended_field( f, A, B, deg_mult ): + # f: a polynomial whose roots are the x-coordinates of some points of an + # elliptic curve E: y^2 = x^3 + Ax + B. + # return value: a field containing the x and y coordinates of those points + # deg_mult: a positive integer known to be a multiple of the degree of the + # extended field. + # + # This function uses the properties of resultants (I can provide a pdf + # explaining how it works). + # + # It is useful to compute, e.g., the fields obtained by adjoining the + # coordinates of the n-division points of a point (using the n-uplication + # formulas to get the required polynomials). + # + # When used to compute the 2-division fields, it gives the same output as + # E.division_field(2). + + + g = y^2 - x^3 - A*x - B + res = f.resultant(g,x) + res = res.subs(y=x) + + #K. = f.splitting_field() + #print aux + print "+++ Computing splitting field of the following: +++" + + pol = R1(res*f) + print pol + + K. = NumberField( R( pari(pol).nfsplitting(deg_mult) ) ) + + return K + +L = [] + +for A in range(1,9): + for B in range(1,9): + + print "Current list of examples:", len(L), "elements. List:" + print L + + E = EllipticCurve([0,0,0,A,B]) + print "*************************" + print E + print "of rank ", E.rank(), "with (some) points of infinite order:", E.gens() + print "CM:", E.has_cm() + + rep = E.galois_representation() + print "mod 2 rep is surjective:", rep.is_surjective(2) + + if E.rank() == 0: + print "Stopping because rank 0" + print "" + continue + if len(E.gens()) == 0: + print "Stopping because no points of infinite order found" + print "" + continue + if E.has_cm(): + print "Stopping because CM" + print "" + print "" + continue + if not rep.is_surjective(2): + print "Stopping because mod 2 rep is not surjective" + print "" + continue + + K_2. = E.division_field(2) + print "2-division field:", K_2 + P = E(0) + flag = False + for P in E.gens(): + if len(P.division_points(2)) == 0: + flag = True + break + if not flag: + print "Stopping because the points found are 2-divisible" + print "" + continue + print "Taking the 2-division of P =", P + + # The following polynomial is derived from the duplication formula + # (Silverman, p.54) using the x-coordinate of the 2-division point as + # an indeterminate.x + 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]) + #print f_P.roots() + + M = extended_field( f_P, A, B, 24 ) # The 2-division field of P + print "2-division field of P:", M + + if M.degree() != 24: + print "Stopping because 2-division of P is too small" + print "" + continue + + div_pol_4 = E.division_polynomial(4) + + #if div_pol_4.splitting_field('zz').degree() < 48: + # print "Stopping because splitting field of div_pol_4 < 48" + # exit() + + K_4 = extended_field( div_pol_4, A, B, 96 ) + print "4-division field:", K_4 + + if K_4.degree() != 96: + print "Stopping because mod 4 representation not surjective" + print "" + continue + + if len(f_P.roots(ring=K_4)) == 0: + print "Stopping because M is not contained in K_4" + print "" + continue + + print "----------------" + print "|Example Found!|" + print "----------------" + L.append((A,B)) + + print "*************************" + print "" -- cgit v1.3