aboutsummaryrefslogtreecommitdiff
path: root/misc_code/2_division_onecurve.sage
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2026-06-14 09:58:21 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2026-06-14 09:58:21 +0200
commit5ea79c7ae0d44686f1df05c4a016652afbe58968 (patch)
tree05f6a052373f5fe0942777a48303b2f8b884cbe1 /misc_code/2_division_onecurve.sage
downloadkummer-notes-code-5ea79c7ae0d44686f1df05c4a016652afbe58968.tar.gz
kummer-notes-code-5ea79c7ae0d44686f1df05c4a016652afbe58968.zip
Initial commit
Diffstat (limited to 'misc_code/2_division_onecurve.sage')
-rwxr-xr-xmisc_code/2_division_onecurve.sage101
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
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 #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
34A = -3
35B = 17/4
36
37E = EllipticCurve([0,0,0,A,B])
38print "*************************"
39print E
40print "of rank ", E.rank(), "with (some) points of infinite order:", E.gens()
41print "CM:", E.has_cm()
42
43rep = E.galois_representation()
44print "mod 2 rep is surjective:", rep.is_surjective(2)
45
46if E.rank() == 0:
47 print "Stopping because rank 0"
48 exit()
49if len(E.gens()) == 0:
50 print "Stopping because no points of infinite order found"
51 exit()
52if E.has_cm():
53 print "Stopping because CM"
54 print ""
55 exit()
56if not rep.is_surjective(2):
57 print "Stopping because mod 2 rep is not surjective"
58 exit()
59
60K_2.<a> = E.division_field(2)
61print "2-division field:", K_2
62P = E(0)
63flag = False
64for P in E.gens():
65 if len(P.division_points(2)) == 0:
66 flag = True
67 break
68if not flag:
69 print "Stopping because the points found are 2-divisible"
70 exit()
71print "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
76f_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
78M = extended_field( f_P, A, B, 24 ) # The 2-division field of P
79print "2-division field of P:", M
80
81if M.degree() != 24:
82 print "Stopping because 2-division of P is too small"
83 exit()
84
85K_4 = extended_field( E.division_polynomial(4), A, B, 96 )
86print "4-division field:", K_4
87
88if K_4.degree() != 96:
89 print "Stopping because mod 4 representation not surjective"
90 exit()
91
92if len(f_P.roots(ring=K_4)) == 0:
93 print "Stopping because E is not contained in K_4"
94 exit()
95
96print "----------------"
97print "|Example Found!|"
98print "----------------"
99
100print "*************************"
101print ""

Generated with cgit - Back to sebastiano.tronto.net