-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathelliptic_curve.m
More file actions
262 lines (237 loc) · 11 KB
/
Copy pathelliptic_curve.m
File metadata and controls
262 lines (237 loc) · 11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
/* L-FUNCTIONS OF ELLIPTIC CURVES OVER GLOBAL FUNCTION FIELDS
Let E be an elliptic curve over the global function field k(t) of the projective
line over a finite field k of size q, with a unique place at infinity 1 / t. The
motive h^1(E)(1) associated to E is self dual with w(E) := w(h^1(E)(1)) = 1,
whose l-adic realisation is the dual H_l(E) of the two-dimensional l-adic
rational Tate module of E. This has geometric Galois invariants precisely when E
is a constant elliptic curve arising as the base change of some base elliptic
curve E' over k, in which case the formal L-function L(E, T) of E is precisely
1 / Q(T) Q(q T), where Q(T) is the numerator of the zeta-function of E'.
In general, the local Euler factor L_v(E, T) of E at a place v of k(t) depends
on the reduction E_v of a model of E that is minimal at v. If E has good
reduction at v, then the trace of Frobenius a_v(E) at v acting on H_l(E) is
1 - #E_v + q_v, where q_v is the size of the residue field at v, in which case
L_v(E, T) is given by 1 - a_v(E) T + q_v T^2. Otherwise, a_v(E) is 1 if the
reduction is split multiplicative, -1 if it is non-split multiplicative, and 0
if it is additive, in which case L_v(E, T) is given by 1 - a_v(E) T.
It remains to compute the global root number e(E) := e(h^1(E)(1)) of E in the
functional equation L(E, T) = e(E) q^(d(E)) T^(d(E)) L(E, 1 / q^2 T), where
d(E) := d(h^1(E)(1)) is deg f(h^1(E)(1)) - 4. This is the product of local root
numbers e_v(E) of the places v of k(t) where E has bad reduction, with explicit
formulae in terms of Kronecker symbols (-, q_v) when the characteristic is
different from 2 and 3. If the reduction is potentially good, then the greatest
common divisor g_v(E) between 12 and the valuation of the discriminant of E_v
can only take the values 2, 3, 4, 6, 12, and in particular e_v(E) is 1 if
g_v(E) = 12, (-3, q_v) if g_v(E) = 4, (-2, q_v) if g_v(E) = 3, and (-1, q_v)
otherwise. Otherwise, e_v(E) is -1 if the reduction is split multiplicative, 1
if it is non-split multiplicative, and (-1, q_v) if it is additive.
This file defines some intrinsics that compute the formal L-function of E. This
includes generalised traces of Frobenius, local Euler factors, and root numbers.
*/
function ConductorProductWithLI(E, LIs)
K<t> := BaseRing(E);
return &*[Minimum(LI[1]) ^ LI[3] : LI in LIs | Minimum(LI[1]) ne 1 / t];
end function;
intrinsic ConductorProduct(E :: CrvEll[FldFunRat[FldFin]]) -> RngUPolElt[FldFin]
{ The conductor of an elliptic curve E over k(t) as an element of k[t]. This is
the finite product of all of the prime elements of k[t] raised to the power of
their local conductor exponents. }
return ConductorProductWithLI(E, LocalInformation(E));
end intrinsic;
function TraceOfFrobeniusWithLI(E, LIs, v)
K<t> := BaseRing(E);
k<a> := BaseRing(K);
for LI in LIs do
if K ! v eq Minimum(LI[1]) then
return ReductionType(LI[5])[1] eq "A" select 0
else LI[6] select 1 else -1;
end if;
end for;
if v ne 1 / t then
return TraceOfFrobenius(E, Numerator(v));
end if;
_, E := LocalInformation(E, 1 / t);
invariants := [];
for i := 1 to 5 do
invariants[i] := Evaluate(hom<K -> K | 1 / t>(aInvariants(E)[i]), 0);
end for;
return 1 - #EllipticCurve(invariants) + #BaseRing(K);
end function;
intrinsic TraceOfFrobenius(E :: CrvEll[FldFunRat[FldFin]],
v :: FldFunRatUElt[FldFin]) -> RngIntElt
{ The trace of Frobenius a_v(E) for the reduction of an elliptic curve E over
k(t) at a place v of k(t), which must either be a prime element of k[t] or
1 / t. This is 1 if it is split multiplicative, -1 if it is non-split
multiplicative, and 0 if it is additive. }
K<t> := BaseRing(E);
require Denominator(v) eq 1 or v eq 1 / t:
"The place v is neither an element of k[t] nor 1 / t.";
return TraceOfFrobeniusWithLI(E, LocalInformation(E), v);
end intrinsic;
intrinsic TraceOfFrobenius(E :: CrvEll[FldFunRat[FldFin]], v :: PlcFunElt)
-> RngIntElt
{ The trace of Frobenius a_v(E) for the reduction of an elliptic curve E over
k(t) at a place v of k(t). This is 1 if it is split multiplicative, -1 if it
is non-split multiplicative, and 0 if it is additive. }
K<t> := BaseRing(E);
return TraceOfFrobenius(E, K ! Minimum(v));
end intrinsic;
intrinsic TraceOfFrobenius(E :: CrvEll[FldFunRat[FldFin]]) -> RngIntElt
{ The trace of Frobenius a_v(E) for the reduction of an elliptic curve E over
k(t) at v = 1 / t. This is 1 if it is split multiplicative, -1 if it is
non-split multiplicative, and 0 if it is additive. }
K<t> := BaseRing(E);
return TraceOfFrobenius(E, 1 / t);
end intrinsic;
function EulerFactorWithLI(E, LIs, v, D, P)
R<T> := PolynomialRing(IntegerRing());
if P lt D then
return R ! 1;
end if;
T_D := T ^ D;
if P lt 2 * D then
return 1 - TraceOfFrobeniusWithLI(E, LIs, v) * T_D;
end if;
K<t> := BaseRing(E);
k<a> := BaseRing(K);
for LI in LIs do
if K ! v eq Minimum(LI[1]) then
return 1 - TraceOfFrobeniusWithLI(E, LIs, v) * T_D;
end if;
end for;
return 1 - TraceOfFrobeniusWithLI(E, LIs, v) * T_D + #k ^ D * T_D ^ 2;
end function;
intrinsic EulerFactor(E :: CrvEll[FldFunRat[FldFin]], v :: Any : Exponent := 1,
Precision := Infinity()) -> RngUPolElt[RngInt]
{ The Euler factor L_v(E, T^D) of an elliptic curve E over k(t) at a place v of
k(t), which must either be a prime element of k[t] or 1 / t, where D is some
Exponent. If Precision is set to be finite, then this is truncated to a
polynomial of degree at most Precision. By default, Exponent is set to be 1
and Precision is set to be infinity. }
K<t> := BaseRing(E);
require IsCoercible(K, v): "The place v is not an element of k(t).";
v := K ! v;
require Denominator(v) eq 1 or v eq 1 / t:
"The place v is neither an element of k[t] nor 1 / t.";
requirege Exponent, 0;
return EulerFactorWithLI(E, LocalInformation(E), v, Exponent, Precision);
end intrinsic;
intrinsic EulerFactor(E :: CrvEll[FldFunRat[FldFin]] : Exponent := 1,
Precision := Infinity()) -> RngUPolElt[RngInt]
{ The Euler factor L_v(E, T^D) of an elliptic curve E over k(t) at v = 1 / t,
where D is some Exponent. If Precision is set to be finite, then this is
truncated to a polynomial of degree at most Precision. By default, Exponent is
set to be 1 and Precision is set to be infinity. }
K<t> := BaseRing(E);
return EulerFactor(E, 1 / t : Exponent := 1, Precision := Precision);
end intrinsic;
function EulerFactorsWithLI(E, LIs, D)
K<t> := BaseRing(E);
k<a> := BaseRing(K);
S := [PolynomialRing(IntegerRing()) | ];
if D gt 0 then
Append(~S, EulerFactorWithLI(E, LIs, 1 / t, 1, D));
end if;
for i := 1 to D do
for v in AllIrreduciblePolynomials(k, i) do
Append(~S, EulerFactorWithLI(E, LIs, K ! v, Degree(v), D));
end for;
end for;
return S;
end function;
intrinsic EulerFactors(E :: CrvEll[FldFunRat[FldFin]], D :: RngIntElt)
-> SeqEnum[RngUPolElt[RngInt]]
{ The finite set of all Euler factors of an elliptic curve E over k(t) at all
places of k(t) of degree at most D. }
requirege D, 0;
return EulerFactorsWithLI(E, LocalInformation(E), D);
end intrinsic;
function LocalRootNumberWithLI(E, LI)
K<t> := BaseRing(E);
k<a> := BaseRing(K);
d := Degree(LI[1]);
if Valuation(jInvariant(E), LI[1]) ge 0 then
g := GCD(LI[2], 12);
return g eq 12 select 1 else
KroneckerSymbol(g eq 4 select -3 else g eq 3 select -2 else -1, #k) ^ d;
else
return ReductionType(LI[5])[1] eq "A" select KroneckerSymbol(-1, #k) ^ d
else LI[6] select -1 else 1;
end if;
end function;
intrinsic LocalRootNumber(E :: CrvEll[FldFunRat[FldFin]], v :: Any) -> RngIntElt
{ The local root number e_v(E) of an elliptic curve E over k(t) at a place v of
k(t), which must either be a prime element of k[t] or 1 / t. Note that this
has not been implemented for characteristic 2 and 3. }
K<t> := BaseRing(E);
require Characteristic(K) gt 3:
"This has not been implemented for characteristic 2 and 3.";
require IsCoercible(K, v): "The place v is not an element of k(t).";
v := K ! v;
require Denominator(v) eq 1 or v eq 1 / t:
"The place v is neither an element of k[t] nor 1 / t.";
return LocalRootNumberWithLI(E, LocalInformation(E, v));
end intrinsic;
intrinsic LocalRootNumber(E :: CrvEll[FldFunRat[FldFin]]) -> RngIntElt
{ The local root number e_v(E) of an elliptic curve E over k(t) at v = 1 / t.
Note that this has not been implemented for characteristic 2 and 3. }
K<t> := BaseRing(E);
return LocalRootNumber(E, 1 / t);
end intrinsic;
function RootNumberWithLI(E, LIs)
return &*[IntegerRing() | LocalRootNumberWithLI(E, LI) : LI in LIs];
end function;
intrinsic RootNumber(E :: CrvEll[FldFunRat[FldFin]]) -> RngIntElt
{ The global root number e(E) of an elliptic curve E over k(t). Note that this
has not been implemented for characteristic 2 and 3. }
K<t> := BaseRing(E);
require Characteristic(K) gt 3:
"This has not been implemented for characteristic 2 and 3.";
return RootNumberWithLI(E, LocalInformation(E));
end intrinsic;
function LDegreeWithLI(E, LIs)
return &+[IntegerRing() | Degree(LI[1]) * LI[3] : LI in LIs] - 4;
end function;
intrinsic LDegree(E :: CrvEll[FldFunRat[FldFin]]) -> RngIntElt
{ The value deg P(E, T) - deg Q(E, T) for an elliptic curve E over k(t) with
formal L-function L(E, T) such that L(E, T) Q(E, T) = P(E, T) for some
univariate polynomials P(E, T) and Q(E, T) over k. }
return LDegreeWithLI(E, LocalInformation(E));
end intrinsic;
function EpsilonFactorWithLI(E, LIs)
K<t> := BaseRing(E);
return RootNumberWithLI(E, LIs) * #BaseRing(K) ^ LDegreeWithLI(E, LIs);
end function;
intrinsic EpsilonFactor(E :: CrvEll[FldFunRat[FldFin]]) -> RngIntElt
{ The epsilon factor e(E) q^(d(E)) of an elliptic curve E over k(t). Note that
this has not been implemented for characteristic 2 and 3. }
return EpsilonFactorWithLI(E, LocalInformation(E));
end intrinsic;
intrinsic LFunction_(E :: CrvEll[FldFunRat[FldFin]] :
FunctionalEquation := true) -> RngUPolElt[RngInt]
{ The formal L-function L(E, T) of an elliptic curve E over k(t). If E is a
constant elliptic curve arising as the base change of some base elliptic
curve E' over k, then this is 1 / Q(T) Q(q T), where Q(T) is the numerator of
the zeta-function of E'. Otherwise, if the FunctionalEquation
L(E, T) = e(E) q^(d(E)) T^(d(E)) L(E, 1 / q^2 T) is true, then the necessary
computation is decreased significantly. By default, FunctionalEquation is set
to be true, but this has not been implemented for characteristic 2 and 3. }
constant, E_ := IsConstantCurve(E);
if constant then
L<T> := LPolynomial(E_);
return 1 / (L * Evaluate(L, #BaseRing(E_) * T));
end if;
K<t> := BaseRing(E);
LIs := LocalInformation(E);
D := LDegreeWithLI(E, LIs);
if FunctionalEquation then
require Characteristic(K) gt 3:
"This has not been implemented for characteristic 2 and 3.";
return LFunction(EulerFactorsWithLI(E, LIs, Floor(D / 2)), D :
FunctionalEquation := true,
EpsilonFactor := EpsilonFactorWithLI(E, LIs),
WeightFactor := 1 / #BaseRing(K) ^ 2, DualAutomorphism := func<x | x>);
else
return LFunction(EulerFactorsWithLI(E, LIs, D), D);
end if;
end intrinsic;