aboutsummaryrefslogtreecommitdiff
path: root/misc_code/2_division_withparisplit.sage
diff options
context:
space:
mode:
Diffstat (limited to 'misc_code/2_division_withparisplit.sage')
-rwxr-xr-xmisc_code/2_division_withparisplit.sage122
1 files changed, 122 insertions, 0 deletions
diff --git a/misc_code/2_division_withparisplit.sage b/misc_code/2_division_withparisplit.sage
new file mode 100755
index 0000000..349ea95
--- /dev/null
+++ b/misc_code/2_division_withparisplit.sage
@@ -0,0 +1,122 @@
1
2R1.<x> = PolynomialRing(QQ)
3R2.<x,y> = PolynomialRing(QQ)
4
5def 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 pol = pari(R1(res*f)).nfsplitting(deg_mult)
30 K.<b> = NumberField(g)
31
32 return K
33
34L = []
35
36for A in range(1,9):
37 for B in range(1,9):
38
39 print "Current list of examples:", len(L), "elements. List:"
40 print L
41
42 E = EllipticCurve([0,0,0,A,B])
43 print "*************************"
44 print E
45 print "of rank ", E.rank(), "with (some) points of infinite order:", E.gens()
46 print "CM:", E.has_cm()
47
48 rep = E.galois_representation()
49 print "mod 2 rep is surjective:", rep.is_surjective(2)
50
51 if E.rank() == 0:
52 print "Stopping because rank 0"
53 print ""
54 continue
55 if len(E.gens()) == 0:
56 print "Stopping because no points of infinite order found"
57 print ""
58 continue
59 if E.has_cm():
60 print "Stopping because CM"
61 print ""
62 print ""
63 continue
64 if not rep.is_surjective(2):
65 print "Stopping because mod 2 rep is not surjective"
66 print ""
67 continue
68
69 K_2.<a> = E.division_field(2)
70 print "2-division field:", K_2
71 P = E(0)
72 flag = False
73 for P in E.gens():
74 if len(P.division_points(2)) == 0:
75 flag = True
76 break
77 if not flag:
78 print "Stopping because the points found are 2-divisible"
79 print ""
80 continue
81 print "Taking the 2-division of P =", P
82
83 # The following polynomial is derived from the duplication formula
84 # (Silverman, p.54) using the x-coordinate of the 2-division point as
85 # an indeterminate.x
86 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])
87 #print f_P.roots()
88
89 M = extended_field( f_P, A, B, 24 ) # The 2-division field of P
90 print "2-division field of P:", M
91
92 if M.degree() != 24:
93 print "Stopping because 2-division of P is too small"
94 print ""
95 continue
96
97 div_pol_4 = E.division_polynomial(4)
98
99 #if div_pol_4.splitting_field('zz').degree() < 48:
100 # print "Stopping because splitting field of div_pol_4 < 48"
101 # exit()
102
103 K_4 = extended_field( div_pol_4, A, B, 96 )
104 print "4-division field:", K_4
105
106 if K_4.degree() != 96:
107 print "Stopping because mod 4 representation not surjective"
108 print ""
109 continue
110
111 if len(f_P.roots(ring=K_4)) == 0:
112 print "Stopping because M is not contained in K_4"
113 print ""
114 continue
115
116 print "----------------"
117 print "|Example Found!|"
118 print "----------------"
119 L.append((A,B))
120
121 print "*************************"
122 print ""

Generated with cgit - Back to sebastiano.tronto.net