diff options
Diffstat (limited to 'misc_code/2_division_onecurve.sage')
| -rwxr-xr-x | misc_code/2_division_onecurve.sage | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/misc_code/2_division_onecurve.sage b/misc_code/2_division_onecurve.sage new file mode 100755 index 0000000..9cb7043 --- /dev/null +++ b/misc_code/2_division_onecurve.sage | |||
| @@ -0,0 +1,101 @@ | |||
| 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 | #print "Splitting field of division pol:" | ||
| 28 | #print R1(f).splitting_field('r') | ||
| 29 | K.<b> = (R1(res*f)).splitting_field(degree_multiple=deg_mult) | ||
| 30 | |||
| 31 | return K | ||
| 32 | |||
| 33 | |||
| 34 | A = -3 | ||
| 35 | B = 17/4 | ||
| 36 | |||
| 37 | E = EllipticCurve([0,0,0,A,B]) | ||
| 38 | print "*************************" | ||
| 39 | print E | ||
| 40 | print "of rank ", E.rank(), "with (some) points of infinite order:", E.gens() | ||
| 41 | print "CM:", E.has_cm() | ||
| 42 | |||
| 43 | rep = E.galois_representation() | ||
| 44 | print "mod 2 rep is surjective:", rep.is_surjective(2) | ||
| 45 | |||
| 46 | if E.rank() == 0: | ||
| 47 | print "Stopping because rank 0" | ||
| 48 | exit() | ||
| 49 | if len(E.gens()) == 0: | ||
| 50 | print "Stopping because no points of infinite order found" | ||
| 51 | exit() | ||
| 52 | if E.has_cm(): | ||
| 53 | print "Stopping because CM" | ||
| 54 | print "" | ||
| 55 | exit() | ||
| 56 | if not rep.is_surjective(2): | ||
| 57 | print "Stopping because mod 2 rep is not surjective" | ||
| 58 | exit() | ||
| 59 | |||
| 60 | K_2.<a> = E.division_field(2) | ||
| 61 | print "2-division field:", K_2 | ||
| 62 | P = E(0) | ||
| 63 | flag = False | ||
| 64 | for P in E.gens(): | ||
| 65 | if len(P.division_points(2)) == 0: | ||
| 66 | flag = True | ||
| 67 | break | ||
| 68 | if not flag: | ||
| 69 | print "Stopping because the points found are 2-divisible" | ||
| 70 | exit() | ||
| 71 | print "Taking the 2-division of P =", P | ||
| 72 | |||
| 73 | # The following polynomial is derived from the duplication formula | ||
| 74 | # (Silverman, p.54) using the x-coordinate of the 2-division point as | ||
| 75 | # an indeterminate.x | ||
| 76 | 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]) | ||
| 77 | |||
| 78 | M = extended_field( f_P, A, B, 24 ) # The 2-division field of P | ||
| 79 | print "2-division field of P:", M | ||
| 80 | |||
| 81 | if M.degree() != 24: | ||
| 82 | print "Stopping because 2-division of P is too small" | ||
| 83 | exit() | ||
| 84 | |||
| 85 | K_4 = extended_field( E.division_polynomial(4), A, B, 96 ) | ||
| 86 | print "4-division field:", K_4 | ||
| 87 | |||
| 88 | if K_4.degree() != 96: | ||
| 89 | print "Stopping because mod 4 representation not surjective" | ||
| 90 | exit() | ||
| 91 | |||
| 92 | if len(f_P.roots(ring=K_4)) == 0: | ||
| 93 | print "Stopping because E is not contained in K_4" | ||
| 94 | exit() | ||
| 95 | |||
| 96 | print "----------------" | ||
| 97 | print "|Example Found!|" | ||
| 98 | print "----------------" | ||
| 99 | |||
| 100 | print "*************************" | ||
| 101 | print "" | ||
