Pari/GP Reference Documentation | Contents - Global index - GP keyboard shortcuts |
Elliptic curve structures ellL1 elladd ellak ellan ellanalyticrank ellap ellbil ellcard ellchangecurve ellchangepoint ellchangepointinv ellconvertname elldivpol elleisnum elleta ellformaldifferential ellformalexp ellformallog ellformalpoint ellformalw ellfromeqn ellfromj ellgenerators ellglobalred ellgroup ellheegner ellheight ellheightmatrix ellidentify ellinit ellintegralmodel ellisdivisible ellisogeny ellisogenyapply ellisomat ellisoncurve ellissupersingular ellj elllocalred elllog elllseries ellminimalmodel ellminimaltwist ellmoddegree ellmodulareqn ellmul ellneg ellnonsingularmultiple ellorder ellordinate ellpadicL ellpadicfrobenius ellpadicheight ellpadicheightmatrix ellpadiclog ellpadics2 ellperiods ellpointtoz ellpow ellrootno ellsea ellsearch ellsigma ellsub elltamagawa elltaniyama elltatepairing elltors elltwist ellweilpairing ellwp ellxn ellzeta ellztopoint genus2red hyperellcharpoly hyperellpadicfrobenius | |
Elliptic curve structures | |
An elliptic curve is given by a Weierstrass model y^2+a_1xy+a_3y = x^3+a_2x^2+a_4x+a_6, whose discriminant is non-zero. Affine points on
Given a vector of coefficients [a_1,a_2,a_3,a_4,a_6], the function
| |
ellL1 | |
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 [...]
The library syntax is
| |
elladd | |
Sum of the points z1 and z2 on the elliptic curve corresponding to E.
The library syntax is
| |
ellak | |
Computes the coefficient a_n 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([0,1]); ? ellak(E, 10) %2 = 0 ? e = ellinit([5^4,5^6]); \\ not minimal at 5 ? ellak(e, 5) \\ 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 = 820 ms. ? for(i=1,10^6, ellak(e,5)) \\ 5 is bad, markedly slower time = 1,249 ms. ? for(i=1,10^5,ellak(E,5*i)) time = 977 ms. ? for(i=1,10^5,ellak(e,5*i)) \\ still slower but not so much on average time = 1,008 ms.
The library syntax is
| |
ellan | |
Computes the vector of the first n Fourier coefficients a_k 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 | |
Returns the order of vanishing at s = 1 of the L-function of the
elliptic curve e and the value of the first non-zero 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]
The library syntax is
| |
ellap | |
Let E be an
When the characteristic of the finite field is large, the availability of
the If the curve is defined over ℚ, p must be explicitly given and the function computes the trace of the reduction over 𝔽_p. The trace of Frobenius is also the a_p coefficient in the curve L-series L(E,s) = ∑_n a_n n^{-s}, whence the function name. The equation must be integral at p but need not be minimal at p; of course, a minimal model will be more efficient.
? E = ellinit([0,1]); \\ y^2 = x^3 + 0.x + 1, defined over Q ? ellap(E, 7) \\ 7 necessary here %2 = -4 \\ #E(F_7) = 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 ? Fq = ffgen(ffinit(11,3), 'a); \\ defines F_q := F_{11^3} ? E = ellinit([a+1,a], Fq); \\ y^2 = x^3 + (a+1)x + a, defined over F_q ? 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 \\ non-split 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 non-miminal model ? P3 = idealprimedec(K,3)[1]; ? E3 = ellchangecurve(E, [3,0,0,0]); ? ellap(E, P3) \\ OK: E is minimal at P3 %11 = -2 ? ellap(E3, P3) \\ junk: E3 is not minimal at P3 | 3 %12 = 0
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.
Otherwise, we use Shanks-Mestre's baby-step/giant-step method, which runs in
time Õ(q^{1/4}) using Õ(q^{1/4}) storage, hence becomes
unreasonable when q has about 30 digits. Above this range, the
The library syntax is
| |
ellbil | |
Deprecated alias for
The library syntax is
| |
ellcard | |
Let E be an
When the characteristic of the finite field is large, the availability of
the If the curve is defined over ℚ, p must be explicitly given and the function computes the cardinality of the reduction over 𝔽_p; the equation need not be minimal at p, but a minimal model will be more efficient. The reduction is allowed to be singular, and we return the order of the group of non-singular points in this case.
The library syntax is
| |
ellchangecurve | |
Changes the data for the elliptic curve E
by changing the coordinates using the vector
The library syntax is
| |
ellchangepoint | |
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 | |
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 | |
Converts an elliptic curve name, as found in the
? ellconvertname("123b1") %1 = [123, 1, 1] ? ellconvertname(%) %2 = "123b1"
The library syntax is
| |
elldivpol | |
n-division polynomial f_n for the curve E in the variable v. In standard notation, for any affine point P = (X,Y) on the curve, we have [n]P = (φ_n(P)ψ_n(P) : ω_n(P) : ψ_n(P)^3) for some polynomials φ_n,ω_n,ψ_n in ℤ[a_1,a_2,a_3,a_4,a_6][X,Y]. We have f_n(X) = ψ_n(X) for n odd, and f_n(X) = ψ_n(X,Y) (2Y + a_1X+a_3) for n even. We have f_1 = 1, f_2 = 4X^3 + b_2X^2 + 2b_4 X + b_6, f_3 = 3 X^4 + b_2 X^3 + 3b_4 X^2 + 3 b_6 X + b8, f_4 = f_2(2X^6 + b_2 X^5 + 5b_4 X^4 + 10 b_6 X^3 + 10 b_8 X^2 + (b_2b_8-b_4b_6)X + (b_8b_4 - b_6^2)),... For n ≥ 2, the roots of f_n are the X-coordinates of points in E[n].
The library syntax is
| |
elleisnum | |
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} n^{k-1}q^n / (1-q^n)), 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, 1) %5 = -47.999999999999999999999999999999999998 When flag is non-zero and k = 4 or 6, returns the elliptic invariants g_2 or g_3, such that y^2 = 4x^3 - g_2 x - g_3 is a Weierstrass equation for E.
The library syntax is
| |
elleta | |
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 | |
Let ω := dx / (2y+a_1x+a_3) 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 | |
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 | |
The formal elliptic logarithm is a series L in t K[[t]] such that d L = ω = dx / (2y + a_1x + a_3), 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 | |
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} -a_1 t^{-1} - a_2 - a_3 t +...
y = - t^{-3} -a_1 t^{-2} - a_2t^{-1} -a_3 +...
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 | |
Return the formal power series w attached to the elliptic curve E,
in the variable t:
w(t) = t^3 + a_1 t^4 + (a_2 + a_1^2) t^5 +...+ O(t^{n+3}),
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 | |
Given a genus 1 plane curve, defined by the affine equation f(x,y) = 0,
return the coefficients [a_1,a_2,a_3,a_4,a_6] 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 a^2+b^2 = c^2 and a b = 2 n, then by substituting b by 2 n/a in the first equation, we get ((a^2+(2 n/a)^2)-c^2) a^2 = 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 | |
Returns the coefficients [a_1,a_2,a_3,a_4,a_6] of a fixed elliptic curve with j-invariant j.
The library syntax is
| |
ellgenerators | |
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
The library syntax is
| |
ellglobalred | |
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 c_p, 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 | |
Let E be an If the curve is defined over ℚ, p must be explicitly given and the function computes the structure of the reduction over 𝔽_p; the equation need not be minimal at p, but a minimal model will be more efficient. The reduction is allowed to be singular, and we return the structure of the (cyclic) group of non-singular points in this case.
If the flag is 0 (default), return [d_1] or [d_1, d_2], if d_2 > 1.
If the flag is 1, return 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 d_2 > 1,
the output is [d_1d_2, [d_1,d_2],[P,Q]] where P is
of order d_1 and [P,Q] generates the curve.
Caution. It is not guaranteed that Q has order d_2, which in
the worst case requires an expensive discrete log computation. Only that
? 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, non-cyclic ? 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)]]] If E is defined over ℚ, we allow singular reduction and in this case we return the structure of the group of non-singular points, satisfying #E_{ns}(𝔽_p) = p - a_p.
? 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 \\ non-split multiplicative reduction at 7
The library syntax is
| |
ellheegner | |
Let E be an elliptic curve over the rationals, assumed to be of (analytic) rank 1. This returns a non-torsion 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 | |
Global Néron-Tate height h(P) of the point P on the elliptic curve
E/ℚ, using the normalization in Cremona's Algorithms for modular
elliptic curves. E must be an If the argument Q is present, computes the value of the bilinear form (h(P+Q)-h(P-Q)) / 4.
The library syntax is
| |
ellheightmatrix | |
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 | |
Look up the elliptic curve E, defined by an arbitrary model over ℚ,
in the
The library syntax is
| |
ellinit | |
Initialize an * a 5-component vector [a_1,a_2,a_3,a_4,a_6] defining the elliptic curve with Weierstrass equation Y^2 + a_1 XY + a_3 Y = X^3 + a_2 X^2 + a_4 X + a_6, * a 2-component vector [a_4,a_6] defining the elliptic curve with short Weierstrass equation Y^2 = X^3 + a_4 X + a_6,
* 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,1], 2) \\ over F2: singular curve %4 = [] ? E = ellinit(['a4,'a6] * Mod(1,5)); \\ over F_5[a4,a6], basic support !
The result of a_1,a_2,a_3,a_4,a_6,b_2,b_4,b_6,b_8,c_4,c_6,Δ,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 F_p, 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 | |
Let E be an
The library syntax is
| |
ellisdivisible | |
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. The integer n ≥ 0 may be given as
? 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
The algebraic complexity of the underlying algorithm is in
O(n^4), so it is advisable to first factor n, then use a chain of checks
attached to the prime divisors of n: the function will do it itself unless
n is given in
The library syntax is
| |
ellisogeny | |
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 non-zero elements of G (general case
and more efficient if available). This function returns the
[a_1,a_2,a_3,a_4,a_6] 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 | |
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 | |
Given an elliptic curve E defined over ℚ, compute representatives of the isomorphism classes of elliptic curves ℚ-isogenous to E. The function returns a vector [L,M] where L is a list of triples [E_i, f_i, g_i], where E_i is an elliptic curve in [a_4,a_6] form, f_i: E → E_i is a rational isogeny, g_i: E_i → E is the dual isogeny of f_i, and M is the matrix such that M_{i,j} is the degree of the isogeny between E_i and E_j. Furthermore the first curve E_1 is isomorphic to E by f_1. If the flag fl = 1, the f_i and g_i are not computed, which saves time, and L is the list of the curves E_i.
? 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 f_2 %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 g_2 %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 | |
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
| |
ellissupersingular | |
Return 1 if the elliptic curve E defined over a number field or a finite field is supersingular at p, and 0 otherwise. If the curve is defined over a number field, p must be explicitly given, and must be a prime number, resp. a maximal ideal, if the curve is defined over ℚ, resp. a general number field: 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 = x^3 + 2*x^2 + 3*x + 1 ? [g^n | n <- [1 .. 7^5 - 1], ellissupersingular(g^n)] %2 = [6] ? K = nfinit(y^3-2); P = idealprimedec(K, 2)[1]; ? E = ellinit([y,1], K); ? ellissupersingular(E, P) %5 = 1
The library syntax is
| |
ellj | |
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 | |
Calculates the Kodaira type of the local fiber of the elliptic curve
E at p. E must be an 1 means good reduction (type I_0), 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 I_0^*, 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 c_p.
The library syntax is
| |
elllog | |
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 non-negative
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 F_{2^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 | |
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
| |
ellminimalmodel | |
Let E be an
Else return the (non-principal) Weierstrass class of E, i.e. the class of
∏ 𝔭^{(v_{𝔭}{Δ} - δ_{𝔭}) / 12} where
Δ =
The resulting model has integral coefficients and is everywhere minimal, the
coefficients a_1 and a_3 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 non-principal 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 Z_K %6 = [1]~
The library syntax is
| |
ellminimaltwist | |
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(ellinit(elltwist(E,D))); ? ellglobalred(E2)[1] %5 = 14283
The library syntax is
| |
ellmoddegree | |
e being an elliptic curve defined over ℚ output by
The library syntax is
| |
ellmodulareqn | |
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 | W_N, j | W_N) = 0 for some modular function f = f_N (hand-picked for each fixed N to minimize its size, see below), where W_N(τ) = -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(W_N(τ)) = j(N τ); the function f is invariant under Γ_0(N) and also satisfies * for Atkin type: f | W_N = f; * for canonical type: let s = 12/gcd(12,N-1), then f | W_N = N^s / f. In this case, f has a simple definition: f(τ) = N^s (η(N τ) / η(τ) )^{2 s}, where η is Dedekind's eta function. The following GP function returns values of the classical modular polynomial by eliminating f_N(τ) 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 | |
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 | |
Opposite of the point z on elliptic curve E.
The library syntax is
| |
ellnonsingularmultiple | |
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 non-singular.
? 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 | |
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 non-zero 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 | |
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 | |
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 p^n.
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 L_p 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 L_p^{(r)}(E, χ^s) = ∫_{ℤ_p^*} log_p^r(a) χ^s(a) dμ(a). More precisely: * When E has good supersingular reduction, L_p takes its values in ℚ_p ⨂ H^1_{dR}(E/ℚ) and satisfies (1-p^{-1} F)^{-2} L_p(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 L_p^{(r)}(E,χ^s) in the basis (ω, F(ω)). * When E has ordinary good reduction, this method only defines the projection of L_p(E,χ^s) on the α-eigenspace, where α is the unit eigenvalue for F. This is what the function returns. We have (1- α^{-1})^{-2} L_{p,α}(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)
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
| |
ellpadicfrobenius | |
If p > 2 is a prime and E is a elliptic curve on ℚ with good reduction at p, return the matrix of the Frobenius endomorphism ϕ on the crystalline module D_p(E) = ℚ_p ⨂ H^1_{dR}(E/ℚ) with respect to the basis of the given model (ω, η = x ω), where ω = dx/(2 y+a_1 x+a_3) is the invariant differential. The characteristic polynomial of ϕ is x^2 - a_p x + p. The matrix is computed to absolute p-adic precision p^n.
? 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 | |
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_{dR}(E) := H^1_{dR}(E) ⨂ _ℚ ℚ_p be the ℚ_p vector space spanned by ω (invariant differential dx/(2y+a_1x+a3) related to the given model) and η = x ω. Then the cyclotomic p-adic height associates to P ∈ E(ℚ) an element f ω + gη in D_{dR}. 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 = -(log_E P)^2, where log_E is the logarithm for the formal group of E at p.
If furthermore the model is of the form Y^2 = X^3 + a X + b and P = (x,y),
then
f = log_p(
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,4, P) %2 = [3*5 + 5^2 + 2*5^3 + O(5^4), 5^2 + 4*5^4 + O(5^6)] ? E = ellinit("11a1"); P = [5,5]; \\ torsion point ? ellpadicheight(E,19,6, P) %4 = O(19^6) ? E = ellinit([0,0,1,-4,2]); P = [-2,1]; ? ellpadicheight(E,3,5, P) %6 = [2*3^2 + 2*3^3 + 3^4 + O(3^5), 2*3^2 + 3^4 + 2*3^5 + 3^6 + O(3^7)] ? ellpadicheight(E,3,5, P, elladd(E,P,P)) One can replace the parameter p prime by a vector [p,[a,b]], in which case the routine returns the p-adic number af + bg. When E has good ordinary reduction at p, the "canonical" p-adic height is given by
s2 = ellpadics2(E,p,n); ellpadicheight(E, [p,[1,-s2]], n, P) Since s_2 does not depend on P, it is preferable to compute it only once:
? E = ellinit("5077a1"); p = 5; n = 7; ? s2 = ellpadics2(E,p,n); ? M = ellpadicheightmatrix(E,[p,[1,-s2]], n, E.gen); ? matdet(M) \\ p-adic regulator %4 = 5 + 5^2 + 4*5^3 + 2*5^4 + 2*5^5 + 5^6 + O(5^7)
The library syntax is
| |
ellpadicheightmatrix | |
v being a vector of points, this function outputs the Gram matrix of
v with respect to the cyclotomic p-adic height, given to n p-adic
digits; in other words, the (i,j) component of the matrix is equal to
See
The library syntax is
| |
ellpadiclog | |
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), 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 + a_1x + a_3).
The library syntax is
| |
ellpadics2 | |
If p > 2 is a prime and E/ℚ is a elliptic curve with ordinary good
reduction at p, returns the slope of the unit eigenvector
of This slope is the unique c ∈ 3^{-1}ℤ_p such that the odd solution σ(t) = t + O(t^2) of - d((1)/(σ) (d σ)/(ω)) = (x(t) + c) ω is in tℤ_p[[t]]. It is equal to b_2/12 - E_2/12 where E_2 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 s_2 does not depend on the point P, we compute it only once.
The library syntax is
| |
ellperiods | |
Let w describe a complex period lattice (w = [w_1,w_2]
or an If flag = 1, the function returns [[W_1,W_2], [η_1,η_2]], where η_1 and η_2 are the quasi-periods attached to [W_1,W_2], satisfying η_1 W_2 - η_2 W_1 = 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.
The library syntax is
| |
ellpointtoz | |
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/ℚ_p has multiplicative reduction, then E/ℚ_p is analytically isomorphic to ℚ_p^*/q^ℤ (Tate curve) for some p-adic integer q. The behaviour 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)
The library syntax is
| |
ellpow | |
Deprecated alias for
The library syntax is
| |
ellrootno | |
E being an
The library syntax is
| |
ellsea | |
Let E be an ell structure as output by
* If the characteristic is too small (p ≤ 7) the generic algorithm
* When
In particular, you should set
The availability of the 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(ellinit(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 library syntax is
| |
ellsearch | |
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 | |
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 | |
Difference of the points z1 and z2 on the elliptic curve corresponding to E.
The library syntax is
| |
elltamagawa | |
The object E being an elliptic curve, returns the global Tamagawa number (including the factor at infinite places).
The library syntax is
| |
elltaniyama | |
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 | |
Computes the Tate pairing of the two points P and Q on the elliptic curve E. The point P must be of m-torsion.
The library syntax is
| |
elltors | |
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
| |
elltwist | |
Returns the coefficients [a_1,a_2,a_3,a_4,a_6] of the twist of the
elliptic curve E by the quadratic extension of the coefficient ring
defined by P (when P is a polynomial) or Example: Twist by discriminant -3:
? elltwist(ellinit([0,a2,0,a4,a6]),-3) %1 = [0,-3*a2,0,9*a4,-27*a6] Twist by the Artin-Shreier extension given by x^2+x+T in characteristic 2:
? lift(elltwist(ellinit([a1,a2,a3,a4,a6]*Mod(1,2)),x^2+x+T)) %1 = [a1,a2+a1^2*T,a3,a4,a6+a3^2*T] Twist of an elliptic curve defined over a finite field:
? E=ellinit([1,7]*Mod(1,19));lift(elltwist(E)) %1 = [0,0,0,11,12]
The library syntax is
| |
ellweilpairing | |
Computes the Weil pairing of the two points of m-torsion P and Q on the elliptic curve E.
The library syntax is
| |
ellwp | |
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)].
The library syntax is
| |
ellxn | |
In standard notation, for any affine point P = (v,w) on the curve E, we have [n]P = (φ_n(P)ψ_n(P) : ω_n(P) : ψ_n(P)^3) for some polynomials φ_n,ω_n,ψ_n in ℤ[a_1,a_2,a_3,a_4,a_6][v,w]. This function returns [φ_n(P),ψ_n(P)^2], which give the numerator and denominator of the abcissa of [n]P and depend only on v.
The library syntax is
| |
ellzeta | |
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 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 Q_p^* / 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]); \\ non-split: 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 y^2 = 4x^3 - g_2x - g_3, then [x,y] represents the Weierstrass ℘-function and its derivative. For a general Weierstrass equation we have x = ℘(z) - b_2/12, y = ℘'(z) - (a_1 x + a_3)/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
| |
genus2red | |
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 y^2 = P(x), resp. y^2 + Q(x)*y = P(x). (The special fiber X_p 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, T, V] where N is either the local conductor at p or the global conductor, FaN is its factorization, y^2 = T defines a minimal model over ℤ[1/2] 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); \\ X_1(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 = V_p 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 E_1 and E_2 intersecting transversally at one point; vecj contains their modular invariants j_1 and j_2, 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 E_1 and E_2. * 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
| |
hyperellcharpoly | |
X being a non-singular 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: y^2 = P(x) or by a vector [P,Q] such that X: y^2 + Q(x) y = P(x) and Q^2+4 P is squarefree.
The library syntax is
| |
hyperellpadicfrobenius | |
Let X be the curve defined by y^2 = Q(x), where Q is a polynomial of degree d over ℚ and p ≥ d a prime such that X has good reduction at p return the matrix of the Frobenius endomorphism ϕ on the crystalline module D_p(X) = ℚ_p ⨂ H^1_{dR}(X/ℚ) with respect to the basis of the given model (ω, x ω,...,x^{g-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 p. The matrix is computed to absolute p-adic precision p^n.
The library syntax is
| |