Pari/GP Reference Documentation | Contents - Global index - GP keyboard shortcuts |
Elliptic curve structures Reduction ell2cover ellL1 elladd ellak ellan ellanalyticrank ellap ellbil ellbsd ellcard ellchangecurve ellchangepoint ellchangepointinv ellconvertname elldivpol elleisnum elleta ellformaldifferential ellformalexp ellformallog ellformalpoint ellformalw ellfromeqn ellfromj ellgenerators ellglobalred ellgroup ellheegner ellheight ellheightmatrix ellidentify ellinit ellintegralmodel elliscm ellisdivisible ellisisom ellisogeny ellisogenyapply ellisomat ellisoncurve ellisotree ellissupersingular ellj elllocalred elllog elllseries ellmaninconstant ellminimaldisc ellminimalmodel ellminimaltwist ellmoddegree ellmodulareqn ellmul ellneg ellnonsingularmultiple ellorder ellordinate ellpadicL ellpadicbsd ellpadicfrobenius ellpadicheight ellpadicheightmatrix ellpadiclambdamu ellpadiclog ellpadicregulator ellpadics2 ellperiods ellpointtoz ellpow ellrank ellrankinit ellratpoints ellrootno ellsaturation ellsea ellsearch ellsigma ellsub ellsupersingularj elltamagawa elltaniyama elltatepairing elltors elltrace elltwist ellweilcurve ellweilpairing ellwp ellxn ellzeta ellztopoint genus2igusa genus2red hyperellchangecurve hyperellcharpoly hyperelldisc hyperellisoncurve hyperellminimaldisc hyperellminimalmodel hyperellordinate hyperellpadicfrobenius hyperellratpoints hyperellred | |
Elliptic curve structures | |
An elliptic curve is given by a Weierstrass model y2 + a1 xy + a3 y = x3 + a2 x2 + a4 x + a6, whose discriminant is nonzero. One can also define an elliptic curve with a y2 = x3 + a4 x + a6. Affine points on
Given a vector of coefficients [a1,a2,a3,a4,a6] or [a4,a6], the function
All domains.
*
*
*
*
* These are used as follows:
? E = ellinit([0,0,0, a4,a6]); ? E.b4 %2 = 2*a4 ? E.disc %3 = -64*a4^3 - 432*a6^2 Curves over ℂ.
This in particular includes curves defined over ℚ. All member functions in
this section return data, as it is currently stored in the structure, if
present; and otherwise compute it to the default accuracy, that was fixed
at the time of ellinit (via a
*
*
*
* Warning. As for the orientation of the basis of the period lattice, beware that many sources use the inverse convention where ω2/ω1 has positive imaginary part and our ω2 is the negative of theirs. Our convention τ = ω1/ω2 ensures that the action of PSL2 is the natural one: [a,b;c,d].τ = (aτ+b)/(cτ+d) = (a ω1 + bω2)/(cω1 + dω2), instead of a twisted one. (Our τ is -1/τ in the above inverse convention.) Curves over ℚp.
We advise to input a model defined over ℚ for such curves. In any case,
if you input an approximate model with For the time being only curves with multiplicative reduction (split or nonsplit), i.e. vp(j) < 0, are supported by nontrivial functions. In this case the curve is analytically isomorphic to ℚp*/qℤ := Eq(ℚp), for some p-adic integer q (the Tate period). In particular, we have j(q) = j(E).
*
*
* Curves over 𝔽q.
*
*
*
*
* Curves over ℚ. All functions should return a correct result, whether the model is minimal or not, but it is a good idea to stick to minimal models whenever gcd(c4,c6) is easy to factor (minor speed-up). The construction
E = ellminimalmodel(E0, &v) replaces the original model E0 by a minimal model E, and the variable change v allows to go between the two models:
ellchangepoint(P0, v) ellchangepointinv(P, v) respectively map the point P0 on E0 to its image on E, and the point P on E to its pre-image on E0.
A few routines — namely
* Curves over number fields.
*
*
*
| |
Reduction | |
Let E be a curve defined over ℚp given by a p-integral model; if the curve has good reduction at p, we may define its reduction ~{E} over the finite field 𝔽p:
? E = ellinit([-3,1], O(5^10)); \\ E/ℚ5 ? Et = ellinit(E, 5) ? ellcard(Et) \\ ~{E}/𝔽5 has 7 points %3 = 7 ? ellinit(E, 7) *** at top-level: ellinit(E,7) *** ^ — — — — *** ellinit: inconsistent moduli in ellinit: 5 != 7 Likewise, if a curve is defined over a number field K and 𝔭 is a maximal ideal with finite residue field 𝔽q, we define the reduction ~{E}/𝔽q provided E has good reduction at 𝔭. E/ℚ is an important special case:
? E = ellinit([-3,1]); ? factor(E.disc) %2 = [2 4] [3 4] ? Et = ellinit(E, 5); ? ellcard(Et) \\ ~{E} / 𝔽5 has 7 points %4 = 7 ? ellinit(E, 3) \\ bad reduction at 3 %5 = [] General number fields are similar:
? K = nfinit(x^2+1); E = ellinit([x,x+1], K); ? idealfactor(K, E.disc) \\ three primes of bad reduction %2 = [ [2, [1, 1]~, 2, 1, [1, -1; 1, 1]] 10] [ [5, [-2, 1]~, 1, 1, [2, -1; 1, 2]] 2] [[5, [2, 1]~, 1, 1, [-2, -1; 1, -2]] 2] ? P = idealprimedec(K, 3); \\ a prime of good reduction ? idealnorm(K, P) %4 = 9 ? Et = ellinit(E, P); ? ellcard(Et) \\ ~{E} / 𝔽9 has 4 points %6 = 4
If the model is not locally minimal at 𝔭, the above will fail:
Some functions such as
| |
ell2cover(E) | |
If E is an elliptic curve over ℚ, returns a basis of the set of
everywhere locally soluble 2-covers of the curve E.
For each cover a pair [R,P] is returned where y2-R(x) is a quartic curve
and P is a point on E(k), where k = ℚ(x)[y] / (y2-R(x)).
E can also be given as the output of
? E = ellinit([-25,4]); ? C = ell2cover(E); #C %2 = 2 ? [R,P] = C[1]; R %3 = 64*x^4+480*x^2-128*x+100 ? P[1] %4 = -320/y^2*x^4 + 256/y^2*x^3 + 800/y^2*x^2 - 320/y^2*x - 436/y^2 ? ellisoncurve(E, Mod(P, y^2-R)) %5 = 1 ? H = hyperellratpoints(R,10) %6 = [[0,10], [0,-10], [1/5,242/25], [1/5,-242/25], [2/5,282/25], [2/5,-282/25]] ? A = substvec(P,[x,y],H[1]) %7 = [-109/25, 686/125]
The library syntax is
| |
ellL1(E, {r = 0}) | |
Returns the value at s = 1 of the derivative of order r of the L-function of the elliptic curve E/ℚ.
? E = ellinit("11a1"); \\ order of vanishing is 0 ? ellL1(E) %2 = 0.2538418608559106843377589233 ? E = ellinit("389a1"); \\ order of vanishing is 2 ? ellL1(E) %4 = -5.384067311837218089235032414 E-29 ? ellL1(E, 1) %5 = 0 ? ellL1(E, 2) %6 = 1.518633000576853540460385214
The main use of this function, after computing at low accuracy the
order of vanishing using
? \p18 realprecision = 18 significant digits ? E = ellinit("5077a1"); ellanalyticrank(E) time = 8 ms. %1 = [3, 10.3910994007158041] ? \p200 realprecision = 202 significant digits (200 digits displayed) ? ellL1(E, 3) time = 104 ms. %3 = 10.3910994007158041387518505103609170697263563756570092797 [...]
Analogous and more general functionalities for E
defined over general number fields are available through
The library syntax is
| |
elladd(E, z1, z2) | |
Sum of the points z1 and z2 on the elliptic curve corresponding to E.
The library syntax is
| |
ellak(E, n) | |
Computes the coefficient an of the L-function of the elliptic curve
E/ℚ, i.e. coefficients of a newform of weight 2 by the modularity theorem
(Taniyama-Shimura-Weil conjecture). E must be an
? E = ellinit([1,-1,0,4,3]); ? ellak(E, 10) %2 = -3 ? e = ellchangecurve(E, [1/5,0,0,0]); \\ made not minimal at 5 ? ellak(e, 10) \\ wasteful but works %3 = -3 ? E = ellminimalmodel(e); \\ now minimal ? ellak(E, 5) %5 = -3 If the model is not minimal at a number of bad primes, then the function will be slower on those n divisible by the bad primes. The speed should be comparable for other n:
? for(i=1,10^6, ellak(E,5)) time = 699 ms. ? for(i=1,10^6, ellak(e,5)) \\ 5 is bad, markedly slower time = 1,079 ms. ? for(i=1,10^5,ellak(E,5*i)) time = 1,477 ms. ? for(i=1,10^5,ellak(e,5*i)) \\ still slower but not so much on average time = 1,569 ms.
The library syntax is
| |
ellan(E, n) | |
Computes the vector of the first n Fourier coefficients ak corresponding to the elliptic curve E defined over a number field. If E is defined over ℚ, the curve may be given by an arbitrary model, not necessarily minimal, although a minimal model will make the function faster. Over a more general number field, the model must be locally minimal at all primes above 2 and 3.
The library syntax is
| |
ellanalyticrank(E, {eps}) | |
Returns the order of vanishing at s = 1 of the L-function of the
elliptic curve E/ℚ and the value of the first nonzero derivative. To
determine this order, it is assumed that any value less than
? E = ellinit("11a1"); \\ rank 0 ? ellanalyticrank(E) %2 = [0, 0.2538418608559106843377589233] ? E = ellinit("37a1"); \\ rank 1 ? ellanalyticrank(E) %4 = [1, 0.3059997738340523018204836835] ? E = ellinit("389a1"); \\ rank 2 ? ellanalyticrank(E) %6 = [2, 1.518633000576853540460385214] ? E = ellinit("5077a1"); \\ rank 3 ? ellanalyticrank(E) %8 = [3, 10.39109940071580413875185035]
Analogous and more general functionalities for E
defined over general number fields are available through
The library syntax is
| |
ellap(E, {p}) | |
Let For other fields of definition and p defining a finite residue field 𝔽q, return the trace of Frobenius for the reduction of E: the argument p is best left omitted if K = ℚℓ (else we must have p = ℓ) and must be a prime number (K = ℚ) or prime ideal (K a general number field) with residue field 𝔽q otherwise. The equation need not be minimal or even integral at p; of course, a minimal model will be more efficient. For a number field K, the trace of Frobenius is the ap coefficient in the Euler product defining the curve L-series, whence the function name: L(E/K,s) = ∏bad p (1-ap (Np)-s)-1 ∏good p (1-ap (Np)-s + (Np)1-2s)-1.
When the characteristic of the finite field is large, the availability of
the
? E = ellinit([0,1]); \\ y^2 = x^3 + 0.x + 1, defined over Q ? ellap(E, 7) \\ 7 necessary here %2 = -4 \\ #E(F7) = 7+1-(-4) = 12 ? ellcard(E, 7) %3 = 12 \\ OK ? E = ellinit([0,1], 11); \\ defined over F_11 ? ellap(E) \\ no need to repeat 11 %4 = 0 ? ellap(E, 11) \\ ... but it also works %5 = 0 ? ellgroup(E, 13) \\ ouch, inconsistent input! *** at top-level: ellap(E,13) *** ^ — — — -- *** ellap: inconsistent moduli in Rg_to_Fp: 11 13 ? a = ffgen(ffinit(11,3), 'a); \\ defines Fq := F11^3 ? E = ellinit([a+1,a]); \\ y^2 = x^3 + (a+1)x + a, defined over Fq ? ellap(E) %8 = -3
If the curve is defined over a more general number field than ℚ,
the maximal ideal p must be explicitly given in
? K = nfinit(a^2+1); E = ellinit([1+a,0,1,0,0], K); ? fa = idealfactor(K, E.disc) %2 = [ [5, [-2, 1]~, 1, 1, [2, -1; 1, 2]] 1] [[13, [5, 1]~, 1, 1, [-5, -1; 1, -5]] 2] ? ellap(E, fa[1,1]) %3 = -1 \\ nonsplit multiplicative reduction ? ellap(E, fa[2,1]) %4 = 1 \\ split multiplicative reduction ? P17 = idealprimedec(K,17)[1]; ? ellap(E, P17) %6 = 6 \\ good reduction ? E2 = ellchangecurve(E, [17,0,0,0]); ? ellap(E2, P17) %8 = 6 \\ same, starting from a nonminimal model ? P3 = idealprimedec(K,3)[1]; ? ellap(E, P3) \\ OK: E is minimal at P3 %10 = -2 ? E3 = ellchangecurve(E, [3,0,0,0]); ? ellap(E3, P3) \\ not integral at P3 *** at top-level: ellap(E3,P3) *** ^ — — — — *** ellap: impossible inverse in Rg_to_ff: Mod(0, 3).
Algorithms used. If E/𝔽q has CM by a principal imaginary
quadratic order we use a fast explicit formula (involving essentially
Kronecker symbols and Cornacchia's algorithm), in O(log q)2 bit
operations.
Otherwise, we use Shanks-Mestre's baby-step/giant-step method, which runs in
time Õ(q1/4) using Õ(q1/4) storage, hence becomes
unreasonable when q has about 30 digits. Above this range, the
The library syntax is
| |
ellbil(E, z1, z2) | |
Deprecated alias for
The library syntax is
| |
ellbsd(E) | |
E being an elliptic curve over a number field, returns a real number c such that the Birch and Swinnerton-Dyer conjecture predicts that LE(r)(1)/r! = c R S, where r is the rank, R the regulator and S the cardinal of the Tate-Shafarevich group.
? e = ellinit([0,-1,1,-10,-20]); \\ rank 0 ? ellbsd(e) %2 = 0.25384186085591068433775892335090946105 ? lfun(e,1) %3 = 0.25384186085591068433775892335090946104 ? e = ellinit([0,0,1,-1,0]); \\ rank 1 ? P = ellheegner(e); ? ellbsd(e)*ellheight(e,P) %6 = 0.30599977383405230182048368332167647445 ? lfun(e,1,1) %7 = 0.30599977383405230182048368332167647445 ? e = ellinit([1+a,0,1,0,0],nfinit(a^2+1)); \\ rank 0 ? ellbsd(e) %9 = 0.42521832235345764503001271536611593310 ? lfun(e,1) %10 = 0.42521832235345764503001271536611593309
The library syntax is
| |
ellcard(E, {p}) | |
Let
? E = ellinit([-3,1], 5); ellcard(E) %1 = 7 ? t = ffgen(3^5,'t); E = ellinit([t,t^2+1]); ellcard(E) %2 = 217 For other fields of definition and p defining a finite residue field 𝔽q, return the order of the reduction of E: the argument p is best left omitted if K = ℚℓ (else we must have p = ℓ) and must be a prime number (K = ℚ) or prime ideal (K a general number field) with residue field 𝔽q otherwise. The equation need not be minimal or even integral at p; of course, a minimal model will be more efficient. The function considers the group of nonsingular points of the reduction of a minimal model of the curve at p, so also makes sense when the curve has bad reduction.
? E = ellinit([-3,1]); ? factor(E.disc) %2 = [2 4] [3 4] ? ellcard(E, 5) \\ as above ! %3 = 7 ? ellcard(E, 2) \\ additive reduction %4 = 2
When the characteristic of the finite field is large, the availability of
the
The library syntax is
| |
ellchangecurve(E, v) | |
Changes the data for the elliptic curve E
by changing the coordinates using the vector
The library syntax is
| |
ellchangepoint(x, v) | |
Changes the coordinates of the point or
vector of points x using the vector
? E0 = ellinit([1,1]); P0 = [0,1]; v = [1,2,3,4]; ? E = ellchangecurve(E0, v); ? P = ellchangepoint(P0,v) %3 = [-2, 3] ? ellisoncurve(E, P) %4 = 1 ? ellchangepointinv(P,v) %5 = [0, 1]
The library syntax is
| |
ellchangepointinv(x, v) | |
Changes the coordinates of the point or vector of points x using
the inverse of the isomorphism attached to
? E0 = ellinit([1,1]); P0 = [0,1]; v = [1,2,3,4]; ? E = ellchangecurve(E0, v); ? P = ellchangepoint(P0,v) %3 = [-2, 3] ? ellisoncurve(E, P) %4 = 1 ? ellchangepointinv(P,v) %5 = [0, 1] \\ we get back P0
The library syntax is
| |
ellconvertname(name) | |
Converts an elliptic curve name, as found in the
? ellconvertname("123b1") %1 = [123, 1, 1] ? ellconvertname(%) %2 = "123b1"
The library syntax is
| |
elldivpol(E, n, {v = 'x}) | |
n-division polynomial fn for the curve E in the variable v. In standard notation, for any affine point P = (X,Y) on the curve and any integer n ≥ 0, we have [n]P = (φn(P)ψn(P) : ωn(P) : ψn(P)3) for some polynomials φn,ωn,ψn in ℤ[a1,a2,a3,a4,a6][X,Y]. We have fn(X) = ψn(X) for n odd, and fn(X) = ψn(X,Y) (2Y + a1X+a3) for n even. We have f0 = 0, f1 = 1, f2 = 4X3 + b2X2 + 2b4 X + b6, f3 = 3 X4 + b2 X3 + 3b4 X2 + 3 b6 X + b8, f4 = f2(2X6 + b2 X5 + 5b4 X4 + 10 b6 X3 + 10 b8 X2 + (b2b8-b4b6)X + (b8b4 - b62)), ... When n is odd, the roots of fn are the X-coordinates of the affine points in the n-torsion subgroup E[n]; when n is even, the roots of fn are the X-coordinates of the affine points in E[n] \ E[2] when n > 2, resp. in E[2] when n = 2. For n < 0, we define fn := - f-n.
The library syntax is
| |
elleisnum(w, k, {flag = 0}) | |
k being an even positive integer, computes the numerical value of the
Eisenstein series of weight k at the lattice w, as given by
(2i π/ω2)k (1 + 2/ζ(1-k) ∑n ≥ 1 nk-1qn / (1-qn)), where q = exp(2iπ τ) and τ := ω1/ω2 belongs to the
complex upper half-plane. It is also possible to directly input w =
[ω1,ω2], or an elliptic curve E as given by
? w = ellperiods([1,I]); ? elleisnum(w, 4) %2 = 2268.8726415508062275167367584190557607 ? elleisnum(w, 6) %3 = -3.977978632282564763 E-33 ? E = ellinit([1, 0]); ? elleisnum(E, 4) %5 = -48.000000000000000000000000000000000000 When flag is nonzero and k = 4 or 6, returns the elliptic invariants g2 or g3, such that y2 = 4x3 - g2 x - g3 is a Weierstrass equation for E.
? g2 = elleisnum(E, 4, 1) %6 = -4.0000000000000000000000000000000000000 ? g3 = elleisnum(E, 6, 1) \\ ~ 0 %7 = 0.E-114 - 3.909948178422242682 E-57*I
The library syntax is
| |
elleta(w) | |
Returns the quasi-periods [η1,η2]
attached to the lattice basis w = [ω1, ω2].
Alternatively, w can be an elliptic curve E as output by
? elleta([1, I]) %1 = [3.141592653589793238462643383, 9.424777960769379715387930149*I]
The library syntax is
| |
ellformaldifferential(E, {n = seriesprecision}, {t = 'x}) | |
Let ω := dx / (2y+a1x+a3) be the invariant differential form
attached to the model E of some elliptic curve (
? E = ellinit([-1,1/4]); [f,g] = ellformaldifferential(E,7,'t); ? f %2 = 1 - 2*t^4 + 3/4*t^6 + O(t^7) ? g %3 = t^-2 - t^2 + 1/2*t^4 + O(t^5)
The library syntax is
| |
ellformalexp(E, {n = seriesprecision}, {z = 'x}) | |
The elliptic formal exponential
? E=ellinit([-1,1/4]); Exp = ellformalexp(E,10,'z) %1 = z + 2/5*z^5 - 3/28*z^7 + 2/15*z^9 + O(z^11) ? L = ellformallog(E,10,'t); ? subst(Exp,z,L) %3 = t + O(t^11)
The library syntax is
| |
ellformallog(E, {n = seriesprecision}, {v = 'x}) | |
The formal elliptic logarithm is a series L in t K[[t]] such that d L = ω = dx / (2y + a1x + a3), the canonical invariant differential attached to the model E. It gives an isomorphism from the formal group of E to the additive formal group.
? E = ellinit([-1,1/4]); L = ellformallog(E, 9, 't) %1 = t - 2/5*t^5 + 3/28*t^7 + 2/3*t^9 + O(t^10) ? [f,g] = ellformaldifferential(E,8,'t); ? L' - f %3 = O(t^8)
The library syntax is
| |
ellformalpoint(E, {n = seriesprecision}, {v = 'x}) | |
If E is an elliptic curve, return the coordinates x(t), y(t) in the
formal group of the elliptic curve E in the formal parameter t = -x/y
at oo :
x = t-2 -a1 t-1 - a2 - a3 t +...
y = - t-3 -a1 t-2 - a2t-1 -a3 +...
Return n terms (
? E = ellinit([0,0,1,-1,0]); [x,y] = ellformalpoint(E,8,'t); ? x %2 = t^-2 - t + t^2 - t^4 + 2*t^5 + O(t^6) ? y %3 = -t^-3 + 1 - t + t^3 - 2*t^4 + O(t^5) ? E = ellinit([0,1/2]); ellformalpoint(E,7) %4 = [x^-2 - 1/2*x^4 + O(x^5), -x^-3 + 1/2*x^3 + O(x^4)]
The library syntax is
| |
ellformalw(E, {n = seriesprecision}, {t = 'x}) | |
Return the formal power series w attached to the elliptic curve E,
in the variable t:
w(t) = t3(1 + a1 t + (a2 + a12) t2 +...+ O(tn)),
which is the formal expansion of -1/y in the formal parameter t := -x/y
at oo (take n =
? E=ellinit([3,2,-4,-2,5]); ellformalw(E, 5, 't) %1 = t^3 + 3*t^4 + 11*t^5 + 35*t^6 + 101*t^7 + O(t^8)
The library syntax is
| |
ellfromeqn(P) | |
Given a genus 1 plane curve, defined by the affine equation f(x,y) = 0,
return the coefficients [a1,a2,a3,a4,a6] of a Weierstrass
equation for its Jacobian. This allows to recover a Weierstrass model for an
elliptic curve given by a general plane cubic or by a binary quartic or
biquadratic model. The function implements the f In the example below, the function is used to convert between twisted Edwards coordinates and Weierstrass coordinates.
? e = ellfromeqn(a*x^2+y^2 - (1+d*x^2*y^2)) %1 = [0, -a - d, 0, -4*d*a, 4*d*a^2 + 4*d^2*a] ? E = ellinit(ellfromeqn(y^2-x^2 - 1 +(121665/121666*x^2*y^2)),2^255-19); ? isprime(ellcard(E) / 8) %3 = 1 The elliptic curve attached to the sum of two cubes is given by
? ellfromeqn(x^3+y^3 - a) %1 = [0, 0, -9*a, 0, -27*a^2] Congruent number problem. Let n be an integer, if a2+b2 = c2 and a b = 2 n, then by substituting b by 2 n/a in the first equation, we get ((a2+(2 n/a)2)-c2) a2 = 0. We set x = a, y = a c.
? En = ellfromeqn((x^2 + (2*n/x)^2 - (y/x)^2)*x^2) %1 = [0, 0, 0, -16*n^2, 0] For example 23 is congruent since the curve has a point of infinite order, namely:
? ellheegner( ellinit(subst(En, n, 23)) ) %2 = [168100/289, 68053440/4913]
The library syntax is
| |
ellfromj(j) | |
Returns the coefficients [a1,a2,a3,a4,a6] of a fixed elliptic curve with j-invariant j. The given model is arbitrary; for instance, over the rationals, it is in general not minimal nor even integral.
? v = ellfromj(1/2) %1 = [0, 0, 0, 10365/4, 11937025/4] ? E = ellminimalmodel(ellinit(v)); E[1..5] %2 = [0, 0, 0, 41460, 190992400] ? F = ellminimalmodel(elltwist(E, 24)); F[1..5] %3 = [1, 0, 0, 72, 13822] ? [E.disc, F.disc] %4 = [-15763098924417024000, -82484842750] For rational j, the following program returns the integral curve of minimal discriminant and given j invariant:
ellfromjminimal(j)= { my(E = ellinit(ellfromj(j))); my(D = ellminimaltwist(E)); ellminimalmodel(elltwist(E,D)); } ? e = ellfromjminimal(1/2); e.disc %1 = -82484842750
Using flag = 1 in
The library syntax is
| |
ellgenerators(E) | |
If E is an elliptic curve over the rationals, return a ℤ-basis of the
free part of the Mordell-Weil group attached to E. This relies on
the
Caution. When the group is not cyclic, of shape ℤ/d1ℤ x
ℤ/d2ℤ with d2 | d1, the points [P,Q] returned by
ellgenerators need not have order d1 and d2: it is true that
P has order d1, but we only know that Q is a generator of
E(𝔽q)/ <P> and that the Weil pairing w(P,Q) has order d2,
see
The library syntax is
| |
ellglobalred(E) | |
Let E be an * N is the arithmetic conductor of the curve,
* v is an obsolete field, left in place for backward compatibility.
If E is defined over ℚ, v gives the coordinate change for E to the
standard minimal integral model ( * c is the product of the local Tamagawa numbers cp, a quantity which enters in the Birch and Swinnerton-Dyer conjecture, * F is the factorization of N,
* L is a vector, whose i-th entry contains the local data
at the i-th prime ideal divisor of N, i.e.
The library syntax is
| |
ellgroup(E, {p}, {flag}) | |
Let * if flag = 0, returns the structure [] (trivial group) or [d1] (nontrivial cyclic group) or [d1,d2] (noncyclic group) of E(𝔽q) ~ ℤ/d1ℤ x ℤ/d2ℤ, with d2 | d1.
* if flag = 1, returns a triple [h,cyc,gen], where
h is the curve cardinality, cyc gives the group structure as a
product of cyclic groups (as per flag = 0). More precisely, if d2 > 1,
the output is [d1d2, [d1,d2], [P,Q]] where P is
of order d1 and [P,Q] generates the curve.
Caution. It is not guaranteed that Q has order d2, which in
the worst case requires an expensive discrete log computation. Only that
For other fields of definition and p defining a finite residue field 𝔽q, returns the structure of the reduction of E: the argument p is best left omitted if K = ℚℓ (else we must have p = ℓ) and must be a prime number (K = ℚ) or prime ideal (K a general number field) with residue field 𝔽q otherwise. The curve is allowed to have bad reduction at p and in this case we consider the (cyclic) group of nonsingular points for the reduction of a minimal model at p. If flag = 0, the equation need not be minimal or even integral at p; of course, a minimal model will be more efficient.
If flag = 1, the requested generators depend on the model, which must then
be minimal at p, otherwise an exception is thrown. Use
? E = ellinit([0,1]); \\ y^2 = x^3 + 0.x + 1, defined over Q ? ellgroup(E, 7) %2 = [6, 2] \\ Z/6 x Z/2, noncyclic ? E = ellinit([0,1] * Mod(1,11)); \\ defined over F_11 ? ellgroup(E) \\ no need to repeat 11 %4 = [12] ? ellgroup(E, 11) \\ ... but it also works %5 = [12] ? ellgroup(E, 13) \\ ouch, inconsistent input! *** at top-level: ellgroup(E,13) *** ^ — — — — -- *** ellgroup: inconsistent moduli in Rg_to_Fp: 11 13 ? ellgroup(E, 7, 1) %6 = [12, [6, 2], [[Mod(2, 7), Mod(4, 7)], [Mod(4, 7), Mod(4, 7)]]] Let us now consider curves of bad reduction, in this case we return the structure of the (cyclic) group of nonsingular points, satisfying #Ens(𝔽p) = p - ap:
? E = ellinit([0,5]); ? ellgroup(E, 5, 1) %2 = [5, [5], [[Mod(4, 5), Mod(2, 5)]]] ? ellap(E, 5) %3 = 0 \\ additive reduction at 5 ? E = ellinit([0,-1,0,35,0]); ? ellgroup(E, 5, 1) %5 = [4, [4], [[Mod(2, 5), Mod(2, 5)]]] ? ellap(E, 5) %6 = 1 \\ split multiplicative reduction at 5 ? ellgroup(E, 7, 1) %7 = [8, [8], [[Mod(3, 7), Mod(5, 7)]]] ? ellap(E, 7) %8 = -1 \\ nonsplit multiplicative reduction at 7
The library syntax is
| |
ellheegner(E) | |
Let E be an elliptic curve over the rationals, assumed to be of (analytic) rank 1. This returns a nontorsion rational point on the curve, whose canonical height is equal to the product of the elliptic regulator by the analytic Sha. This uses the Heegner point method, described in Cohen GTM 239; the complexity is proportional to the product of the square root of the conductor and the height of the point (thus, it is preferable to apply it to strong Weil curves).
? E = ellinit([-157^2,0]); ? u = ellheegner(E); print(u[1], "\n", u[2]) 69648970982596494254458225/166136231668185267540804 538962435089604615078004307258785218335/67716816556077455999228495435742408 ? ellheegner(ellinit([0,1])) \\ E has rank 0 ! *** at top-level: ellheegner(E=ellinit *** ^ — — — — — — -- *** ellheegner: The curve has even analytic rank.
The library syntax is
| |
ellheight(E, {P}, {Q}) | |
Let E be an elliptic curve defined over K = ℚ or a number field,
as output by
* Without arguments P,Q, returns the Faltings height of the curve E
using Deligne normalization. For a rational curve, the normalization is such
that the function returns * If the argument P ∈ E(K) is present, returns the global Néron-Tate height h(P) of the point, using the normalization in Cremona's Algorithms for modular elliptic curves. * If the argument Q ∈ E(K) is also present, computes the value of the bilinear form (h(P+Q)-h(P-Q)) / 4.
The library syntax is
| |
ellheightmatrix(E, x) | |
x being a vector of points, this
function outputs the Gram matrix of x with respect to the Néron-Tate
height, in other words, the (i,j) component of the matrix is equal to
The library syntax is
| |
ellidentify(E) | |
Look up the elliptic curve E, defined by an arbitrary model over ℚ,
in the
The library syntax is
| |
ellinit(x, {D = 1}) | |
Initialize an * a 5-component vector [a1,a2,a3,a4,a6] defining the elliptic curve with Weierstrass equation Y2 + a1 XY + a3 Y = X3 + a2 X2 + a4 X + a6, * a 2-component vector [a4,a6] defining the elliptic curve with short Weierstrass equation Y2 = X3 + a4 X + a6,
* a single-component vector [j] giving the j-invariant for the curve,
with the same coefficients as given by
* a character string in Cremona's notation, e.g. The optional argument D describes the domain over which the curve is defined:
* the
* a
* an
* a
* a
* a
* a number field K, given by a
* a prime ideal 𝔭, given by a
This argument D is indicative: the curve coefficients are checked for
compatibility, possibly changing D; for instance if D = 1 and
an
? ellinit([1 + O(5), 1], O(7)); *** at top-level: ellinit([1+O(5),1],O *** ^ — — — — — — -- *** ellinit: inconsistent moduli in ellinit: 7 != 5 If the curve coefficients are too general to fit any of the above domain categories, only basic operations, such as point addition, will be supported later. If the curve (seen over the domain D) is singular, fail and return an empty vector [].
? E = ellinit([0,0,0,0,1]); \\ y^2 = x^3 + 1, over Q ? E = ellinit([0,1]); \\ the same curve, short form ? E = ellinit("36a1"); \\ sill the same curve, Cremona's notations ? E = ellinit([0]); \\ a curve of j-invariant 0 ? E = ellinit([0,1], 2) \\ over F2: singular curve %4 = [] ? E = ellinit(['a4,'a6] * Mod(1,5)); \\ over F5[a4,a6], basic support !
Note that the given curve of j-invariant 0 happens
to be
The result of a1,a2,a3,a4,a6,b2,b4,b6,b8,c4,c6, Δ,j.
All are accessible via member functions. In particular, the discriminant is
? E = ellinit([a4, a6]); ? E.disc %2 = -64*a4^3 - 432*a6^2 ? E.j %3 = -6912*a4^3/(-4*a4^3 - 27*a6^2) Further components contain domain-specific data, which are in general dynamic: only computed when needed, and then cached in the structure.
? E = ellinit([2,3], 10^60+7); \\ E over Fp, p large ? ellap(E) time = 4,440 ms. %2 = -1376268269510579884904540406082 ? ellcard(E); \\ now instantaneous ! time = 0 ms. ? ellgenerators(E); time = 5,965 ms. ? ellgenerators(E); \\ second time instantaneous time = 0 ms. See the description of member functions related to elliptic curves at the beginning of this section.
The library syntax is
| |
ellintegralmodel(E, {&v}) | |
Let E be an
? e = ellinit([1/17,1/42]); ? e = ellintegralmodel(e,&v); ? e[1..5] %3 = [0, 0, 0, 15287762448, 3154568630095008] ? v %4 = [1/714, 0, 0, 0]
The library syntax is
| |
elliscm(E) | |
Let E an elliptic curve over a number field. Return 0 if E is not CM, otherwise return the discriminant of its endomorphism ring.
? E = ellinit([0,0,-5,-750,7900]); ? D = elliscm(E) %2 = -27 ? w = quadgen(D, 'w); ? P = ellheegner(E) %4 = [10,40] ? Q = ellmul(E,P,w) %5 = [110/7-5/49*w,85/49-225/343*w] An example over a number field:
? nf=nfinit(a^2-5); ? E = ellinit([261526980*a-584793000,-3440201839360*a+7692525148000],nf); ? elliscm(E) %3 = -20 ? ellisomat(E)[2] %4 = [1,2,5,10;2,1,10,5;5,10,1,2;10,5,2,1]
The library syntax is
| |
ellisdivisible(E, P, n, {&Q}) | |
Given E/K a number field and P in E(K) return 1 if P = [n]R for some R in E(K) and set Q to one such R; and return 0 otherwise.
? K = nfinit(polcyclo(11,t)); ? E = ellinit([0,-1,1,0,0], K); ? P = [0,0]; ? ellorder(E,P) %4 = 5 ? ellisdivisible(E,P,5, &Q) %5 = 1 ? lift(Q) %6 = [-t^7-t^6-t^5-t^4+1, -t^9-2*t^8-2*t^7-3*t^6-3*t^5-2*t^4-2*t^3-t^2-1] ? ellorder(E, Q) %7 = 25
We use a fast multimodular algorithm over ℚ whose
complexity is essentially independent of n (polynomial in log n).
Over number fields, we compute roots of division polynomials and the
algebraic complexity of the underlying algorithm is in O(p4), where p is
the largest prime divisor of n. The integer n ≥ 0 may be given as
The library syntax is
| |
ellisisom(E, F) | |
Return 0 if the elliptic curves E and F defined over the same number
field are not isomorphic, otherwise return
? E = ellinit([1,2]); ? ellisisom(E, ellinit([1,3])) %2 = 0 ? F = ellchangecurve(E, [-1,1,3,2]); ? ellisisom(E,F) %4 = [1, 1, -3, -2]
? nf = nfinit(a^3-2); E = ellinit([a^2+1,2*a-5], nf); ? F = ellchangecurve(E,Mod([a, a+1, a^2, a^2+a-3], nf.pol)); ? v = ellisisom(E,F) %3 = [Mod(-a, a^3 - 2), Mod(a + 1, a^3 - 2), Mod(-a^2, a^3 - 2), Mod(-a^2 - a + 3, a^3 - 2)] ? ellchangecurve(E,v) == F %4 = 1
The library syntax is
| |
ellisogeny(E, G, {only_image = 0}, {x = 'x}, {y = 'y}) | |
Given an elliptic curve E, a finite subgroup G of E is given either
as a generating point P (for a cyclic G) or as a polynomial whose roots
vanish on the x-coordinates of the nonzero elements of G (general case
and more efficient if available). This function returns the
[a1,a2,a3,a4,a6] invariants of the quotient elliptic curve
E/G and (if only_image is zero (the default)) a vector of rational
functions [f, g, h] such that the isogeny E → E/G is given by (x,y)
? E = ellinit([0,1]); ? elltors(E) %2 = [6, [6], [[2, 3]]] ? ellisogeny(E, [2,3], 1) \\ Weierstrass model for E/<P> %3 = [0, 0, 0, -135, -594] ? ellisogeny(E,[-1,0]) %4 = [[0,0,0,-15,22], [x^3+2*x^2+4*x+3, y*x^3+3*y*x^2-2*y, x+1]]
The library syntax is
| |
ellisogenyapply(f, g) | |
Given an isogeny of elliptic curves f:E' → E (being the result of a call
to * if g is a point P in the domain of f, return the image f(P); * if g:E" → E' is a compatible isogeny, return the composite isogeny f o g: E" → E.
? one = ffgen(101, 't)^0; ? E = ellinit([6, 53, 85, 32, 34] * one); ? P = [84, 71] * one; ? ellorder(E, P) %4 = 5 ? [F, f] = ellisogeny(E, P); \\ f: E->F = E/<P> ? ellisogenyapply(f, P) %6 = [0] ? F = ellinit(F); ? Q = [89, 44] * one; ? ellorder(F, Q) %9 = 2 ? [G, g] = ellisogeny(F, Q); \\ g: F->G = F/<Q> ? gof = ellisogenyapply(g, f); \\ gof: E -> G
The library syntax is
| |
ellisomat(E, {p = 0}, {flag = 0}) | |
Given an elliptic curve E defined over a number field K, computes representatives of the set of isomorphism classes of elliptic curves defined over K and K-isogenous to E, assuming it is finite (see below). For any such curve Ei, let fi: E → Ei be a rational isogeny of minimal degree and let gi: Ei → E be the dual isogeny; and let M be the matrix such that Mi,j is the minimal degree for an isogeny Ei → Ej. The function returns a vector [L,M] where L is a list of triples [Ei, fi, gi] (flag = 0), or simply the list of Ei (flag = 1, which saves time). The curves Ei are given in [a4,a6] form and the first curve E1 is isomorphic to E by f1. The set of isomorphism classes is finite except when E has CM over a quadratic order contained in K. In that case the function only returns the discriminant of the quadratic order. If p is set, it must be a prime number; in this which case only isogenies of degree a power of p are considered. Over a number field, the possible isogeny degrees are determined by Billerey's algorithm.
? E = ellinit("14a1"); ? [L,M] = ellisomat(E); ? LE = apply(x->x[1], L) \\ list of curves %3 = [[215/48,-5291/864],[-675/16,6831/32],[-8185/48,-742643/864], [-1705/48,-57707/864],[-13635/16,306207/32],[-131065/48,-47449331/864]] ? L[2][2] \\ isogeny f2 %4 = [x^3+3/4*x^2+19/2*x-311/12, 1/2*x^4+(y+1)*x^3+(y-4)*x^2+(-9*y+23)*x+(55*y+55/2),x+1/3] ? L[2][3] \\ dual isogeny g2 %5 = [1/9*x^3-1/4*x^2-141/16*x+5613/64, -1/18*x^4+(1/27*y-1/3)*x^3+(-1/12*y+87/16)*x^2+(49/16*y-48)*x +(-3601/64*y+16947/512),x-3/4] ? apply(E->ellidentify(ellinit(E))[1][1], LE) %6 = ["14a1","14a4","14a3","14a2","14a6","14a5"] ? M %7 = [1 3 3 2 6 6] [3 1 9 6 2 18] [3 9 1 6 18 2] [2 6 6 1 3 3] [6 2 18 3 1 9] [6 18 2 3 9 1]
The library syntax is
| |
ellisoncurve(E, z) | |
Gives 1 (i.e. true) if the point z is on the elliptic curve E, 0 otherwise. If E or z have imprecise coefficients, an attempt is made to take this into account, i.e. an imprecise equality is checked, not a precise one. It is allowed for z to be a vector of points in which case a vector (of the same type) is returned.
The library syntax is
| |
ellisotree(E) | |
Given an elliptic curve E defined over ℚ or a set of
ℚ-isogenous curves as given by * L lists the minimal models of the isomorphism classes of elliptic curves ℚ-isogenous to E (or in the set of isogenous curves), * M is the adjacency matrix of the prime degree isogenies tree: there is an edge from Ei to Ej if there is an isogeny Ei → Ej of prime degree such that the Néron differential forms are preserved.
? E = ellinit("14a1"); ? [L,M] = ellisotree(E); ? M %3 = [0 0 3 2 0 0] [3 0 0 0 2 0] [0 0 0 0 0 2] [0 0 0 0 0 3] [0 0 0 3 0 0] [0 0 0 0 0 0] ? [L2,M2] = ellisotree(ellisomat(E,2,1)); %4 = [0 2] [0 0] ? [L3,M3] = ellisotree(ellisomat(E,3,1)); ? M3 %6 = [0 0 3] [3 0 0] [0 0 0]
Compare with the result of
? [L,M]=ellisomat(E,,1); ? M %7 = [1 3 3 2 6 6] [3 1 9 6 2 18] [3 9 1 6 18 2] [2 6 6 1 3 3] [6 2 18 3 1 9] [6 18 2 3 9 1]
The library syntax is
| |
ellissupersingular(E, {p}) | |
Return 1 if the elliptic curve E defined over a number field, ℚp or a finite field is supersingular at p, and 0 otherwise. If the curve is defined over ℚ or a number field, p must be explicitly given, and must be a prime number, resp. a maximal ideal; we return 1 if and only if E has supersingular good reduction at p. Alternatively, E can be given by its j-invariant in a finite field. In this case p must be omitted.
? g = ffprimroot(ffgen(7^5)) %1 = 4*x^4+5*x^3+6*x^2+5*x+6 ? [g^n | n <- [1 .. 7^5 - 1], ellissupersingular(g^n)] %2 = [6] ? j = ellsupersingularj(2^31-1) %3 = 1618591527*w+1497042960 ? ellissupersingular(j) %4 = 1 ? K = nfinit(y^3-2); P = idealprimedec(K, 2)[1]; ? E = ellinit([y,1], K); ? ellissupersingular(E, P) %7 = 1 ? Q = idealprimedec(K,5)[1]; ? ellissupersingular(E, Q) %9 = 0
The library syntax is
| |
ellj(x) | |
Elliptic j-invariant. x must be a complex number with positive imaginary part, or convertible into a power series or a p-adic number with positive valuation.
The library syntax is
| |
elllocalred(E, {p}) | |
Calculates the Kodaira type of the local fiber of the elliptic curve
E at p. E must be an 1 means good reduction (type I0), 2, 3 and 4 mean types II, III and IV respectively, 4+ν with ν > 0 means type Iν; finally the opposite values -1, -2, etc. refer to the starred types I0*, II*, etc. The third component v is itself a vector [u,r,s,t] giving the coordinate changes done during the local reduction; u = 1 if and only if the given equation was already minimal at p. Finally, the last component c is the local Tamagawa number cp.
The library syntax is
| |
elllog(E, P, G, {o}) | |
Given two points P and G on the elliptic curve E/𝔽q, returns the
discrete logarithm of P in base G, i.e. the smallest nonnegative
integer n such that P = [n]G.
See If no o is given, assume that G generates the curve. The function also assumes that P is a multiple of G.
? a = ffgen(ffinit(2,8),'a); ? E = ellinit([a,1,0,0,1]); \\ over F2^8 ? x = a^3; y = ellordinate(E,x)[1]; ? P = [x,y]; G = ellmul(E, P, 113); ? ord = [242, factor(242)]; \\ P generates a group of order 242. Initialize. ? ellorder(E, G, ord) %4 = 242 ? e = elllog(E, P, G, ord) %5 = 15 ? ellmul(E,G,e) == P %6 = 1
The library syntax is
| |
elllseries(E, s, {A = 1}) | |
This function is deprecated, use
E being an elliptic curve, given by an arbitrary model over ℚ as output
by
The optional parameter A fixes a cutoff point for the integral and is best
left omitted; the result must be independent of A, up to
The library syntax is
| |
ellmaninconstant(E) | |
Let E be an elliptic curve over Q given by
? E = ellinit("11a3"); ? ellmaninconstant(E) %2 = 5 ? L=ellisomat(E,,1); ? ellmaninconstant(L) %4 = [5,1,1]
The library syntax is
| |
ellminimaldisc(E) | |
E being an elliptic curve defined over a number field output by
The library syntax is
| |
ellminimalmodel(E, {&v}) | |
Let E be an
Else return the (nonprincipal) Weierstrass class of E, i.e. the class of
∏ 𝔭(v𝔭{Δ - δ𝔭) / 12} where
Δ =
The resulting model has integral coefficients and is everywhere minimal, the
coefficients a1 and a3 are reduced modulo 2 (in terms of the fixed
integral basis
? e = ellinit([6,6,12,55,233]); \\ over Q ? E = ellminimalmodel(e, &v); ? E[1..5] %3 = [0, 0, 0, 1, 1] ? v %4 = [2, -5, -3, 9]
? K = bnfinit(a^2-65); \\ over a nonprincipal number field ? K.cyc %2 = [2] ? u = Mod(8+a, K.pol); ? E = ellinit([1,40*u+1,0,25*u^2,0], K); ? ellminimalmodel(E) \\ no global minimal model exists over ZK %6 = [1]~
The library syntax is
| |
ellminimaltwist(E, {flag = 0}) | |
Let E be an elliptic curve defined over ℚ, return a discriminant D such that the twist of E by D is minimal among all possible quadratic twists, i.e. if flag = 0, its minimal model has minimal discriminant, or if flag = 1, it has minimal conductor. In the example below, we find a curve with j-invariant 3 and minimal conductor.
? E = ellminimalmodel(ellinit(ellfromj(3))); ? ellglobalred(E)[1] %2 = 357075 ? D = ellminimaltwist(E,1) %3 = -15 ? E2 = ellminimalmodel(elltwist(E,D)); ? ellglobalred(E2)[1] %5 = 14283 In the example below, flag = 0 and flag = 1 give different results.
? E = ellinit([1,0]); ? D0 = ellminimaltwist(E,0) %7 = 1 ? D1 = ellminimaltwist(E,1) %8 = 8 ? E0 = ellminimalmodel(elltwist(E,D0)); ? [E0.disc, ellglobalred(E0)[1]] %10 = [-64, 64] ? E1 = ellminimalmodel(elltwist(E,D1)); ? [E1.disc, ellglobalred(E1)[1]] %12 = [-4096, 32]
The library syntax is
| |
ellmoddegree(e) | |
e being an elliptic curve defined over ℚ output by
? E = ellinit("11a1"); \\ from Cremona table: strong Weil curve and c = 1 ? [v,smith] = ellweilcurve(E); smith \\ proof of the above %2 = [[1, 1], [5, 1], [1, 1/5]] ? ellmoddegree(E) %3 = 1 ? [ellidentify(e)[1][1] | e<-v] %4 = ["11a1", "11a2", "11a3"] ? ellmoddegree(ellinit("11a2")) %5 = 5 ? ellmoddegree(ellinit("11a3")) %6 = 1/5
The modular degree of
The library syntax is
| |
ellmodulareqn(N, {x}, {y}) | |
Given a prime N < 500, return a vector [P,t] where P(x,y)
is a modular equation of level N, i.e. a bivariate polynomial with integer
coefficients; t indicates the type of this equation: either
canonical (t = 0) or Atkin (t = 1). This function requires
the Let j be the j-invariant function. The polynomial P satisfies the functional equation, P(f,j) = P(f | WN, j | WN) = 0 for some modular function f = fN (hand-picked for each fixed N to minimize its size, see below), where WN(τ) = -1 / (N τ) is the Atkin-Lehner involution. These two equations allow to compute the values of the classical modular polynomial ΦN, such that ΦN(j(τ), j(Nτ)) = 0, while being much smaller than the latter. More precisely, we have j(WN(τ)) = j(N τ); the function f is invariant under Γ0(N) and also satisfies * for Atkin type: f | WN = f; * for canonical type: let s = 12/gcd(12,N-1), then f | WN = Ns / f. In this case, f has a simple definition: f(τ) = Ns (η(N τ) / η(τ) )2 s, where η is Dedekind's eta function. The following GP function returns values of the classical modular polynomial by eliminating fN(τ) in the above functional equation, for N ≤ 31 or N ∈ {41,47,59,71}.
classicaleqn(N, X='X, Y='Y)= { my([P,t] = ellmodulareqn(N), Q, d); if (poldegree(P,'y) > 2, error("level unavailable in classicaleqn")); if (t == 0, \\ Canonical my(s = 12/gcd(12,N-1)); Q = 'x^(N+1) * substvec(P,['x,'y],[N^s/'x,Y]); d = N^(s*(2*N+1)) * (-1)^(N+1); , \\ Atkin Q = subst(P,'y,Y); d = (X-Y)^(N+1)); polresultant(subst(P,'y,X), Q) / d; }
The library syntax is
| |
ellmul(E, z, n) | |
Computes [n]z, where z is a point on the elliptic curve E. The exponent n is in ℤ, or may be a complex quadratic integer if the curve E has complex multiplication by n (if not, an error message is issued).
? Ei = ellinit([1,0]); z = [0,0]; ? ellmul(Ei, z, 10) %2 = [0] \\ unsurprising: z has order 2 ? ellmul(Ei, z, I) %3 = [0, 0] \\ Ei has complex multiplication by Z[i] ? ellmul(Ei, z, quadgen(-4)) %4 = [0, 0] \\ an alternative syntax for the same query ? Ej = ellinit([0,1]); z = [-1,0]; ? ellmul(Ej, z, I) *** at top-level: ellmul(Ej,z,I) *** ^ — — — — -- *** ellmul: not a complex multiplication in ellmul. ? ellmul(Ej, z, 1+quadgen(-3)) %6 = [1 - w, 0] The simple-minded algorithm for the CM case assumes that we are in characteristic 0, and that the quadratic order to which n belongs has small discriminant.
The library syntax is
| |
ellneg(E, z) | |
Opposite of the point z on elliptic curve E.
The library syntax is
| |
ellnonsingularmultiple(E, P) | |
Given an elliptic curve E/ℚ (more precisely, a model defined over ℚ of a curve) and a rational point P ∈ E(ℚ), returns the pair [R,n], where n is the least positive integer such that R := [n]P has good reduction at every prime. More precisely, its image in a minimal model is everywhere nonsingular.
? e = ellinit("57a1"); P = [2,-2]; ? ellnonsingularmultiple(e, P) %2 = [[1, -1], 2] ? e = ellinit("396b2"); P = [35, -198]; ? [R,n] = ellnonsingularmultiple(e, P); ? n %5 = 12
The library syntax is
| |
ellorder(E, z, {o}) | |
Gives the order of the point z on the elliptic curve E, defined over a finite field or a number field. Return (the impossible value) zero if the point has infinite order.
? E = ellinit([-157^2,0]); \\ the "157-is-congruent" curve ? P = [2,2]; ellorder(E, P) %2 = 2 ? P = ellheegner(E); ellorder(E, P) \\ infinite order %3 = 0 ? K = nfinit(polcyclo(11,t)); E=ellinit("11a3", K); T = elltors(E); ? ellorder(E, T.gen[1]) %5 = 25 ? E = ellinit(ellfromj(ffgen(5^10))); ? ellcard(E) %7 = 9762580 ? P = random(E); ellorder(E, P) %8 = 4881290 ? p = 2^160+7; E = ellinit([1,2], p); ? N = ellcard(E) %9 = 1461501637330902918203686560289225285992592471152 ? o = [N, factor(N)]; ? for(i=1,100, ellorder(E,random(E))) time = 260 ms.
The parameter o, is now mostly useless, and kept for backward
compatibility. If present, it represents a nonzero multiple of the order
of z, see Section se:DLfun; the preferred format for this parameter is
? o = [N, factor(N)]; ? for(i=1,100, ellorder(E,random(E),o)) time = 260 ms.
The library syntax is
| |
ellordinate(E, x) | |
Gives a 0, 1 or 2-component vector containing the y-coordinates of the points of the curve E having x as x-coordinate.
The library syntax is
| |
ellpadicL(E, p, n, {s = 0}, {r = 0}, {D = 1}) | |
Returns the value (or r-th derivative) on a character χs of ℤp* of the p-adic L-function of the elliptic curve E/ℚ, twisted by D, given modulo pn.
Characters. The set of continuous characters of
Gal(ℚ(μp oo )/ ℚ) is identified to ℤp* via the
cyclotomic character χ with values in ℚp*. Denote by
τ:ℤp* → ℤp* the Teichmüller character, with values
in the (p-1)-th roots of 1 for p ! = 2, and {-1,1} for p = 2;
finally, let
The p-adic L function. The p-adic L function Lp is defined on the set of continuous characters of Gal(ℚ(μp oo )/ ℚ), as ∫ℤ_{p*} χs d μ for a certain p-adic distribution μ on ℤp*. The derivative is given by Lp(r)(E, χs) = ∫ℤ_{p*} logpr(a) χs(a) dμ(a). More precisely: * When E has good supersingular reduction, Lp takes its values in D := H1dR(E/ℚ) ⨂ ℚ ℚp and satisfies (1-p-1 F)-2 Lp(E, χ0) = (L(E,1) / Ω).ω where F is the Frobenius, L(E,1) is the value of the complex L function at 1, ω is the Néron differential and Ω the attached period on E(ℝ). Here, χ0 represents the trivial character. The function returns the components of Lp(r)(E,χs) in the basis (ω, F ω). * When E has ordinary good reduction, this method only defines the projection of Lp(E,χs) on the α-eigenspace, where α is the unit eigenvalue for F. This is what the function returns. We have (1- α-1)-2 Lp,α(E,χ0) = L(E,1) / Ω. Two supersingular examples:
? cxL(e) = bestappr( ellL1(e) / e.omega[1] ); ? e = ellinit("17a1"); p=3; \\ supersingular, a3 = 0 ? L = ellpadicL(e,p,4); ? F = [0,-p;1,ellap(e,p)]; \\ Frobenius matrix in the basis (omega,F(omega)) ? (1-p^(-1)*F)^-2 * L / cxL(e) %5 = [1 + O(3^5), O(3^5)]~ \\ [1,0]~ ? e = ellinit("116a1"); p=3; \\ supersingular, a3 != 0~ ? L = ellpadicL(e,p,4); ? F = [0,-p; 1,ellap(e,p)]; ? (1-p^(-1)*F)^-2*L~ / cxL(e) %9 = [1 + O(3^4), O(3^5)]~ Good ordinary reduction:
? e = ellinit("17a1"); p=5; ap = ellap(e,p) %1 = -2 \\ ordinary ? L = ellpadicL(e,p,4) %2 = 4 + 3*5 + 4*5^2 + 2*5^3 + O(5^4) ? al = padicappr(x^2 - ap*x + p, ap + O(p^7))[1]; ? (1-al^(-1))^(-2) * L / cxL(e) %4 = 1 + O(5^4) Twist and Teichmüller:
? e = ellinit("17a1"); p=5; \\ ordinary \\ 2nd derivative at tau^1, twist by -7 ? ellpadicL(e, p, 4, [0,1], 2, -7) %2 = 2*5^2 + 5^3 + O(5^4)
We give an example of non split multiplicative reduction (see
? e=ellinit("15a1"); p=3; n=5; ? L = ellpadicL(e,p,n) %2 = 2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5) ? (1 - ellap(e,p))^(-1) * L / cxL(e) %3 = 1 + O(3^5)
This function is a special case of
? e = ellinit("17a1"); p=5; ? L = ellpadicL(e,p,4) %2 = 4 + 3*5 + 4*5^2 + 2*5^3 + O(5^4) ? [M,phi] = msfromell(e, 1); ? Mp = mspadicinit(M, p, 4); ? mu = mspadicmoments(Mp, phi); ? mspadicL(mu) %6 = 4 + 3*5 + 4*5^2 + 2*5^3 + 2*5^4 + 5^5 + O(5^6) ? mspadicseries(mu) %7 = (4 + 3*5 + 4*5^2 + 2*5^3 + 2*5^4 + 5^5 + O(5^6)) + (3 + 3*5 + 5^2 + 5^3 + O(5^4))*x + (2 + 3*5 + 5^2 + O(5^3))*x^2 + (3 + 4*5 + 4*5^2 + O(5^3))*x^3 + (3 + 2*5 + O(5^2))*x^4 + O(x^5)
These are more cumbersome than
The library syntax is
| |
ellpadicbsd(E, p, n, {D = 1}) | |
Given an elliptic curve E over ℚ, its quadratic twist ED
and a prime number p, this function is a p-adic analog of the complex
functions
* Lp is a p-adic number (resp. a pair of p-adic numbers if
E has good supersingular reduction) defined modulo pN, conjecturally
equal to Rp S, where Rp is the p-adic regulator as given by
* r is an upper bound for the analytic rank of the p-adic L-function attached to ED: we know for sure that the i-th derivative of Lp(ED,.) at χ0 is O(pN) for all i < r and that its r-th derivative is nonzero; it is expected that the true analytic rank is equal to the rank of the Mordell-Weil group ED(ℚ), plus 1 if the reduction of ED at p is split multiplicative; if r = 0, then both the analytic rank and the Mordell-Weil rank are unconditionnally 0.
Recall that the p-adic BSD conjecture (Mazur, Tate, Teitelbaum, Bernardi,
Perrin-Riou) predicts an explicit link between Rp S and
(1-p-1 F)-2.Lp(r)(ED, χ0) / r!
where r is the analytic rank of the p-adic L-function attached to
ED and F is the Frobenius on H1dR; see
? E = ellinit("11a1"); p = 7; n = 5; \\ good ordinary ? ellpadicbsd(E, 7, 5) \\ rank 0, %2 = [0, 1 + O(7^5)] ? E = ellinit("91a1"); p = 7; n = 5; \\ non split multiplicative ? [r,Lp] = ellpadicbsd(E, p, n) %5 = [1, 2*7 + 6*7^2 + 3*7^3 + 7^4 + O(7^5)] ? R = ellpadicregulator(E, p, n, E.gen) %6 = 2*7 + 6*7^2 + 3*7^3 + 7^4 + 5*7^5 + O(7^6) ? sha = Lp/R %7 = 1 + O(7^4) ? E = ellinit("91b1"); p = 7; n = 5; \\ split multiplicative ? [r,Lp] = ellpadicbsd(E, p, n) %9 = [2, 2*7 + 7^2 + 5*7^3 + O(7^4)] ? ellpadicregulator(E, p, n, E.gen) %10 = 2*7 + 7^2 + 5*7^3 + 6*7^4 + 2*7^5 + O(7^6) ? [rC, LC] = ellanalyticrank(E); ? [r, rC] %12 = [2, 1] \\ r = rC+1 because of split multiplicative reduction ? E = ellinit("53a1"); p = 5; n = 5; \\ supersingular ? [r, Lp] = ellpadicbsd(E, p, n); ? r %15 = 1 ? Lp %16 = [3*5 + 2*5^2 + 2*5^5 + O(5^6), \ 5 + 3*5^2 + 4*5^3 + 2*5^4 + 5^5 + O(5^6)] ? R = ellpadicregulator(E, p, n, E.gen) %17 = [3*5 + 2*5^2 + 2*5^5 + O(5^6), 5 + 3*5^2 + 4*5^3 + 2*5^4 + O(5^5)] \\ expect Lp = R*#Sha, hence (conjecturally) #Sha = 1 ? E = ellinit("84a1"); p = 11; n = 6; D = -443; ? [r,Lp] = ellpadicbsd(E, 11, 6, D) \\ Mordell-Weil rank 0, no regulator %19 = [0, 3 + 2*11 + O(11^6)] ? lift(Lp) \\ expected cardinal for Sha is 5^2 %20 = 25 ? ellpadicbsd(E, 3, 12, D) \\ at 3 %21 = [1, 1 + 2*3 + 2*3^2 + O(3^8)] ? ellpadicbsd(E, 7, 8, D) \\ and at 7 %22 = [0, 4 + 3*7 + O(7^8)]
The library syntax is
| |
ellpadicfrobenius(E, p, n) | |
If p > 2 is a prime and E is an elliptic curve on ℚ with good reduction at p, return the matrix of the Frobenius endomorphism ϕ on the crystalline module Dp(E) = ℚp ⨂ H1dR(E/ℚ) with respect to the basis of the given model (ω, η = x ω), where ω = dx/(2 y+a1 x+a3) is the invariant differential. The characteristic polynomial of ϕ is x2 - ap x + p. The matrix is computed to absolute p-adic precision pn.
? E = ellinit([1,-1,1,0,0]); ? F = ellpadicfrobenius(E,5,3); ? lift(F) %3 = [120 29] [ 55 5] ? charpoly(F) %4 = x^2 + O(5^3)*x + (5 + O(5^3)) ? ellap(E, 5) %5 = 0
The library syntax is
| |
ellpadicheight(E, p, n, P, {Q}) | |
Cyclotomic p-adic height of the rational point P on the elliptic curve E (defined over ℚ), given to n p-adic digits. If the argument Q is present, computes the value of the bilinear form (h(P+Q)-h(P-Q)) / 4. Let D := H1dR(E) ⨂ ℚ ℚp be the ℚp vector space spanned by ω (invariant differential dx/(2y+a1x+a3) related to the given model) and η = x ω. Then the cyclotomic p-adic height hE associates to P ∈ E(ℚ) an element f ω + g η in D. This routine returns the vector [f, g] to n p-adic digits. If P ∈ E(ℚ) is in the kernel of reduction mod p and if its reduction at all finite places is non singular, then g = -(logE P)2, where logE is the logarithm for the formal group of E at p.
If furthermore the model is of the form Y2 = X3 + a X + b
and P = (x,y), then
f = logp(
Recall (Advanced topics in the arithmetic of elliptic
curves, Theorem 3.2) that the local height function over the complex numbers
is of the form
λ(z) = -log (|
? E = ellinit([1,-1,1,0,0]); P = [0,0]; ? ellpadicheight(E,5,3, P) %2 = [3*5 + 5^2 + 2*5^3 + O(5^4), 5^2 + 4*5^4 + O(5^5)] ? E = ellinit("11a1"); P = [5,5]; \\ torsion point ? ellpadicheight(E,19,6, P) %4 = [0, 0] ? E = ellinit([0,0,1,-4,2]); P = [-2,1]; ? ellpadicheight(E,3,3, P) %6 = [2*3^2 + 2*3^3 + 3^4 + O(3^5), 2*3^2 + 3^4 + O(3^5)] ? ellpadicheight(E,3,5, P, elladd(E,P,P)) %7 = [3^2 + 2*3^3 + O(3^7), 3^2 + 3^3 + 2*3^4 + 3^5 + O(3^7)] * When E has good ordinary reduction at p or non split multiplicative reduction, the "canonical" p-adic height is given by
s2 = ellpadics2(E,p,n); ellpadicheight(E, p, n, P) * [1,-s2]~ Since s2 does not depend on P, it is preferable to compute it only once:
? E = ellinit("5077a1"); p = 5; n = 7; \\ rank 3 ? s2 = ellpadics2(E,p,n); ? M = ellpadicheightmatrix(E,p, n, E.gen) * [1,-s2]~; ? matdet(M) \\ p-adic regulator on the points in E.gen %4 = 5 + 5^2 + 4*5^3 + 2*5^4 + 2*5^5 + 2*5^6 + O(5^7) * When E has split multiplicative reduction at p (Tate curve), the "canonical" p-adic height is given by
Ep = ellinit(E[1..5], O(p^(n))); \\ E seen as a Tate curve over Qp [u2,u,q] = Ep.tate; ellpadicheight(E, p, n, P) * [1,-s2 + 1/log(q)/u2]]~ where s2 is as above. For example,
? E = ellinit("91b1"); P =[-1, 3]; p = 7; n = 5; ? Ep = ellinit(E[1..5], O(p^(n))); ? s2 = ellpadics2(E,p,n); ? [u2,u,q] = Ep.tate; ? H = ellpadicheight(E,p, n, P) * [1,-s2 + 1/log(q)/u2]~ %5 = 2*7 + 7^2 + 5*7^3 + 6*7^4 + 2*7^5 + O(7^6)
These normalizations are chosen so that p-adic BSD conjectures
are easy to state, see
The library syntax is
| |
ellpadicheightmatrix(E, p, n, Q) | |
Q being a vector of points, this function returns the "Gram matrix"
[F,G] of the cyclotomic p-adic height hE with respect to
the basis (ω, η) of D = H1dR(E) ⨂ ℚ ℚp
given to n p-adic digits. In other words, if
? E = ellinit([0,0,1,-7,6]); Q = [[-2,3],[-1,3]]; p = 5; n = 5; ? [F,G] = ellpadicheightmatrix(E,p,n,Q); ? lift(F) \\ p-adic entries, integral approximation for readability %3 = [2364 3100] [3100 3119] ? G %4 = [25225 46975] [46975 61850] ? [F,G] * [1,-ellpadics2(E,p,n)]~ %5 = [4 + 2*5 + 4*5^2 + 3*5^3 + O(5^5) 4*5^2 + 4*5^3 + 5^4 + O(5^5)] [ 4*5^2 + 4*5^3 + 5^4 + O(5^5) 4 + 3*5 + 4*5^2 + 4*5^3 + 5^4 + O(5^5)]
The library syntax is
| |
ellpadiclambdamu(E, p, {D = 1}, {i = 0}) | |
Let p be a prime number and let E/ℚ be a rational elliptic curve
with good or bad multiplicative reduction at p.
Return the Iwasawa invariants λ and μ for the p-adic L
function Lp(E), twisted by (D/.) and the i-th power of the
Teichmüller character τ, see Let χ be the cyclotomic character and choose γ in Gal(ℚp(μp oo )/ℚp) such that χ(γ) = 1+2p. Let L(i), D ∈ ℚp[[X]] ⨂ Dcris such that ( < χ > s τi) (L(i), D(γ-1)) = Lp(E, < χ > sτi (D/.)). * When E has good ordinary or bad multiplicative reduction at p. By Weierstrass's preparation theorem the series L(i), D can be written pμ (Xλ + p G(X)) up to a p-adic unit, where G(X) ∈ ℤp[X]. The function returns [λ,μ].
* When E has good supersingular reduction, we define a sequence
of polynomials Pn in ℚp[X] of degree < pn (and bounded
denominators), such that
L(i), D = Pn ϕn+1ωE -
ξn Pn-1ϕn+2ωE mod ((1+X)p^{n}-1)
ℚp[X] ⨂ Dcris,
where ξn = * μn is nonnegative and decreasing for n of given parity hence μ2n tends to a limit μ+ and μ2n+1 tends to a limit μ− (both conjecturally 0). * there exists integers λ+, λ− in ℤ (denoted with a ~ in the reference below) such that limn → oo λ2n + 1/(p+1) = λ+ and limn → oo λ2n+1 + p/(p+1) = λ−. The function returns [[λ+, λ−], [μ+,μ−]]. Reference: B. Perrin-Riou, Arithmétique des courbes elliptiques à réduction supersinguli\`ere en p, Experimental Mathematics, 12, 2003, pp. 155-186.
The library syntax is
| |
ellpadiclog(E, p, n, P) | |
Given E defined over K = ℚ or ℚp and P = [x,y] on E(K) in the kernel of reduction mod p, let t(P) = -x/y be the formal group parameter; this function returns L(t) to relative p-adic precision pn, where L denotes the formal logarithm (mapping the formal group of E to the additive formal group) attached to the canonical invariant differential: dL = dx/(2y + a1x + a3).
? E = ellinit([0,0,1,-4,2]); P = [-2,1]; ? ellpadiclog(E,2,10,P) %2 = 2 + 2^3 + 2^8 + 2^9 + 2^10 + O(2^11) ? E = ellinit([17,42]); ? p=3; Ep = ellinit(E,p); \\ E mod p ? P=[114,1218]; ellorder(Ep,P) \\ the order of P on (E mod p) is 2 %5 = 2 ? Q = ellmul(E,P,2) \\ we need a point of the form 2*P %6 = [200257/7056, 90637343/592704] ? ellpadiclog(E,3,10,Q) %7 = 3 + 2*3^2 + 3^3 + 3^4 + 3^5 + 3^6 + 2*3^8 + 3^9 + 2*3^10 + O(3^11)
The library syntax is
| |
ellpadicregulator(E, p, n, S) | |
Let E/ℚ be an elliptic curve. Return the determinant of the Gram matrix of the vector of points S = (S1,..., Sr) with respect to the "canonical" cyclotomic p-adic height on E, given to n (p-adic) digits. When E has ordinary reduction at p, this is the expected Gram deteterminant in ℚp.
In the case of supersingular reduction of E at p, the definition
requires care: the regulator R is an element of
D := H1dR(E) ⨂ ℚ ℚp, which is a two-dimensional
ℚp-vector space spanned by ω and η = x ω
(which are defined over ℚ) or equivalently but now over ℚp
by ω and Fω where F is the Frobenius endomorphism on D
as defined in
For any ν ∈ D, we can define a height hν := [ hE, ν ]D
from E(ℚ) to ℚp and
Note that by definition
[R, η]D = det(
The library syntax is
| |
ellpadics2(E, p, n) | |
If p > 2 is a prime and E/ℚ is an elliptic curve with ordinary good
reduction at p, returns the slope of the unit eigenvector
of
? e=ellinit([17,42]); ? ellpadics2(e,13,4) %2 = 10 + 2*13 + 6*13^3 + O(13^4) This slope is the unique c ∈ 3-1ℤp such that the odd solution σ(t) = t + O(t2) of - d((1)/(σ) (d σ)/(ω)) = (x(t) + c) ω is in tℤp[[t]]. It is equal to b2/12 - E2/12 where E2 is the value of the Katz p-adic Eisenstein series of weight 2 on (E,ω). This is used to construct a canonical p-adic height when E has good ordinary reduction at p as follows
s2 = ellpadics2(E,p,n); h(E,p,n, P, s2) = ellpadicheight(E, [p,[1,-s2]],n, P); Since s2 does not depend on the point P, we compute it only once.
The library syntax is
| |
ellperiods(w, {flag = 0}) | |
Let w describe a complex period lattice (w = [w1,w2]
or an If flag = 1, the function returns [[W1,W2], [η1,η2]], where η1 and η2 are the quasi-periods attached to [W1,W2], satisfying η2 W1 - η1 W2 = 2 i π. The output of this function is meant to be used as the first argument given to ellwp, ellzeta, ellsigma or elleisnum. Quasi-periods are needed by ellzeta and ellsigma only.
? L = ellperiods([1,I],1); ? [w1,w2] = L[1]; [e1,e2] = L[2]; ? e2*w1 - e1*w2 %3 = 6.2831853071795864769252867665590057684*I ? ellzeta(L, 1/2 + 2*I) %4 = 1.5707963... - 6.283185307...*I ? ellzeta([1,I], 1/2 + 2*I) \\ same but less efficient %4 = 1.5707963... - 6.283185307...*I
The library syntax is
| |
ellpointtoz(E, P) | |
If E/ℂ ~ ℂ/Λ is a complex elliptic curve (Λ =
If E is defined over ℝ and P ∈ E(ℝ), we have more precisely, 0 ≤ Re(t) < w1 and 0 ≤ Im(t) < Im(w2), where (w1,w2) are the real and complex periods of E.
? E = ellinit([0,1]); P = [2,3]; ? z = ellpointtoz(E, P) %2 = 3.5054552633136356529375476976257353387 ? ellwp(E, z) %3 = 2.0000000000000000000000000000000000000 ? ellztopoint(E, z) - P %4 = [2.548947057811923643 E-57, 7.646841173435770930 E-57] ? ellpointtoz(E, [0]) \\ the point at infinity %5 = 0
If E is defined over a general number field, the function returns the
values corresponding to the various complex embeddings of the curve
and of the point, in the same order as
? E=ellinit([-22032-15552*x,0], nfinit(x^2-2)); ? P=[-72*x-108,0]; ? ellisoncurve(E,P) %3 = 1 ? ellpointtoz(E,P) %4 = [-0.52751724240790530394437835702346995884*I, -0.090507650025885335533571758708283389896*I] ? E.nf.roots %5 = [-1.4142135623730950488016887242096980786, \\ x-> -sqrt(2) 1.4142135623730950488016887242096980786] \\ x-> sqrt(2) If E/ℚp has multiplicative reduction, then E/ℚp is analytically isomorphic to ℚp*/qℤ (Tate curve) for some p-adic integer q. The behavior is then as follows:
* If the reduction is split (E.
* If the reduction is not split (E.
? E = ellinit([0,-1,1,0,0], O(11^5)); P = [0,0]; ? [u2,u,q] = E.tate; type(u) \\ split multiplicative reduction %2 = "t_PADIC" ? ellmul(E, P, 5) \\ P has order 5 %3 = [0] ? z = ellpointtoz(E, [0,0]) %4 = 3 + 11^2 + 2*11^3 + 3*11^4 + 6*11^5 + 10*11^6 + 8*11^7 + O(11^8) ? z^5 %5 = 1 + O(11^9) ? E = ellinit(ellfromj(1/4), O(2^6)); x=1/2; y=ellordinate(E,x)[1]; ? z = ellpointtoz(E,[x,y]); \\ t_POLMOD of t_POL with t_PADIC coeffs ? liftint(z) \\ lift all p-adics %8 = Mod(8*u + 7, u^2 + 437) ? x=33/4; y=ellordinate(E,x)[1]; z = ellpointtoz(E,[x,y]) *** at top-level: ...;y=ellordinate(E,x)[1];z=ellpointtoz(E,[x,y]) *** ^ — — — — — — -- *** ellpointtoz: sorry, ellpointtoz when u not in Qp is not yet implemented.
The library syntax is
| |
ellpow(E, z, n) | |
Deprecated alias for
The library syntax is
| |
ellrank(E, {effort = 0}, {points}) | |
If E is an elliptic curve over ℚ, attempts to compute the
Mordell-Weil group attached to the curve. The output is [r1,r2,s,L],
where
r1 ≤ rank(E) ≤ r2, s gives informations on the
Tate-Shafarevic group (see below), and L is a list of independent,
non-torsion rational points on the curve. E can also be given as the output
of
If
The parameter
? E = ellinit([-127^2,0]); ? ellrank(E) %2 = [1, 1, 0, []] \\ rank is 1 but no point has been found. ? ellrank(E,4) \\ with more effort we find a point. %3 = [1, 1, 0, [[38902300445163190028032/305111826865145547009, 680061120400889506109527474197680/5329525731816164537079693913473]]]
In addition to the previous calls, the first argument E can be a pair
[e,f], where e is an elliptic curve given by Technical explanation. The algorithm, which computes the 2-descent and the 2-part of the Cassels pairings has an intrinsic limitation: r1 = r2 never holds when the Tate-Shafarevic group G has 4-torsion. Thus, in this case we cannot determine the rank precisely. The algorithm computes unconditionally three quantities: * the rank C of the 2-Selmer group. * the rank T of the 2-torsion subgroup. * the (even) rank s of G[2]/2G[4]; then r2 is defined by r2 = C - T - s. The following quantities are also relevant: * the rank R of the free part of E(ℚ); it always holds that r1 ≤ R ≤ r2. * the rank S of G[2] (conjecturally even); it always holds that s ≤ S and that C = T + R + S. Then r2 = C - T - s ≥ R. When the conductor of E is small, the BSD conjecture can be used to (conditionally) find the true rank:
? E=ellinit([-113^2,0]); ? ellrootno(E) \\ rank is even (parity conjecture) %2 = 1 ? ellrank(E) %3 = [0, 2, 0, []] \\ rank is either 0 or 2, $2$-rank of $G$ is ? ellrank(E, 3) \\ try harder %4 = [0, 2, 0, []] \\ no luck ? [r,L] = ellanalyticrank(E) \\ assume BSD %5 = [0, 3.9465...] ? L / ellbsd(E) \\ analytic rank is 0, compute Sha %6 = 16.0000000000000000000000000000000000000 We find that the rank is 0 and the cardinal of the Tate-Shafarevich group is 16 (assuming BSD!). Moreover, since s = 0, it is isomorphic to (ℤ/4ℤ)2.
When the rank is 1 and the conductor is small,
? E = ellinit([-157^2,0]); ? ellrank(E) %2 = [1, 1, 0, []] \\ rank is 1, no point found ? ellrank(E, 5) \\ Try harder time = 1,094 ms. %3 = [1, 1, 0, []] \\ No luck ? ellheegner(E) \\ use analytic method time = 492 ms. %4 = [69648970982596494254458225/166136231668185267540804, ...]
In this last example, an
The library syntax is
| |
ellrankinit(E) | |
If E is an elliptic curve over ℚ, initialize data to speed up further
calls to
? E = ellinit([0,2429469980725060,0,275130703388172136833647756388,0]); ? rk = ellrankinit(E); ? [r, R, s, P] = ellrank(rk) %3 = [12, 14, 0, [...]] ? [r, R, s, P] = ellrank(rk, 1, P) \\ more effort, using known points %4 = [14, 14, 0, [...]] \\ this time all points are found
The library syntax is
| |
ellratpoints(E, h, {flag = 0}) | |
E being an integral model of elliptic curve , return a vector
containing the affine rational points on the curve of naive height less than
h. If flag = 1, stop as soon as a point is found; return either an empty
vector or a vector containing a single point.
See
? E=ellinit([-25,1]); ? ellratpoints(E,10) %2 = [[-5,1],[-5,-1],[-3,7],[-3,-7],[-1,5],[-1,-5], [0,1],[0,-1],[5,1],[5,-1],[7,13],[7,-13]] ? ellratpoints(E,10,1) %3 = [[-5,1]]
The library syntax is
| |
ellrootno(E, {p}) | |
E being an Note that the global root number is the sign of the functional equation and conjecturally is the parity of the rank of the Mordell-Weil group. The equation for E needs not be minimal at p, but if the model is already minimal the function will run faster.
The library syntax is
| |
ellsaturation(E, V, B) | |
Let E be an elliptic curve over ℚ and and V be a set of independent non-torsion rational points on E of infinite order that generate a subgroup G of E(ℚ) of finite index. Return a new set W of the same length that generate a subgroup H of E(ℚ) containing G and such that [E(ℚ):H] is not divisible by any prime number less than B. The running time is roughly quadratic in B.
? E = ellinit([0,0, 1, -7, 6]); ? [r,R,s,V] = ellrank(E) %2 = [3, 3, 0, [[-1,3], [-3,0], [11,35]]] ? matdet(ellheightmatrix(E, V)) %3 = 3.7542920288254557283540759015628405708 ? W = ellsaturation(E, V, 2) \\ index is now odd time = 1 ms. %4 = [[-1, 3], [-3, 0], [11, 35]] ? W = ellsaturation(E, W, 10) \\ index not divisible by p <= 10 %5 = [[1, -1], [2, -1], [0, -3]] time = 2 ms. ? W = ellsaturation(E, V, 100) \\ looks OK now time = 171 ms. %6 = [[1, -1], [2, -1], [0, -3]] ? matdet(ellheightmatrix(E,V)) %7 = 0.41714355875838396981711954461809339675 ? lfun(E,1,3)/3! / ellbsd(E) \\ conductor is small, check assuming BSD %8 = 0.41714355875838396981711954461809339675
The library syntax is
| |
ellsea(E, {tors = 0}) | |
Let E be an ell structure as output by
? ellsea(ellinit([1,1], 2^56+3477), 1) %1 = 72057594135613381 ? forprime(p=2^128,oo, q = ellcard(ellinit([1,1],p)); if(isprime(q),break)) time = 6,571 ms. ? forprime(p=2^128,oo, q = ellsea(ellinit([1,1],p),1);if(isprime(q),break)) time = 522 ms.
In particular, set
When The following function returns a curve of prime order over 𝔽p.
cryptocurve(p) = { while(1, my(E, N, j = Mod(random(p), p)); E = ellinit(ellfromj(j)); N = ellsea(E, 1); if (!N, continue); if (isprime(N), return(E)); \\ try the quadratic twist for free if (isprime(2*p+2 - N), return(elltwist(E))); ); } ? p = randomprime([2^255, 2^256]); ? E = cryptocurve(p); \\ insist on prime order %2 = 47,447ms
The same example without early abort (using
The availability of the
* If the characteristic is too small (p ≤ 7) or the field
cardinality is tiny (q ≤ 523) the generic algorithm
* If the field cardinality is smaller than about 250, the generic algorithm will be faster.
* Contrary to
The library syntax is
| |
ellsearch(N) | |
This function finds all curves in the
* if N is a character string, it selects a given curve, e.g.
* if N is a vector of integers, it encodes the same constraints
as the character string above, according to the * if N is an integer, curves with conductor N are selected.
If N codes a full curve name, for instance
? ellsearch("11a3") %1 = ["11a3", [0, -1, 1, 0, 0], []] ? ellsearch([11,0,3]) %2 = ["11a3", [0, -1, 1, 0, 0], []] If N is not a full curve name, then the output is a vector of all matching curves in the above format:
? ellsearch("11a") %1 = [["11a1", [0, -1, 1, -10, -20], []], ["11a2", [0, -1, 1, -7820, -263580], []], ["11a3", [0, -1, 1, 0, 0], []]] ? ellsearch("11b") %2 = []
The library syntax is
| |
ellsigma(L, {z = 'x}, {flag = 0}) | |
Computes the value at z of the Weierstrass σ function attached to
the lattice L as given by
? w = ellperiods([1,I], 1); ? ellsigma(w, 1/2) %2 = 0.47494937998792065033250463632798296855 ? E = ellinit([1,0]); ? ellsigma(E) \\ at 'x, implicitly at default seriesprecision %4 = x + 1/60*x^5 - 1/10080*x^9 - 23/259459200*x^13 + O(x^17) If flag = 1, computes an arbitrary determination of log(σ(z)).
The library syntax is
| |
ellsub(E, z1, z2) | |
Difference of the points z1 and z2 on the elliptic curve corresponding to E.
The library syntax is
| |
ellsupersingularj(p) | |
Return a random supersingular j-invariant defined over 𝔽p2 as a
? j = ellsupersingularj(1009) %1 = 12*w+295 ? ellissupersingular(j) %2 = 1 ? a = ffgen([1009,2],'a); ? j = ellsupersingularj(a) %4 = 867*a+721 ? ellissupersingular(j) %5 = 1 ? E = ellinit([j]); ? F = elltwist(E); ? ellissupersingular(F) %8 = 1 ? ellap(E) %9 = 2018 ? ellap(F) %10 = -2018
The library syntax is
| |
elltamagawa(E) | |
The object E being an elliptic curve over a number field, returns the global Tamagawa number of the curve (including the factor at infinite places).
? e = ellinit([1, -1, 1, -3002, 63929]); \\ curve "90c6" from elldata ? elltamagawa(e) %2 = 288 ? [elllocalred(e,p)[4] | p<-[2,3,5]] %3 = [6, 4, 6] ? vecprod(%) \\ since e.disc > 0 the factor at infinity is 2 %4 = 144 ? ellglobalred(e)[4] \\ product without the factor at infinity %5 = 144
The library syntax is
| |
elltaniyama(E, {n = seriesprecision}) | |
Computes the modular parametrization of the elliptic curve E/ℚ,
where E is an
The algorithm assumes that E is a strong Weil curve
and that the Manin constant is equal to 1: in fact, f(x) = ∑n > 0
The library syntax is
| |
elltatepairing(E, P, Q, m) | |
Let E be an elliptic curve defined over a finite field k and m ≥ 1 be an integer. This function computes the (nonreduced) Tate pairing of the points P and Q on E, where P is an m-torsion point. More precisely, let fm,P denote a Miller function with divisor m[P] - m[OE]; the algorithm returns fm,P(Q) ∈ k*/(k*)m.
The library syntax is
| |
elltors(E) | |
If E is an elliptic curve defined over a number field or a finite field,
outputs the torsion subgroup of E as a 3-component vector
? E = ellinit([-1,0]); ? elltors(E) %1 = [4, [2, 2], [[0, 0], [1, 0]]] Here, the torsion subgroup is isomorphic to ℤ/2ℤ x ℤ/2ℤ, with generators [0,0] and [1,0].
The library syntax is
| |
elltrace(E, P) | |
Let E be an elliptic curve over a base field and a point P defined
over an extension field using
? E = ellinit([1,15]); \\ y^2 = x^3 + x + 15, over Q ? P = Mod([a/8-1, 1/32*a^2-11/32*a-19/4], a^3-135*a-408); ? ellisoncurve(E,P) \\ P defined over a cubic extension %3 = 1 ? elltrace(E,P) %4 = [2,-5]
? E = ellinit([-13^2, 0]); ? P = Mod([13,0], a^2-2); \\ defined over Q, seen over a quadratic extension ? elltrace(E,P) == ellmul(E,P,2) %3 = 1 ? elltrace(E,[13,0]) \\ number field of definition of the point unspecified! *** at top-level: elltrace(E,[13,0]) *** ^ — — — — — — *** elltrace: incorrect type in elltrace (t_INT). ? elltrace(E,Mod([13,0],a)) \\ trivial extension %5 = [Mod(13, a), Mod(0, a)] ? P = Mod([-10*x^3+10*x-13, -16*x^3+16*x-34], x^4-x^3+2*x-1); ? ellisoncurve(E,P) %7 = 1 ? Q = elltrace(E,P) %8 = [11432100241 / 375584400, 1105240264347961 / 7278825672000] ? ellisoncurve(E,Q) %9 = 1
? E = ellinit([2,3], 19); \\ over F_19 ? T = a^5+a^4+15*a^3+16*a^2+3*a+1; \\ irreducible ? P = Mod([11*a^3+11*a^2+a+12,15*a^4+9*a^3+18*a^2+18*a+6], T); ? ellisoncurve(E, P) %4 = 1 ? Q = elltrace(E, P) %5 = [Mod(1,19), Mod(14,19)] ? ellisoncurve(E, Q) %6 = 1
The library syntax is
| |
elltwist(E, {P}) | |
Returns an
The elliptic curve E can be given in some of the formats allowed by
Twist by discriminant -3:
? elltwist([0,a2,0,a4,a6], -3)[1..5] %1 = [0, -3*a2, 0, 9*a4, -27*a6] ? elltwist([a4,a6], -3)[1..5] %2 = [0, 0, 0, 9*a4, -27*a6] Twist by the Artin-Schreier extension given by x2+x+T in characteristic 2:
? lift(elltwist([a1,a2,a3,a4,a6]*Mod(1,2), x^2+x+T)[1..5]) %1 = [a1, a2+a1^2*T, a3, a4, a6+a3^2*T] Twist of an elliptic curve defined over a finite field:
? E = elltwist([1,7]*Mod(1,19)); lift([E.a4, E.a6]) %1 = [11, 12]
The library syntax is
| |
ellweilcurve(E, {&ms}) | |
If E' is an elliptic curve over ℚ, let LE' be the
sub-ℤ-module of HomΓ_{0(N)}(Δ0,ℚ) attached to E'
(It is given by x[3] if [M,x] =
On the other hand, if N is the conductor of E and f is the modular form
for Γ0(N) attached to E, let Lf be the lattice of the
f-component of HomΓ_{0(N)}(Δ0,ℚ) given by the elements
φ such that φ({0,γ-1 0}) ∈ ℤ for all
γ ∈ Γ0(N) (see
Let E' run through the isomorphism classes of elliptic curves
isogenous to E as given by In particular, the strong Weil curve amongst the curves isogenous to E is the one whose Smith invariants are [c,c], where c is the Manin constant, conjecturally equal to 1.
? E = ellinit("11a3"); ? [vE, vS] = ellweilcurve(E); ? [n] = [ i | i<-[1..#vS], vS[i]==[1,1] ] \\ lattice with invariant [1,1] %3 = [2] ? ellidentify(vE[n]) \\ ... corresponds to strong Weil curve %4 = [["11a1", [0, -1, 1, -10, -20], []], [1, 0, 0, 0]] ? [vE, vS] = ellweilcurve(E, &ms); \\ vE,vS are as above ? [M, vx] = ms; msdim(M) \\ ... but ms contains more information %6 = 3 ? #vx %7 = 3 ? vx[1] %8 = [[1/25, -1/10, -1/10]~, [0, 1/2, -1/2]~, [1/25,0; -3/5,1; 2/5,-1]] ? forell(E, 11,11, print(msfromell(ellinit(E[1]), 1)[2])) [1/5, -1/2, -1/2]~ [1, -5/2, -5/2]~ [1/25, -1/10, -1/10]~
The last example prints the modular symbols x+
in M+ attached to the curves
The library syntax is
| |
ellweilpairing(E, P, Q, m) | |
Let E be an elliptic curve defined over a finite field and m ≥ 1 be an integer. This function computes the Weil pairing of the two m-torsion points P and Q on E, which is an alternating bilinear map. More precisely, let fm,R denote a Miller function with divisor m[R] - m[OE]; the algorithm returns the m-th root of unity ϵ(P,Q)m.fm,P(Q) / fm,Q(P), where f(R) is the extended evaluation of f at the divisor [R] - [OE] and ϵ(P,Q) ∈ {±1} is given by Weil reciprocity: ϵ(P,Q) = 1 if and only if P, Q, OE are not pairwise distinct.
The library syntax is
| |
ellwp(w, {z = 'x}, {flag = 0}) | |
Computes the value at z of the Weierstrass ℘ function attached to
the lattice w as given by
? w = ellperiods([1,I]); ? ellwp(w, 1/2) %2 = 6.8751858180203728274900957798105571978 ? E = ellinit([1,1]); ? ellwp(E, 1/2) %4 = 3.9413112427016474646048282462709151389 One can also compute the series expansion around z = 0:
? E = ellinit([1,0]); ? ellwp(E) \\ 'x implicitly at default seriesprecision %5 = x^-2 - 1/5*x^2 + 1/75*x^6 - 2/4875*x^10 + O(x^14) ? ellwp(E, x + O(x^12)) \\ explicit precision %6 = x^-2 - 1/5*x^2 + 1/75*x^6 + O(x^9) Optional flag means 0 (default): compute only ℘(z), 1: compute [℘(z),℘'(z)]. For instance, the Dickson elliptic functions sm and sn can be implemented as follows
smcm(z) = { my(a, b, E = ellinit([0,-1/(4*27)])); \\ ell. invariants (g2,g3)=(0,1/27) [a,b] = ellwp(E, z, 1); [6*a / (1-3*b), (3*b+1)/(3*b-1)]; } ? [s,c] = smcm(0.5); ? s %2 = 0.4898258757782682170733218609 ? c %3 = 0.9591820206453842491187464098 ? s^3+c^3 %4 = 1.000000000000000000000000000 ? smcm('x + O('x^11)) %5 = [x - 1/6*x^4 + 2/63*x^7 - 13/2268*x^10 + O(x^11), 1 - 1/3*x^3 + 1/18*x^6 - 23/2268*x^9 + O(x^10)]
The library syntax is
| |
ellxn(E, n, {v = 'x}) | |
For any affine point P = (t,u) on the curve E, we have [n]P = (φn(P)ψn(P) : ωn(P) : ψn(P)3) for some φn,ωn,ψn in ℤ[a1,a2,a3,a4,a6][t,u] modulo the curve equation. This function returns a pair [A,B] of polynomials in ℤ[a1,a2,a3,a4,a6][v] such that [A(t),B(t)] = [φn(P),ψn(P)2] in the function field of E, whose quotient give the abscissa of [n]P. If P is an n-torsion point, then B(t) = 0.
? E = ellinit([17,42]); [t,u] = [114,1218]; ? T = ellxn(E, 2, 'X) %2 = [X^4 - 34*X^2 - 336*X + 289, 4*X^3 + 68*X + 168] ? [a,b] = subst(T,'X,t); %3 = [168416137, 5934096] ? a / b == ellmul(E, [t,u], 2)[1] %4 = 1
The library syntax is
| |
ellzeta(w, {z = 'x}) | |
Computes the value at z of the Weierstrass ζ function attached to
the lattice w as given by
? w = ellperiods([1,I],1); ? ellzeta(w, 1/2) %2 = 1.5707963267948966192313216916397514421 ? E = ellinit([1,0]); ? ellzeta(E, E.omega[1]/2) %4 = 0.84721308479397908660649912348219163647 One can also compute the series expansion around z = 0 (the quasi-periods are useless in this case):
? E = ellinit([0,1]); ? ellzeta(E) \\ at 'x, implicitly at default seriesprecision %4 = x^-1 + 1/35*x^5 - 1/7007*x^11 + O(x^15) ? ellzeta(E, x + O(x^20)) \\ explicit precision %5 = x^-1 + 1/35*x^5 - 1/7007*x^11 + 1/1440257*x^17 + O(x^18)
The library syntax is
| |
ellztopoint(E, z) | |
E being an ell as output by
* If E is defined over a p-adic field and has multiplicative reduction, then z is understood as an element on the Tate curve Qp* / qℤ.
? E = ellinit([0,-1,1,0,0], O(11^5)); ? [u2,u,q] = E.tate; type(u) %2 = "t_PADIC" \\ split multiplicative reduction ? z = ellpointtoz(E, [0,0]) %3 = 3 + 11^2 + 2*11^3 + 3*11^4 + 6*11^5 + 10*11^6 + 8*11^7 + O(11^8) ? ellztopoint(E,z) %4 = [O(11^9), O(11^9)] ? E = ellinit(ellfromj(1/4), O(2^6)); x=1/2; y=ellordinate(E,x)[1]; ? z = ellpointtoz(E,[x,y]); \\ nonsplit: t_POLMOD with t_PADIC coefficients ? P = ellztopoint(E, z); ? P[1] \\ y coordinate is analogous, more complicated %8 = Mod(O(2^4)*x + (2^-1 + O(2^5)), x^2 + (1 + 2^2 + 2^4 + 2^5 + O(2^7))) * If E is defined over the complex numbers (for instance over ℚ), z is understood as a complex number in ℂ/ΛE. If the short Weierstrass equation is y2 = 4x3 - g2x - g3, then [x,y] represents the Weierstrass ℘-function and its derivative. For a general Weierstrass equation we have x = ℘(z) - b2/12, y = ℘'(z)/2 - (a1 x + a3)/2. If z is in the lattice defining E over ℂ, the result is the point at infinity [0].
? E = ellinit([0,1]); P = [2,3]; ? z = ellpointtoz(E, P) %2 = 3.5054552633136356529375476976257353387 ? ellwp(E, z) %3 = 2.0000000000000000000000000000000000000 ? ellztopoint(E, z) - P %4 = [2.548947057811923643 E-57, 7.646841173435770930 E-57] ? ellztopoint(E, 0) %5 = [0] \\ point at infinity
The library syntax is
| |
genus2igusa(PQ, {k}) | |
Let PQ be a polynomial P, resp. a vector [P,Q] of polynomials defined over a field F of characteristic ! = 2. Returns the Igusa invariants [J2,J4,J6,J8,J10] of the hyperelliptic curve C/F, defined by the equation y2 = P(x), resp. y2 + Q(x)*y = P(x). If k is given, only return the invariant of degree k (k must be even between 2 and 10).
? genus2igusa(x^5+3*x^2-4) %1 = [0, 9600, 20736, -23040000, 177926144] ? genus2igusa([x^6+x^5-x^4+3*x^3+x^2-2*x+1,x^3-x^2+x-1]) %2 = [-788, 1958, 341220, -68178781, -662731520] ? genus2igusa([x^6+x^5-x^4+3*x^3+x^2-2*x+1,x^3-x^2+x-1],4) %3 = 1958 ? genus2igusa(x^5+3*Mod(a,a^2-3)*x^2-4) \\ {over ℚ(sqrt{3})} %4 = [Mod(0, a^2 - 3), Mod(9600*a, a^2 - 3), Mod(186624, a^2 - 3), Mod(-69120000, a^2 - 3), Mod(-241864704*a + 204800000, a^2 - 3)] ? a = ffgen(3^4,'a); \\ {over 𝔽3^4 = 𝔽3[a]} ? genus2igusa(x^6+a*x^5-a*x^4+2*x^3+a*x+a+1) %6 = [2*a^2, a^3 + a^2 + a + 1, a^2 + a + 2, 2*a^3 + 2*a^2 + a + 1, 2*a^2 + 2] ? a = ffgen(2^4,'a); \\ {𝔽2^4 = 𝔽2[a]} ? genus2igusa(x^6+a*x^5+a*x^4+a*x+a+1) \\ doesn't work in characteristic 2 *** at top-level: genus2igusa(x^6+a*x^5+a*x^4+a*x+a+1) *** ^ — — — — — — — — — — — — *** genus2igusa: impossible inverse in FF_mul2n: 2.
The library syntax is
| |
genus2red(PQ, {p}) | |
Let PQ be a polynomial P, resp. a vector [P,Q] of polynomials, with rational coefficients. Determines the reduction at p > 2 of the (proper, smooth) genus 2 curve C/ℚ, defined by the hyperelliptic equation y2 = P(x), resp. y2 + Q(x)*y = P(x). (The special fiber Xp of the minimal regular model X of C over ℤ.) If p is omitted, determines the reduction type for all (odd) prime divisors of the discriminant.
This function was rewritten from an implementation of Liu's
algorithm by Cohen and Liu (1994), CAVEAT. The function interface may change: for the time being, it returns [N,FaN, [Pm, Qm], V] where N is either the local conductor at p or the global conductor, FaN is its factorization, y2 +Qm y = Pm defines a minimal model over ℤ and V describes the reduction type at the various considered p. Unfortunately, the program is not complete for p = 2, and we may return the odd part of the conductor only: this is the case if the factorization includes the (impossible) term 2-1; if the factorization contains another power of 2, then this is the exact local conductor at 2 and N is the global conductor.
? default(debuglevel, 1); ? genus2red(x^6 + 3*x^3 + 63, 3) (potential) stable reduction: [1, []] reduction at p: [III{9}] page 184, [3, 3], f = 10 %1 = [59049, Mat([3, 10]), x^6 + 3*x^3 + 63, [3, [1, []], ["[III{9}] page 184", [3, 3]]]] ? [N, FaN, T, V] = genus2red(x^3-x^2-1, x^2-x); \\ X1(13), global reduction p = 13 (potential) stable reduction: [5, [Mod(0, 13), Mod(0, 13)]] reduction at p: [I{0}-II-0] page 159, [], f = 2 ? N %3 = 169 ? FaN %4 = Mat([13, 2]) \\ in particular, good reduction at 2 ! ? T %5 = x^6 + 58*x^5 + 1401*x^4 + 18038*x^3 + 130546*x^2 + 503516*x + 808561 ? V %6 = [[13, [5, [Mod(0, 13), Mod(0, 13)]], ["[I{0}-II-0] page 159", []]]] We now first describe the format of the vector V = Vp in the case where p was specified (local reduction at p): it is a triple [p, stable, red]. The component stable = [type, vecj] contains information about the stable reduction after a field extension; depending on types, the stable reduction is * 1: smooth (i.e. the curve has potentially good reduction). The Jacobian J(C) has potentially good reduction. * 2: an elliptic curve E with an ordinary double point; vecj contains j mod p, the modular invariant of E. The (potential) semi-abelian reduction of J(C) is the extension of an elliptic curve (with modular invariant j mod p) by a torus. * 3: a projective line with two ordinary double points. The Jacobian J(C) has potentially multiplicative reduction. * 4: the union of two projective lines crossing transversally at three points. The Jacobian J(C) has potentially multiplicative reduction. * 5: the union of two elliptic curves E1 and E2 intersecting transversally at one point; vecj contains their modular invariants j1 and j2, which may live in a quadratic extension of 𝔽p and need not be distinct. The Jacobian J(C) has potentially good reduction, isomorphic to the product of the reductions of E1 and E2. * 6: the union of an elliptic curve E and a projective line which has an ordinary double point, and these two components intersect transversally at one point; vecj contains j mod p, the modular invariant of E. The (potential) semi-abelian reduction of J(C) is the extension of an elliptic curve (with modular invariant j mod p) by a torus. * 7: as in type 6, but the two components are both singular. The Jacobian J(C) has potentially multiplicative reduction. The component red = [NUtype, neron] contains two data concerning the reduction at p without any ramified field extension.
The NUtype is a The second datum neron is the group of connected components (over an algebraic closure of 𝔽p) of the Néron model of J(C), given as a finite abelian group (vector of elementary divisors).
If p = 2, the red component may be omitted altogether (and
replaced by Notes about Namikawa-Ueno types.
* A lower index is denoted between braces: for instance,
* If K and K' are Kodaira symbols for singular fibers of elliptic
curves, then
We define a total ordering on Kodaira symbol by fixing
*
* The figure
The library syntax is
| |
hyperellchangecurve(C, m) | |
C being a nonsingular hyperelliptic model of a curve, apply the change of coordinate given by m = [e, [a,b;c,d], H]. If (x,y) is a point on the new model, the corresponding point (X,Y) on C is given by X = (a*x + b) / (c*x + d), Y = e (y + H(x)) / (c*x + d)g+1. C can be given either by a squarefree polynomial P such that C: y2 = P(x) or by a vector [P,Q] such that C: y2 + Q(x) y = P(x) and Q2+4 P is squarefree.
The library syntax is
| |
hyperellcharpoly(X) | |
X being a nonsingular hyperelliptic curve defined over a finite field, return the characteristic polynomial of the Frobenius automorphism. X can be given either by a squarefree polynomial P such that X: y2 = P(x) or by a vector [P,Q] such that X: y2 + Q(x) y = P(x) and Q2+4 P is squarefree.
The library syntax is
| |
hyperelldisc(X) | |
X being a nonsingular hyperelliptic model of a curve, defined over a field of characteristic distinct from 2, returns its discriminant. X can be given either by a squarefree polynomial P such that X has equation y2 = P(x) or by a vector [P,Q] such that X has equation y2 + Q(x) y = P(x) and Q2+4 P is squarefree.
? hyperelldisc([x^3,1]) %1 = -27 ? hyperelldisc(x^5+1) %2 = 800000
The library syntax is
| |
hyperellisoncurve(X, p) | |
X being a nonsingular hyperelliptic model of a curve, test whether the point p is on the curve. X can be given either by a squarefree polynomial P such that X: y2 = P(x) or by a vector [P,Q] such that X: y2 + Q(x) y = P(x) and Q2+4 P is squarefree.
? W = [2*x^6+3*x^5+x^4+x^3-x,x^3+1]; p = [px, py] = [1/3,-14/27]; ? hyperellisoncurve(W, p) %2 = 1 ? [Px,Qx]=subst(W,x,px); py^2+py*Qx == Px %3 = 1
The library syntax is
| |
hyperellminimaldisc(C, {pr}) | |
C being a nonsingular integral hyperelliptic model of a curve, return the minimal discriminant of an integral model of C. If pr is given, it must be a list of primes and the discriminant is then only garanteed minimal at the elements of pr. C can be given either by a squarefree polynomial P such that C: y2 = P(x) or by a vector [P,Q] such that C: y2 + Q(x) y = P(x) and Q2+4 P is squarefree.
? W = [x^6+216*x^3+324,0]; ? D = hyperelldisc(W) %2 = 1828422898924853919744000 ? M = hyperellminimaldisc(W) %4 = 29530050606000
The library syntax is
| |
hyperellminimalmodel(C, {&m}, {pr}) | |
C being a nonsingular integral hyperelliptic model of a curve, return an integral model of C with minimal discriminant. If pr is given, it must be a list of primes and the model is then only garanteed minimal at the elements of pr. If present, m is set to the mapping from the original model to the new one: a three-component vector [e,[a,b;c,d],H] such that if (x,y) is a point on W, the corresponding point on C is given by xC = (a*x+b)/(c*x+d) yC = (e*y+H(x))/(c*x+d)g+1 where g is the genus. C can be given either by a squarefree polynomial P such that C: y2 = P(x) or by a vector [P,Q] such that C: y2 + Q(x) y = P(x) and Q2+4 P is squarefree.
? W = [x^6+216*x^3+324,0]; ? D = hyperelldisc(W) %2 = 1828422898924853919744000 ? Wn = hyperellminimalmodel(W,&M) %3 = [2*x^6+18*x^3+1,x^3]; ? M %4 = [18, [3, 0; 0, 1], 9*x^3] ? hyperelldisc(Wn) %5 = 29530050606000 ? hyperellchangecurve(W, M) %6 = [2*x^6+18*x^3+1,x^3]
The library syntax is
| |
hyperellordinate(H, x) | |
Gives a 0, 1 or 2-component vector containing the y-coordinates of the points of the curve H having x as x-coordinate.
The library syntax is
| |
hyperellpadicfrobenius(Q, q, n) | |
Let X be the curve defined by y2 = Q(x), where Q is a polynomial of degree d over ℚ and q ≥ d is a prime such that X has good reduction at q. Return the matrix of the Frobenius endomorphism ϕ on the crystalline module Dp(X) = ℚp ⨂ H1dR(X/ℚ) with respect to the basis of the given model (ω, x ω,...,xg-1 ω), where ω = dx/(2 y) is the invariant differential, where g is the genus of X (either d = 2 g+1 or d = 2 g+2). The characteristic polynomial of ϕ is the numerator of the zeta-function of the reduction of the curve X modulo q. The matrix is computed to absolute q-adic precision qn. Alternatively, q may be of the form [T,p] where p is a prime, T is a polynomial with integral coefficients whose projection to 𝔽p[t] is irreducible, X is defined over K = ℚ[t]/(T) and has good reduction to the finite field 𝔽q = 𝔽p[t]/(T). The matrix of ϕ on Dq(X) = ℚq ⨂ H1dR(X/K) is computed to absolute p-adic precision pn.
? M=hyperellpadicfrobenius(x^5+'a*x+1,['a^2+1,3],10); ? liftall(M) [48107*a + 38874 9222*a + 54290 41941*a + 8931 39672*a + 28651] [ 21458*a + 4763 3652*a + 22205 31111*a + 42559 39834*a + 40207] [ 13329*a + 4140 45270*a + 25803 1377*a + 32931 55980*a + 21267] [15086*a + 26714 33424*a + 4898 41830*a + 48013 5913*a + 24088] ? centerlift(simplify(liftpol(charpoly(M)))) %8 = x^4+4*x^2+81 ? hyperellcharpoly((x^5+Mod(a,a^2+1)*x+1)*Mod(1,3)) %9 = x^4+4*x^2+81
The library syntax is
| |
hyperellratpoints(X, h, {flag = 0}) | |
X being a nonsingular hyperelliptic curve given by an rational model, return a vector containing the affine rational points on the curve of naive height less than h. If flag = 1, stop as soon as a point is found; return either an empty vector or a vector containing a single point. X is given either by a squarefree polynomial P such that X: y2 = P(x) or by a vector [P,Q] such that X: y2+Q(x) y = P(x) and Q2+4 P is squarefree. The parameter h can be * an integer H: find the points [n/d,y] whose abscissas x = n/d have naive height ( = max(|n|, d)) less than H; * a vector [N,D] with D ≤ N: find the points [n/d,y] with |n| ≤ N, d ≤ D. * a vector [N,[D1,D2]] with D1 < D2 ≤ N find the points [n/d,y] with |n| ≤ N and D1 ≤ d ≤ D2.
The library syntax is
| |
hyperellred(C, {&m}) | |
Let C be a nonsingular integral hyperelliptic model of a curve of positive genus g > 0. Return an integral model of C with the same discriminant but small coefficients, using Cremona-Stoll reduction.
The optional argument m is set to the mapping from the original model to
the new one, given by a three-component vector X = (a*x + b) / (c*x + d), Y = (y + H(x)) / (c*x + d)g+1. C can be given either by a squarefree polynomial P such that C: y2 = P(x) or by a vector [P,Q] such that C: y2 + Q(x) y = P(x) and Q2+4 P is squarefree.
? P = 1001*x^4 + 3704*x^3 + 5136*x^2 + 3163*x + 730; ? hyperellred(P, &m) %2 = [x^3 + 1, 0] ? hyperellchangecurve(P, m) %3 = [x^3 + 1, 0]
The library syntax is
Also available is
| |