\(p\)-adic \(L\)-functions of elliptic curves

To an elliptic curve \(E\) over the rational numbers and a prime \(p\), one can associate a \(p\)-adic \(L\)-function; at least if \(E\) does not have additive reduction at \(p\). This function is defined by interpolation of L-values of \(E\) at twists. Through the main conjecture of Iwasawa theory it should also be equal to a characteristic series of a certain Selmer group.

If \(E\) is ordinary, then it is an element of the Iwasawa algebra \(\Lambda(\ZZ_p^\times) = \ZZ_p[\Delta][\![T]\!]\), where \(\Delta\) is the group of \((p-1)\)-st roots of unity in \(\ZZ_p^\times\), and \(T = [\gamma] - 1\) where \(\gamma = 1 + p\) is a generator of \(1 + p\ZZ_p\). (There is a slightly different description for \(p = 2\).)

One can decompose this algebra as the direct product of the subalgebras corresponding to the characters of \(\Delta\), which are simply the powers \(\tau^\eta\) (\(0 \le \eta \le p-2\)) of the Teichmueller character \(\tau: \Delta \to \ZZ_p^\times\). Projecting the \(L\)-function into these components gives \(p-1\) power series in \(T\), each with coefficients in \(\ZZ_p\).

If \(E\) is supersingular, the series will have coefficients in a quadratic extension of \(\QQ_p\), and the coefficients will be unbounded. In this case we have only implemented the series for \(\eta = 0\). We have also implemented the \(p\)-adic \(L\)-series as formulated by Perrin-Riou [BP1993], which has coefficients in the Dieudonné module \(D_pE = H^1_{dR}(E/\QQ_p)\) of \(E\). There is a different description by Pollack [Pol2003] which is not available here.

According to the \(p\)-adic version of the Birch and Swinnerton-Dyer conjecture [MTT1986], the order of vanishing of the \(L\)-function at the trivial character (i.e. of the series for \(\eta = 0\) at \(T = 0\)) is just the rank of \(E(\QQ)\), or this rank plus one if the reduction at \(p\) is split multiplicative.

See [SW2013] for more details.

AUTHORS:

  • William Stein (2007-01-01): first version

  • Chris Wuthrich (22/05/2007): changed minor issues and added supersingular things

  • Chris Wuthrich (11/2008): added quadratic_twists

  • David Loeffler (01/2011): added nontrivial Teichmueller components

class sage.schemes.elliptic_curves.padic_lseries.pAdicLseries(E, p, implementation='eclib', normalize='L_ratio')[source]

Bases: SageObject

The \(p\)-adic \(L\)-series of an elliptic curve.

EXAMPLES:

An ordinary example:

sage: e = EllipticCurve('389a')
sage: L = e.padic_lseries(5)
sage: L.series(0)
Traceback (most recent call last):
...
ValueError: n (=0) must be a positive integer
sage: L.series(1)
O(T^1)
sage: L.series(2)
O(5^4) + O(5)*T + (4 + O(5))*T^2 + (2 + O(5))*T^3 + (3 + O(5))*T^4 + O(T^5)
sage: L.series(3, prec=10)
O(5^5) + O(5^2)*T + (4 + 4*5 + O(5^2))*T^2 + (2 + 4*5 + O(5^2))*T^3 + (3 + O(5^2))*T^4 + (1 + O(5))*T^5 + O(5)*T^6 + (4 + O(5))*T^7 + (2 + O(5))*T^8 + O(5)*T^9 + O(T^10)
sage: L.series(2,quadratic_twist=-3)
2 + 4*5 + 4*5^2 + O(5^4) + O(5)*T + (1 + O(5))*T^2 + (4 + O(5))*T^3 + O(5)*T^4 + O(T^5)
>>> from sage.all import *
>>> e = EllipticCurve('389a')
>>> L = e.padic_lseries(Integer(5))
>>> L.series(Integer(0))
Traceback (most recent call last):
...
ValueError: n (=0) must be a positive integer
>>> L.series(Integer(1))
O(T^1)
>>> L.series(Integer(2))
O(5^4) + O(5)*T + (4 + O(5))*T^2 + (2 + O(5))*T^3 + (3 + O(5))*T^4 + O(T^5)
>>> L.series(Integer(3), prec=Integer(10))
O(5^5) + O(5^2)*T + (4 + 4*5 + O(5^2))*T^2 + (2 + 4*5 + O(5^2))*T^3 + (3 + O(5^2))*T^4 + (1 + O(5))*T^5 + O(5)*T^6 + (4 + O(5))*T^7 + (2 + O(5))*T^8 + O(5)*T^9 + O(T^10)
>>> L.series(Integer(2),quadratic_twist=-Integer(3))
2 + 4*5 + 4*5^2 + O(5^4) + O(5)*T + (1 + O(5))*T^2 + (4 + O(5))*T^3 + O(5)*T^4 + O(T^5)
e = EllipticCurve('389a')
L = e.padic_lseries(5)
L.series(0)
L.series(1)
L.series(2)
L.series(3, prec=10)
L.series(2,quadratic_twist=-3)

A prime p such that E[p] is reducible:

sage: L = EllipticCurve('11a').padic_lseries(5)
sage: L.series(1)
5 + O(5^2) + O(T)
sage: L.series(2)
5 + 4*5^2 + O(5^3) + O(5^0)*T + O(5^0)*T^2 + O(5^0)*T^3 + O(5^0)*T^4 + O(T^5)
sage: L.series(3)
5 + 4*5^2 + 4*5^3 + O(5^4) + O(5)*T + O(5)*T^2 + O(5)*T^3 + O(5)*T^4 + O(T^5)
>>> from sage.all import *
>>> L = EllipticCurve('11a').padic_lseries(Integer(5))
>>> L.series(Integer(1))
5 + O(5^2) + O(T)
>>> L.series(Integer(2))
5 + 4*5^2 + O(5^3) + O(5^0)*T + O(5^0)*T^2 + O(5^0)*T^3 + O(5^0)*T^4 + O(T^5)
>>> L.series(Integer(3))
5 + 4*5^2 + 4*5^3 + O(5^4) + O(5)*T + O(5)*T^2 + O(5)*T^3 + O(5)*T^4 + O(T^5)
L = EllipticCurve('11a').padic_lseries(5)
L.series(1)
L.series(2)
L.series(3)

An example showing the calculation of nontrivial Teichmueller twists:

sage: E = EllipticCurve('11a1')
sage: lp = E.padic_lseries(7)
sage: lp.series(4,eta=1)
3 + 7^3 + 6*7^4 + 3*7^5 + O(7^6) + (2*7 + 7^2 + O(7^3))*T + (1 + 5*7^2 + O(7^3))*T^2 + (4 + 4*7 + 4*7^2 + O(7^3))*T^3 + (4 + 3*7 + 7^2 + O(7^3))*T^4 + O(T^5)
sage: lp.series(4,eta=2)
5 + 6*7 + 4*7^2 + 2*7^3 + 3*7^4 + 2*7^5 + O(7^6) + (6 + 4*7 + 7^2 + O(7^3))*T + (3 + 2*7^2 + O(7^3))*T^2 + (1 + 4*7 + 7^2 + O(7^3))*T^3 + (6 + 6*7 + 6*7^2 + O(7^3))*T^4 + O(T^5)
sage: lp.series(4,eta=3)
O(7^6) + (5 + 4*7 + 2*7^2 + O(7^3))*T + (6 + 5*7 + 2*7^2 + O(7^3))*T^2 + (5*7 + O(7^3))*T^3 + (7 + 4*7^2 + O(7^3))*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve('11a1')
>>> lp = E.padic_lseries(Integer(7))
>>> lp.series(Integer(4),eta=Integer(1))
3 + 7^3 + 6*7^4 + 3*7^5 + O(7^6) + (2*7 + 7^2 + O(7^3))*T + (1 + 5*7^2 + O(7^3))*T^2 + (4 + 4*7 + 4*7^2 + O(7^3))*T^3 + (4 + 3*7 + 7^2 + O(7^3))*T^4 + O(T^5)
>>> lp.series(Integer(4),eta=Integer(2))
5 + 6*7 + 4*7^2 + 2*7^3 + 3*7^4 + 2*7^5 + O(7^6) + (6 + 4*7 + 7^2 + O(7^3))*T + (3 + 2*7^2 + O(7^3))*T^2 + (1 + 4*7 + 7^2 + O(7^3))*T^3 + (6 + 6*7 + 6*7^2 + O(7^3))*T^4 + O(T^5)
>>> lp.series(Integer(4),eta=Integer(3))
O(7^6) + (5 + 4*7 + 2*7^2 + O(7^3))*T + (6 + 5*7 + 2*7^2 + O(7^3))*T^2 + (5*7 + O(7^3))*T^3 + (7 + 4*7^2 + O(7^3))*T^4 + O(T^5)
E = EllipticCurve('11a1')
lp = E.padic_lseries(7)
lp.series(4,eta=1)
lp.series(4,eta=2)
lp.series(4,eta=3)

(Note that the last series vanishes at \(T = 0\), which is consistent with

sage: E.quadratic_twist(-7).rank()
1
>>> from sage.all import *
>>> E.quadratic_twist(-Integer(7)).rank()
1
E.quadratic_twist(-7).rank()

This proves that \(E\) has rank 1 over \(\QQ(\zeta_7)\).)

alpha(prec=20)[source]

Return a \(p\)-adic root \(\alpha\) of the polynomial \(x^2 - a_p x + p\) with \(ord_p(\alpha) < 1\). In the ordinary case this is just the unit root.

INPUT:

  • prec – positive integer; the \(p\)-adic precision of the root

EXAMPLES:

Consider the elliptic curve 37a:

sage: E = EllipticCurve('37a')
>>> from sage.all import *
>>> E = EllipticCurve('37a')
E = EllipticCurve('37a')

An ordinary prime:

sage: L = E.padic_lseries(5)
sage: alpha = L.alpha(10); alpha
3 + 2*5 + 4*5^2 + 2*5^3 + 5^4 + 4*5^5 + 2*5^7 + 5^8 + 5^9 + O(5^10)
sage: alpha^2 - E.ap(5)*alpha + 5
O(5^10)
>>> from sage.all import *
>>> L = E.padic_lseries(Integer(5))
>>> alpha = L.alpha(Integer(10)); alpha
3 + 2*5 + 4*5^2 + 2*5^3 + 5^4 + 4*5^5 + 2*5^7 + 5^8 + 5^9 + O(5^10)
>>> alpha**Integer(2) - E.ap(Integer(5))*alpha + Integer(5)
O(5^10)
L = E.padic_lseries(5)
alpha = L.alpha(10); alpha
alpha^2 - E.ap(5)*alpha + 5

A supersingular prime:

sage: L = E.padic_lseries(3)
sage: alpha = L.alpha(10); alpha
alpha + O(alpha^21)
sage: alpha^2 - E.ap(3)*alpha + 3
O(alpha^22)
>>> from sage.all import *
>>> L = E.padic_lseries(Integer(3))
>>> alpha = L.alpha(Integer(10)); alpha
alpha + O(alpha^21)
>>> alpha**Integer(2) - E.ap(Integer(3))*alpha + Integer(3)
O(alpha^22)
L = E.padic_lseries(3)
alpha = L.alpha(10); alpha
alpha^2 - E.ap(3)*alpha + 3

A reducible prime:

sage: L = EllipticCurve('11a').padic_lseries(5)
sage: L.alpha(5)
1 + 4*5 + 3*5^2 + 2*5^3 + 4*5^4 + O(5^5)
>>> from sage.all import *
>>> L = EllipticCurve('11a').padic_lseries(Integer(5))
>>> L.alpha(Integer(5))
1 + 4*5 + 3*5^2 + 2*5^3 + 4*5^4 + O(5^5)
L = EllipticCurve('11a').padic_lseries(5)
L.alpha(5)
elliptic_curve()[source]

Return the elliptic curve to which this \(p\)-adic \(L\)-series is associated.

EXAMPLES:

sage: L = EllipticCurve('11a').padic_lseries(5)
sage: L.elliptic_curve()
Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
>>> from sage.all import *
>>> L = EllipticCurve('11a').padic_lseries(Integer(5))
>>> L.elliptic_curve()
Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
L = EllipticCurve('11a').padic_lseries(5)
L.elliptic_curve()
measure(a, n, prec, quadratic_twist=1, sign=1)[source]

Return the measure on \(\ZZ_p^{\times}\) defined by

\(\mu_{E,\alpha}^+ ( a + p^n \ZZ_p ) = \frac{1}{\alpha^n} \left [\frac{a}{p^n}\right]^{+} - \frac{1}{\alpha^{n+1}} \left[\frac{a}{p^{n-1}}\right]^{+}\)

where \([\cdot]^{+}\) is the modular symbol. This is used to define this \(p\)-adic \(L\)-function (at least when the reduction is good).

The optional argument sign allows the minus symbol \([\cdot]^{-}\) to be substituted for the plus symbol.

The optional argument quadratic_twist replaces \(E\) by the twist in the above formula, but the twisted modular symbol is computed using a sum over modular symbols of \(E\) rather than finding the modular symbols for the twist. Quadratic twists are only implemented if the sign is \(+1\).

Note that the normalization is not correct at this stage: use _quotient_of periods and _quotient_of periods_to_twist to correct.

Note also that this function does not check if the condition on the quadratic_twist=D is satisfied. So the result will only be correct if for each prime \(\ell\) dividing \(D\), we have \(ord_{\ell}(N)<= ord_{\ell}(D)\), where \(N\) is the conductor of the curve.

INPUT:

  • a – integer

  • n – nonnegative integer

  • prec – integer

  • quadratic_twist – (default: 1) a fundamental discriminant of a quadratic field, should be coprime to the conductor of \(E\)

  • sign – integer (default: 1) which should be \(\pm 1\)

EXAMPLES:

sage: E = EllipticCurve('37a')
sage: L = E.padic_lseries(5)
sage: L.measure(1,2, prec=9)
2 + 3*5 + 4*5^3 + 2*5^4 + 3*5^5 + 3*5^6 + 4*5^7 + 4*5^8 + O(5^9)
sage: L.measure(1,2, quadratic_twist=8,prec=15)
O(5^15)
sage: L.measure(1,2, quadratic_twist=-4,prec=15)
4 + 4*5 + 4*5^2 + 3*5^3 + 2*5^4 + 5^5 + 3*5^6 + 5^8 + 2*5^9 + 3*5^12 + 2*5^13 + 4*5^14 + O(5^15)

sage: E = EllipticCurve('11a1')
sage: a = E.quadratic_twist(-3).padic_lseries(5).measure(1,2,prec=15)
sage: b = E.padic_lseries(5).measure(1,2, quadratic_twist=-3,prec=15)
sage: a == b * E.padic_lseries(5)._quotient_of_periods_to_twist(-3)
True
>>> from sage.all import *
>>> E = EllipticCurve('37a')
>>> L = E.padic_lseries(Integer(5))
>>> L.measure(Integer(1),Integer(2), prec=Integer(9))
2 + 3*5 + 4*5^3 + 2*5^4 + 3*5^5 + 3*5^6 + 4*5^7 + 4*5^8 + O(5^9)
>>> L.measure(Integer(1),Integer(2), quadratic_twist=Integer(8),prec=Integer(15))
O(5^15)
>>> L.measure(Integer(1),Integer(2), quadratic_twist=-Integer(4),prec=Integer(15))
4 + 4*5 + 4*5^2 + 3*5^3 + 2*5^4 + 5^5 + 3*5^6 + 5^8 + 2*5^9 + 3*5^12 + 2*5^13 + 4*5^14 + O(5^15)

>>> E = EllipticCurve('11a1')
>>> a = E.quadratic_twist(-Integer(3)).padic_lseries(Integer(5)).measure(Integer(1),Integer(2),prec=Integer(15))
>>> b = E.padic_lseries(Integer(5)).measure(Integer(1),Integer(2), quadratic_twist=-Integer(3),prec=Integer(15))
>>> a == b * E.padic_lseries(Integer(5))._quotient_of_periods_to_twist(-Integer(3))
True
E = EllipticCurve('37a')
L = E.padic_lseries(5)
L.measure(1,2, prec=9)
L.measure(1,2, quadratic_twist=8,prec=15)
L.measure(1,2, quadratic_twist=-4,prec=15)
E = EllipticCurve('11a1')
a = E.quadratic_twist(-3).padic_lseries(5).measure(1,2,prec=15)
b = E.padic_lseries(5).measure(1,2, quadratic_twist=-3,prec=15)
a == b * E.padic_lseries(5)._quotient_of_periods_to_twist(-3)
modular_symbol(r, sign=1, quadratic_twist=1)[source]

Return the modular symbol evaluated at \(r\).

This is used to compute this \(p\)-adic \(L\)-series.

Note that the normalization is not correct at this stage: use _quotient_of periods_to_twist to correct.

Note also that this function does not check if the condition on the quadratic_twist=D is satisfied. So the result will only be correct if for each prime \(\ell\) dividing \(D\), we have \(ord_{\ell}(N)<= ord_{\ell}(D)\), where \(N\) is the conductor of the curve.

INPUT:

  • r – a cusp given as either a rational number or oo

  • sign – +1 (default) or -1 (only implemented without twists)

  • quadratic_twist – a fundamental discriminant of a quadratic field or +1 (default)

EXAMPLES:

sage: E = EllipticCurve('11a1')
sage: lp = E.padic_lseries(5)
sage: [lp.modular_symbol(r) for r in [0,1/5,oo,1/11]]
[1/5, 6/5, 0, 0]
sage: [lp.modular_symbol(r,sign=-1) for r in [0,1/3,oo,1/7]]
[0, 1/2, 0, -1/2]
sage: [lp.modular_symbol(r,quadratic_twist=-20) for r in [0,1/5,oo,1/11]]
[1, 1, 0, 1/2]

sage: E = EllipticCurve('20a1')
sage: Et = E.quadratic_twist(-4)
sage: lpt = Et.padic_lseries(5)
sage: eta = lpt._quotient_of_periods_to_twist(-4)
sage: lpt.modular_symbol(0) == lp.modular_symbol(0,quadratic_twist=-4) / eta
True
>>> from sage.all import *
>>> E = EllipticCurve('11a1')
>>> lp = E.padic_lseries(Integer(5))
>>> [lp.modular_symbol(r) for r in [Integer(0),Integer(1)/Integer(5),oo,Integer(1)/Integer(11)]]
[1/5, 6/5, 0, 0]
>>> [lp.modular_symbol(r,sign=-Integer(1)) for r in [Integer(0),Integer(1)/Integer(3),oo,Integer(1)/Integer(7)]]
[0, 1/2, 0, -1/2]
>>> [lp.modular_symbol(r,quadratic_twist=-Integer(20)) for r in [Integer(0),Integer(1)/Integer(5),oo,Integer(1)/Integer(11)]]
[1, 1, 0, 1/2]

>>> E = EllipticCurve('20a1')
>>> Et = E.quadratic_twist(-Integer(4))
>>> lpt = Et.padic_lseries(Integer(5))
>>> eta = lpt._quotient_of_periods_to_twist(-Integer(4))
>>> lpt.modular_symbol(Integer(0)) == lp.modular_symbol(Integer(0),quadratic_twist=-Integer(4)) / eta
True
E = EllipticCurve('11a1')
lp = E.padic_lseries(5)
[lp.modular_symbol(r) for r in [0,1/5,oo,1/11]]
[lp.modular_symbol(r,sign=-1) for r in [0,1/3,oo,1/7]]
[lp.modular_symbol(r,quadratic_twist=-20) for r in [0,1/5,oo,1/11]]
E = EllipticCurve('20a1')
Et = E.quadratic_twist(-4)
lpt = Et.padic_lseries(5)
eta = lpt._quotient_of_periods_to_twist(-4)
lpt.modular_symbol(0) == lp.modular_symbol(0,quadratic_twist=-4) / eta
order_of_vanishing()[source]

Return the order of vanishing of this \(p\)-adic \(L\)-series.

The output of this function is provably correct, due to a theorem of Kato [Kat2004].

Note

currently \(p\) must be a prime of good ordinary reduction.

REFERENCES:

EXAMPLES:

sage: L = EllipticCurve('11a').padic_lseries(3)
sage: L.order_of_vanishing()
0
sage: L = EllipticCurve('11a').padic_lseries(5)
sage: L.order_of_vanishing()
0
sage: L = EllipticCurve('37a').padic_lseries(5)
sage: L.order_of_vanishing()
1
sage: L = EllipticCurve('43a').padic_lseries(3)
sage: L.order_of_vanishing()
1
sage: L = EllipticCurve('37b').padic_lseries(3)
sage: L.order_of_vanishing()
0
sage: L = EllipticCurve('389a').padic_lseries(3)
sage: L.order_of_vanishing()
2
sage: L = EllipticCurve('389a').padic_lseries(5)
sage: L.order_of_vanishing()
2
sage: L = EllipticCurve('5077a').padic_lseries(5, implementation = 'eclib')
sage: L.order_of_vanishing()
3
>>> from sage.all import *
>>> L = EllipticCurve('11a').padic_lseries(Integer(3))
>>> L.order_of_vanishing()
0
>>> L = EllipticCurve('11a').padic_lseries(Integer(5))
>>> L.order_of_vanishing()
0
>>> L = EllipticCurve('37a').padic_lseries(Integer(5))
>>> L.order_of_vanishing()
1
>>> L = EllipticCurve('43a').padic_lseries(Integer(3))
>>> L.order_of_vanishing()
1
>>> L = EllipticCurve('37b').padic_lseries(Integer(3))
>>> L.order_of_vanishing()
0
>>> L = EllipticCurve('389a').padic_lseries(Integer(3))
>>> L.order_of_vanishing()
2
>>> L = EllipticCurve('389a').padic_lseries(Integer(5))
>>> L.order_of_vanishing()
2
>>> L = EllipticCurve('5077a').padic_lseries(Integer(5), implementation = 'eclib')
>>> L.order_of_vanishing()
3
L = EllipticCurve('11a').padic_lseries(3)
L.order_of_vanishing()
L = EllipticCurve('11a').padic_lseries(5)
L.order_of_vanishing()
L = EllipticCurve('37a').padic_lseries(5)
L.order_of_vanishing()
L = EllipticCurve('43a').padic_lseries(3)
L.order_of_vanishing()
L = EllipticCurve('37b').padic_lseries(3)
L.order_of_vanishing()
L = EllipticCurve('389a').padic_lseries(3)
L.order_of_vanishing()
L = EllipticCurve('389a').padic_lseries(5)
L.order_of_vanishing()
L = EllipticCurve('5077a').padic_lseries(5, implementation = 'eclib')
L.order_of_vanishing()
prime()[source]

Return the prime \(p\) as in \(p\)-adic \(L\)-function’.

EXAMPLES:

sage: L = EllipticCurve('11a').padic_lseries(5)
sage: L.prime()
5
>>> from sage.all import *
>>> L = EllipticCurve('11a').padic_lseries(Integer(5))
>>> L.prime()
5
L = EllipticCurve('11a').padic_lseries(5)
L.prime()
teichmuller(prec)[source]

Return Teichmuller lifts to the given precision.

INPUT:

  • prec – positive integer

OUTPUT: list of \(p\)-adic numbers; the cached Teichmuller lifts

EXAMPLES:

sage: L = EllipticCurve('11a').padic_lseries(7)
sage: L.teichmuller(1)
[0, 1, 2, 3, 4, 5, 6]
sage: L.teichmuller(2)
[0, 1, 30, 31, 18, 19, 48]
>>> from sage.all import *
>>> L = EllipticCurve('11a').padic_lseries(Integer(7))
>>> L.teichmuller(Integer(1))
[0, 1, 2, 3, 4, 5, 6]
>>> L.teichmuller(Integer(2))
[0, 1, 30, 31, 18, 19, 48]
L = EllipticCurve('11a').padic_lseries(7)
L.teichmuller(1)
L.teichmuller(2)
class sage.schemes.elliptic_curves.padic_lseries.pAdicLseriesOrdinary(E, p, implementation='eclib', normalize='L_ratio')[source]

Bases: pAdicLseries

is_ordinary()[source]

Return True if the elliptic curve that this \(L\)-function is attached to is ordinary.

EXAMPLES:

sage: L = EllipticCurve('11a').padic_lseries(5)
sage: L.is_ordinary()
True
>>> from sage.all import *
>>> L = EllipticCurve('11a').padic_lseries(Integer(5))
>>> L.is_ordinary()
True
L = EllipticCurve('11a').padic_lseries(5)
L.is_ordinary()
is_supersingular()[source]

Return True if the elliptic curve that this L function is attached to is supersingular.

EXAMPLES:

sage: L = EllipticCurve('11a').padic_lseries(5)
sage: L.is_supersingular()
False
>>> from sage.all import *
>>> L = EllipticCurve('11a').padic_lseries(Integer(5))
>>> L.is_supersingular()
False
L = EllipticCurve('11a').padic_lseries(5)
L.is_supersingular()
power_series(n=2, quadratic_twist=1, prec=5, eta=0)[source]

Return the \(n\)-th approximation to the \(p\)-adic \(L\)-series, in the component corresponding to the \(\eta\)-th power of the Teichmueller character, as a power series in \(T\) (corresponding to \(\gamma-1\) with \(\gamma=1+p\) as a generator of \(1+p\ZZ_p\)). Each coefficient is a \(p\)-adic number whose precision is provably correct.

Here the normalization of the \(p\)-adic \(L\)-series is chosen such that \(L_p(E,1) = (1-1/\alpha)^2 L(E,1)/\Omega_E\) where \(\alpha\) is the unit root of the characteristic polynomial of Frobenius on \(T_pE\) and \(\Omega_E\) is the Néron period of \(E\).

INPUT:

  • n – (default: 2) a positive integer

  • quadratic_twist – (default: +1) a fundamental discriminant of a quadratic field, coprime to the conductor of the curve

  • prec – (default: 5) maximal number of terms of the series to compute; to compute as many as possible just give a very large number for prec; the result will still be correct.

  • eta – (default: 0) an integer (specifying the power of the Teichmueller character on the group of roots of unity in \(\ZZ_p^\times\))

power_series() is identical to series.

EXAMPLES:

We compute some \(p\)-adic \(L\)-functions associated to the elliptic curve 11a:

sage: E = EllipticCurve('11a')
sage: p = 3
sage: E.is_ordinary(p)
True
sage: L = E.padic_lseries(p)
sage: L.series(3)
2 + 3 + 3^2 + 2*3^3 + O(3^5) + (1 + 3 + O(3^2))*T + (1 + 2*3 + O(3^2))*T^2 + O(3)*T^3 + O(3)*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve('11a')
>>> p = Integer(3)
>>> E.is_ordinary(p)
True
>>> L = E.padic_lseries(p)
>>> L.series(Integer(3))
2 + 3 + 3^2 + 2*3^3 + O(3^5) + (1 + 3 + O(3^2))*T + (1 + 2*3 + O(3^2))*T^2 + O(3)*T^3 + O(3)*T^4 + O(T^5)
E = EllipticCurve('11a')
p = 3
E.is_ordinary(p)
L = E.padic_lseries(p)
L.series(3)

Another example at a prime of bad reduction, where the \(p\)-adic \(L\)-function has an extra 0 (compared to the non \(p\)-adic \(L\)-function):

sage: E = EllipticCurve('11a')
sage: p = 11
sage: E.is_ordinary(p)
True
sage: L = E.padic_lseries(p)
sage: L.series(2)
O(11^4) + (10 + O(11))*T + (6 + O(11))*T^2 + (2 + O(11))*T^3 + (5 + O(11))*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve('11a')
>>> p = Integer(11)
>>> E.is_ordinary(p)
True
>>> L = E.padic_lseries(p)
>>> L.series(Integer(2))
O(11^4) + (10 + O(11))*T + (6 + O(11))*T^2 + (2 + O(11))*T^3 + (5 + O(11))*T^4 + O(T^5)
E = EllipticCurve('11a')
p = 11
E.is_ordinary(p)
L = E.padic_lseries(p)
L.series(2)

We compute a \(p\)-adic \(L\)-function that vanishes to order 2:

sage: E = EllipticCurve('389a')
sage: p = 3
sage: E.is_ordinary(p)
True
sage: L = E.padic_lseries(p)
sage: L.series(1)
O(T^1)
sage: L.series(2)
O(3^4) + O(3)*T + (2 + O(3))*T^2 + O(T^3)
sage: L.series(3)
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + (1 + O(3))*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve('389a')
>>> p = Integer(3)
>>> E.is_ordinary(p)
True
>>> L = E.padic_lseries(p)
>>> L.series(Integer(1))
O(T^1)
>>> L.series(Integer(2))
O(3^4) + O(3)*T + (2 + O(3))*T^2 + O(T^3)
>>> L.series(Integer(3))
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + (1 + O(3))*T^4 + O(T^5)
E = EllipticCurve('389a')
p = 3
E.is_ordinary(p)
L = E.padic_lseries(p)
L.series(1)
L.series(2)
L.series(3)

Checks if the precision can be changed (Issue #5846):

sage: L.series(3,prec=4)
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + O(T^4)
sage: L.series(3,prec=6)
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + (1 + O(3))*T^4 + (1 + O(3))*T^5 + O(T^6)
>>> from sage.all import *
>>> L.series(Integer(3),prec=Integer(4))
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + O(T^4)
>>> L.series(Integer(3),prec=Integer(6))
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + (1 + O(3))*T^4 + (1 + O(3))*T^5 + O(T^6)
L.series(3,prec=4)
L.series(3,prec=6)

Rather than computing the \(p\)-adic \(L\)-function for the curve ‘15523a1’, one can compute it as a quadratic_twist:

sage: E = EllipticCurve('43a1')
sage: lp = E.padic_lseries(3)
sage: lp.series(2,quadratic_twist=-19)
2 + 2*3 + 2*3^2 + O(3^4) + (1 + O(3))*T + (1 + O(3))*T^2 + O(T^3)
sage: E.quadratic_twist(-19).label()    # optional -- database_cremona_ellcurve
'15523a1'
>>> from sage.all import *
>>> E = EllipticCurve('43a1')
>>> lp = E.padic_lseries(Integer(3))
>>> lp.series(Integer(2),quadratic_twist=-Integer(19))
2 + 2*3 + 2*3^2 + O(3^4) + (1 + O(3))*T + (1 + O(3))*T^2 + O(T^3)
>>> E.quadratic_twist(-Integer(19)).label()    # optional -- database_cremona_ellcurve
'15523a1'
E = EllipticCurve('43a1')
lp = E.padic_lseries(3)
lp.series(2,quadratic_twist=-19)
E.quadratic_twist(-19).label()    # optional -- database_cremona_ellcurve

This proves that the rank of ‘15523a1’ is zero, even if mwrank cannot determine this.

We calculate the \(L\)-series in the nontrivial Teichmueller components:

sage: L = EllipticCurve('110a1').padic_lseries(5, implementation='sage')
sage: for j in [0..3]: print(L.series(4, eta=j))
O(5^6) + (2 + 2*5 + 2*5^2 + O(5^3))*T + (5 + 5^2 + O(5^3))*T^2 + (4 + 4*5 + 2*5^2 + O(5^3))*T^3 + (1 + 5 + 3*5^2 + O(5^3))*T^4 + O(T^5)
4 + 3*5 + 2*5^2 + 3*5^3 + 5^4 + O(5^6) + (1 + 3*5 + 4*5^2 + O(5^3))*T + (3 + 4*5 + 3*5^2 + O(5^3))*T^2 + (3 + 3*5^2 + O(5^3))*T^3 + (1 + 2*5 + 2*5^2 + O(5^3))*T^4 + O(T^5)
2 + O(5^6) + (1 + 5 + O(5^3))*T + (2 + 4*5 + 3*5^2 + O(5^3))*T^2 + (4 + 5 + 2*5^2 + O(5^3))*T^3 + (4 + O(5^3))*T^4 + O(T^5)
3 + 5 + 2*5^2 + 5^3 + 3*5^4 + 4*5^5 + O(5^6) + (1 + 2*5 + 4*5^2 + O(5^3))*T + (1 + 4*5 + O(5^3))*T^2 + (3 + 2*5 + 2*5^2 + O(5^3))*T^3 + (5 + 5^2 + O(5^3))*T^4 + O(T^5)
>>> from sage.all import *
>>> L = EllipticCurve('110a1').padic_lseries(Integer(5), implementation='sage')
>>> for j in (ellipsis_range(Integer(0),Ellipsis,Integer(3))): print(L.series(Integer(4), eta=j))
O(5^6) + (2 + 2*5 + 2*5^2 + O(5^3))*T + (5 + 5^2 + O(5^3))*T^2 + (4 + 4*5 + 2*5^2 + O(5^3))*T^3 + (1 + 5 + 3*5^2 + O(5^3))*T^4 + O(T^5)
4 + 3*5 + 2*5^2 + 3*5^3 + 5^4 + O(5^6) + (1 + 3*5 + 4*5^2 + O(5^3))*T + (3 + 4*5 + 3*5^2 + O(5^3))*T^2 + (3 + 3*5^2 + O(5^3))*T^3 + (1 + 2*5 + 2*5^2 + O(5^3))*T^4 + O(T^5)
2 + O(5^6) + (1 + 5 + O(5^3))*T + (2 + 4*5 + 3*5^2 + O(5^3))*T^2 + (4 + 5 + 2*5^2 + O(5^3))*T^3 + (4 + O(5^3))*T^4 + O(T^5)
3 + 5 + 2*5^2 + 5^3 + 3*5^4 + 4*5^5 + O(5^6) + (1 + 2*5 + 4*5^2 + O(5^3))*T + (1 + 4*5 + O(5^3))*T^2 + (3 + 2*5 + 2*5^2 + O(5^3))*T^3 + (5 + 5^2 + O(5^3))*T^4 + O(T^5)
L = EllipticCurve('110a1').padic_lseries(5, implementation='sage')
for j in [0..3]: print(L.series(4, eta=j))

It should now also work with \(p=2\) (Issue #20798):

sage: E = EllipticCurve("53a1")
sage: lp = E.padic_lseries(2)
sage: lp.series(7)
O(2^8) + (1 + 2^2 + 2^3 + O(2^5))*T + (1 + 2^3 + O(2^4))*T^2 + (2^2 + 2^3 + O(2^4))*T^3 + (2 + 2^2 + O(2^3))*T^4 + O(T^5)

sage: E = EllipticCurve("109a1")
sage: lp = E.padic_lseries(2)
sage: lp.series(6)
2^2 + 2^6 + O(2^7) + (2 + O(2^4))*T + O(2^3)*T^2 + (2^2 + O(2^3))*T^3 + (2 + O(2^2))*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve("53a1")
>>> lp = E.padic_lseries(Integer(2))
>>> lp.series(Integer(7))
O(2^8) + (1 + 2^2 + 2^3 + O(2^5))*T + (1 + 2^3 + O(2^4))*T^2 + (2^2 + 2^3 + O(2^4))*T^3 + (2 + 2^2 + O(2^3))*T^4 + O(T^5)

>>> E = EllipticCurve("109a1")
>>> lp = E.padic_lseries(Integer(2))
>>> lp.series(Integer(6))
2^2 + 2^6 + O(2^7) + (2 + O(2^4))*T + O(2^3)*T^2 + (2^2 + O(2^3))*T^3 + (2 + O(2^2))*T^4 + O(T^5)
E = EllipticCurve("53a1")
lp = E.padic_lseries(2)
lp.series(7)
E = EllipticCurve("109a1")
lp = E.padic_lseries(2)
lp.series(6)

Check that twists by odd Teichmuller characters are ok (Issue #32258):

sage: E = EllipticCurve("443c1")
sage: lp = E.padic_lseries(17, implementation='num')
sage: l8 = lp.series(2,eta=8,prec=3)
sage: l8.list()[0] - 1/lp.alpha()
O(17^4)
sage: lp = E.padic_lseries(2, implementation='num')
sage: l1 = lp.series(8,eta=1,prec=3)
sage: l1.list()[0] - 4/lp.alpha()^2
O(2^9)
>>> from sage.all import *
>>> E = EllipticCurve("443c1")
>>> lp = E.padic_lseries(Integer(17), implementation='num')
>>> l8 = lp.series(Integer(2),eta=Integer(8),prec=Integer(3))
>>> l8.list()[Integer(0)] - Integer(1)/lp.alpha()
O(17^4)
>>> lp = E.padic_lseries(Integer(2), implementation='num')
>>> l1 = lp.series(Integer(8),eta=Integer(1),prec=Integer(3))
>>> l1.list()[Integer(0)] - Integer(4)/lp.alpha()**Integer(2)
O(2^9)
E = EllipticCurve("443c1")
lp = E.padic_lseries(17, implementation='num')
l8 = lp.series(2,eta=8,prec=3)
l8.list()[0] - 1/lp.alpha()
lp = E.padic_lseries(2, implementation='num')
l1 = lp.series(8,eta=1,prec=3)
l1.list()[0] - 4/lp.alpha()^2
series(n=2, quadratic_twist=1, prec=5, eta=0)[source]

Return the \(n\)-th approximation to the \(p\)-adic \(L\)-series, in the component corresponding to the \(\eta\)-th power of the Teichmueller character, as a power series in \(T\) (corresponding to \(\gamma-1\) with \(\gamma=1+p\) as a generator of \(1+p\ZZ_p\)). Each coefficient is a \(p\)-adic number whose precision is provably correct.

Here the normalization of the \(p\)-adic \(L\)-series is chosen such that \(L_p(E,1) = (1-1/\alpha)^2 L(E,1)/\Omega_E\) where \(\alpha\) is the unit root of the characteristic polynomial of Frobenius on \(T_pE\) and \(\Omega_E\) is the Néron period of \(E\).

INPUT:

  • n – (default: 2) a positive integer

  • quadratic_twist – (default: +1) a fundamental discriminant of a quadratic field, coprime to the conductor of the curve

  • prec – (default: 5) maximal number of terms of the series to compute; to compute as many as possible just give a very large number for prec; the result will still be correct.

  • eta – (default: 0) an integer (specifying the power of the Teichmueller character on the group of roots of unity in \(\ZZ_p^\times\))

power_series() is identical to series.

EXAMPLES:

We compute some \(p\)-adic \(L\)-functions associated to the elliptic curve 11a:

sage: E = EllipticCurve('11a')
sage: p = 3
sage: E.is_ordinary(p)
True
sage: L = E.padic_lseries(p)
sage: L.series(3)
2 + 3 + 3^2 + 2*3^3 + O(3^5) + (1 + 3 + O(3^2))*T + (1 + 2*3 + O(3^2))*T^2 + O(3)*T^3 + O(3)*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve('11a')
>>> p = Integer(3)
>>> E.is_ordinary(p)
True
>>> L = E.padic_lseries(p)
>>> L.series(Integer(3))
2 + 3 + 3^2 + 2*3^3 + O(3^5) + (1 + 3 + O(3^2))*T + (1 + 2*3 + O(3^2))*T^2 + O(3)*T^3 + O(3)*T^4 + O(T^5)
E = EllipticCurve('11a')
p = 3
E.is_ordinary(p)
L = E.padic_lseries(p)
L.series(3)

Another example at a prime of bad reduction, where the \(p\)-adic \(L\)-function has an extra 0 (compared to the non \(p\)-adic \(L\)-function):

sage: E = EllipticCurve('11a')
sage: p = 11
sage: E.is_ordinary(p)
True
sage: L = E.padic_lseries(p)
sage: L.series(2)
O(11^4) + (10 + O(11))*T + (6 + O(11))*T^2 + (2 + O(11))*T^3 + (5 + O(11))*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve('11a')
>>> p = Integer(11)
>>> E.is_ordinary(p)
True
>>> L = E.padic_lseries(p)
>>> L.series(Integer(2))
O(11^4) + (10 + O(11))*T + (6 + O(11))*T^2 + (2 + O(11))*T^3 + (5 + O(11))*T^4 + O(T^5)
E = EllipticCurve('11a')
p = 11
E.is_ordinary(p)
L = E.padic_lseries(p)
L.series(2)

We compute a \(p\)-adic \(L\)-function that vanishes to order 2:

sage: E = EllipticCurve('389a')
sage: p = 3
sage: E.is_ordinary(p)
True
sage: L = E.padic_lseries(p)
sage: L.series(1)
O(T^1)
sage: L.series(2)
O(3^4) + O(3)*T + (2 + O(3))*T^2 + O(T^3)
sage: L.series(3)
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + (1 + O(3))*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve('389a')
>>> p = Integer(3)
>>> E.is_ordinary(p)
True
>>> L = E.padic_lseries(p)
>>> L.series(Integer(1))
O(T^1)
>>> L.series(Integer(2))
O(3^4) + O(3)*T + (2 + O(3))*T^2 + O(T^3)
>>> L.series(Integer(3))
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + (1 + O(3))*T^4 + O(T^5)
E = EllipticCurve('389a')
p = 3
E.is_ordinary(p)
L = E.padic_lseries(p)
L.series(1)
L.series(2)
L.series(3)

Checks if the precision can be changed (Issue #5846):

sage: L.series(3,prec=4)
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + O(T^4)
sage: L.series(3,prec=6)
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + (1 + O(3))*T^4 + (1 + O(3))*T^5 + O(T^6)
>>> from sage.all import *
>>> L.series(Integer(3),prec=Integer(4))
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + O(T^4)
>>> L.series(Integer(3),prec=Integer(6))
O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + (1 + O(3))*T^4 + (1 + O(3))*T^5 + O(T^6)
L.series(3,prec=4)
L.series(3,prec=6)

Rather than computing the \(p\)-adic \(L\)-function for the curve ‘15523a1’, one can compute it as a quadratic_twist:

sage: E = EllipticCurve('43a1')
sage: lp = E.padic_lseries(3)
sage: lp.series(2,quadratic_twist=-19)
2 + 2*3 + 2*3^2 + O(3^4) + (1 + O(3))*T + (1 + O(3))*T^2 + O(T^3)
sage: E.quadratic_twist(-19).label()    # optional -- database_cremona_ellcurve
'15523a1'
>>> from sage.all import *
>>> E = EllipticCurve('43a1')
>>> lp = E.padic_lseries(Integer(3))
>>> lp.series(Integer(2),quadratic_twist=-Integer(19))
2 + 2*3 + 2*3^2 + O(3^4) + (1 + O(3))*T + (1 + O(3))*T^2 + O(T^3)
>>> E.quadratic_twist(-Integer(19)).label()    # optional -- database_cremona_ellcurve
'15523a1'
E = EllipticCurve('43a1')
lp = E.padic_lseries(3)
lp.series(2,quadratic_twist=-19)
E.quadratic_twist(-19).label()    # optional -- database_cremona_ellcurve

This proves that the rank of ‘15523a1’ is zero, even if mwrank cannot determine this.

We calculate the \(L\)-series in the nontrivial Teichmueller components:

sage: L = EllipticCurve('110a1').padic_lseries(5, implementation='sage')
sage: for j in [0..3]: print(L.series(4, eta=j))
O(5^6) + (2 + 2*5 + 2*5^2 + O(5^3))*T + (5 + 5^2 + O(5^3))*T^2 + (4 + 4*5 + 2*5^2 + O(5^3))*T^3 + (1 + 5 + 3*5^2 + O(5^3))*T^4 + O(T^5)
4 + 3*5 + 2*5^2 + 3*5^3 + 5^4 + O(5^6) + (1 + 3*5 + 4*5^2 + O(5^3))*T + (3 + 4*5 + 3*5^2 + O(5^3))*T^2 + (3 + 3*5^2 + O(5^3))*T^3 + (1 + 2*5 + 2*5^2 + O(5^3))*T^4 + O(T^5)
2 + O(5^6) + (1 + 5 + O(5^3))*T + (2 + 4*5 + 3*5^2 + O(5^3))*T^2 + (4 + 5 + 2*5^2 + O(5^3))*T^3 + (4 + O(5^3))*T^4 + O(T^5)
3 + 5 + 2*5^2 + 5^3 + 3*5^4 + 4*5^5 + O(5^6) + (1 + 2*5 + 4*5^2 + O(5^3))*T + (1 + 4*5 + O(5^3))*T^2 + (3 + 2*5 + 2*5^2 + O(5^3))*T^3 + (5 + 5^2 + O(5^3))*T^4 + O(T^5)
>>> from sage.all import *
>>> L = EllipticCurve('110a1').padic_lseries(Integer(5), implementation='sage')
>>> for j in (ellipsis_range(Integer(0),Ellipsis,Integer(3))): print(L.series(Integer(4), eta=j))
O(5^6) + (2 + 2*5 + 2*5^2 + O(5^3))*T + (5 + 5^2 + O(5^3))*T^2 + (4 + 4*5 + 2*5^2 + O(5^3))*T^3 + (1 + 5 + 3*5^2 + O(5^3))*T^4 + O(T^5)
4 + 3*5 + 2*5^2 + 3*5^3 + 5^4 + O(5^6) + (1 + 3*5 + 4*5^2 + O(5^3))*T + (3 + 4*5 + 3*5^2 + O(5^3))*T^2 + (3 + 3*5^2 + O(5^3))*T^3 + (1 + 2*5 + 2*5^2 + O(5^3))*T^4 + O(T^5)
2 + O(5^6) + (1 + 5 + O(5^3))*T + (2 + 4*5 + 3*5^2 + O(5^3))*T^2 + (4 + 5 + 2*5^2 + O(5^3))*T^3 + (4 + O(5^3))*T^4 + O(T^5)
3 + 5 + 2*5^2 + 5^3 + 3*5^4 + 4*5^5 + O(5^6) + (1 + 2*5 + 4*5^2 + O(5^3))*T + (1 + 4*5 + O(5^3))*T^2 + (3 + 2*5 + 2*5^2 + O(5^3))*T^3 + (5 + 5^2 + O(5^3))*T^4 + O(T^5)
L = EllipticCurve('110a1').padic_lseries(5, implementation='sage')
for j in [0..3]: print(L.series(4, eta=j))

It should now also work with \(p=2\) (Issue #20798):

sage: E = EllipticCurve("53a1")
sage: lp = E.padic_lseries(2)
sage: lp.series(7)
O(2^8) + (1 + 2^2 + 2^3 + O(2^5))*T + (1 + 2^3 + O(2^4))*T^2 + (2^2 + 2^3 + O(2^4))*T^3 + (2 + 2^2 + O(2^3))*T^4 + O(T^5)

sage: E = EllipticCurve("109a1")
sage: lp = E.padic_lseries(2)
sage: lp.series(6)
2^2 + 2^6 + O(2^7) + (2 + O(2^4))*T + O(2^3)*T^2 + (2^2 + O(2^3))*T^3 + (2 + O(2^2))*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve("53a1")
>>> lp = E.padic_lseries(Integer(2))
>>> lp.series(Integer(7))
O(2^8) + (1 + 2^2 + 2^3 + O(2^5))*T + (1 + 2^3 + O(2^4))*T^2 + (2^2 + 2^3 + O(2^4))*T^3 + (2 + 2^2 + O(2^3))*T^4 + O(T^5)

>>> E = EllipticCurve("109a1")
>>> lp = E.padic_lseries(Integer(2))
>>> lp.series(Integer(6))
2^2 + 2^6 + O(2^7) + (2 + O(2^4))*T + O(2^3)*T^2 + (2^2 + O(2^3))*T^3 + (2 + O(2^2))*T^4 + O(T^5)
E = EllipticCurve("53a1")
lp = E.padic_lseries(2)
lp.series(7)
E = EllipticCurve("109a1")
lp = E.padic_lseries(2)
lp.series(6)

Check that twists by odd Teichmuller characters are ok (Issue #32258):

sage: E = EllipticCurve("443c1")
sage: lp = E.padic_lseries(17, implementation='num')
sage: l8 = lp.series(2,eta=8,prec=3)
sage: l8.list()[0] - 1/lp.alpha()
O(17^4)
sage: lp = E.padic_lseries(2, implementation='num')
sage: l1 = lp.series(8,eta=1,prec=3)
sage: l1.list()[0] - 4/lp.alpha()^2
O(2^9)
>>> from sage.all import *
>>> E = EllipticCurve("443c1")
>>> lp = E.padic_lseries(Integer(17), implementation='num')
>>> l8 = lp.series(Integer(2),eta=Integer(8),prec=Integer(3))
>>> l8.list()[Integer(0)] - Integer(1)/lp.alpha()
O(17^4)
>>> lp = E.padic_lseries(Integer(2), implementation='num')
>>> l1 = lp.series(Integer(8),eta=Integer(1),prec=Integer(3))
>>> l1.list()[Integer(0)] - Integer(4)/lp.alpha()**Integer(2)
O(2^9)
E = EllipticCurve("443c1")
lp = E.padic_lseries(17, implementation='num')
l8 = lp.series(2,eta=8,prec=3)
l8.list()[0] - 1/lp.alpha()
lp = E.padic_lseries(2, implementation='num')
l1 = lp.series(8,eta=1,prec=3)
l1.list()[0] - 4/lp.alpha()^2
class sage.schemes.elliptic_curves.padic_lseries.pAdicLseriesSupersingular(E, p, implementation='eclib', normalize='L_ratio')[source]

Bases: pAdicLseries

Dp_valued_height(prec=20)[source]

Return the canonical \(p\)-adic height with values in the Dieudonné module \(D_p(E)\).

It is defined to be

\(h_{\eta} \cdot \omega - h_{\omega} \cdot \eta\)

where \(h_{\eta}\) is made out of the sigma function of Bernardi and \(h_{\omega}\) is \(log_E^2\).

The answer v is given as v[1]*omega + v[2]*eta. The coordinates of v are dependent of the Weierstrass equation.

EXAMPLES:

sage: E = EllipticCurve('53a')
sage: L = E.padic_lseries(5)
sage: h = L.Dp_valued_height(7)
sage: h(E.gens()[0])
(3*5 + 5^2 + 2*5^3 + 3*5^4 + 4*5^5 + 5^6 + 5^7 + O(5^8), 5^2 + 4*5^4 + 2*5^7 + 3*5^8 + O(5^9))
>>> from sage.all import *
>>> E = EllipticCurve('53a')
>>> L = E.padic_lseries(Integer(5))
>>> h = L.Dp_valued_height(Integer(7))
>>> h(E.gens()[Integer(0)])
(3*5 + 5^2 + 2*5^3 + 3*5^4 + 4*5^5 + 5^6 + 5^7 + O(5^8), 5^2 + 4*5^4 + 2*5^7 + 3*5^8 + O(5^9))
E = EllipticCurve('53a')
L = E.padic_lseries(5)
h = L.Dp_valued_height(7)
h(E.gens()[0])
Dp_valued_regulator(prec=20, v1=0, v2=0)[source]

Return the canonical \(p\)-adic regulator with values in the Dieudonné module \(D_p(E)\) as defined by Perrin-Riou using the \(p\)-adic height with values in \(D_p(E)\).

The result is written in the basis \(\omega\), \(\varphi(\omega)\), and hence the coordinates of the result are independent of the chosen Weierstrass equation.

Note

The definition here is corrected with respect to Perrin-Riou’s article [PR2003]. See [SW2013].

EXAMPLES:

sage: E = EllipticCurve('43a')
sage: L = E.padic_lseries(7)
sage: L.Dp_valued_regulator(7)
(5*7 + 6*7^2 + 4*7^3 + 4*7^4 + 7^5 + 4*7^7 + O(7^8), 4*7^2 + 2*7^3 + 3*7^4 + 7^5 + 6*7^6 + 4*7^7 + O(7^8))
>>> from sage.all import *
>>> E = EllipticCurve('43a')
>>> L = E.padic_lseries(Integer(7))
>>> L.Dp_valued_regulator(Integer(7))
(5*7 + 6*7^2 + 4*7^3 + 4*7^4 + 7^5 + 4*7^7 + O(7^8), 4*7^2 + 2*7^3 + 3*7^4 + 7^5 + 6*7^6 + 4*7^7 + O(7^8))
E = EllipticCurve('43a')
L = E.padic_lseries(7)
L.Dp_valued_regulator(7)
Dp_valued_series(n=3, quadratic_twist=1, prec=5)[source]

Return a vector of two components which are \(p\)-adic power series.

The answer v is such that

\((1-\varphi)^{-2}\cdot L_p(E,T) =\) v[1] \(\cdot \omega +\) v[2] \(\cdot \varphi(\omega)\)

as an element of the Dieudonné module \(D_p(E) = H^1_{dR}(E/\QQ_p)\) where \(\omega\) is the invariant differential and \(\varphi\) is the Frobenius on \(D_p(E)\).

According to the \(p\)-adic Birch and Swinnerton-Dyer conjecture [BP1993] this function has a zero of order rank of \(E(\QQ)\) and it’s leading term is contains the order of the Tate-Shafarevich group, the Tamagawa numbers, the order of the torsion subgroup and the \(D_p\)-valued \(p\)-adic regulator.

INPUT:

  • n – (default: 3) a positive integer

  • prec – (default: 5) a positive integer

EXAMPLES:

sage: E = EllipticCurve('14a')
sage: L = E.padic_lseries(5)
sage: L.Dp_valued_series(4)  # long time (9s on sage.math, 2011)
(1 + 4*5 + O(5^2) + (4 + O(5))*T + (1 + O(5))*T^2 + (4 + O(5))*T^3 + (2 + O(5))*T^4 + O(T^5), 5^2 + O(5^3) + O(5^2)*T + (4*5 + O(5^2))*T^2 + (2*5 + O(5^2))*T^3 + (2 + 2*5 + O(5^2))*T^4 + O(T^5))
>>> from sage.all import *
>>> E = EllipticCurve('14a')
>>> L = E.padic_lseries(Integer(5))
>>> L.Dp_valued_series(Integer(4))  # long time (9s on sage.math, 2011)
(1 + 4*5 + O(5^2) + (4 + O(5))*T + (1 + O(5))*T^2 + (4 + O(5))*T^3 + (2 + O(5))*T^4 + O(T^5), 5^2 + O(5^3) + O(5^2)*T + (4*5 + O(5^2))*T^2 + (2*5 + O(5^2))*T^3 + (2 + 2*5 + O(5^2))*T^4 + O(T^5))
E = EllipticCurve('14a')
L = E.padic_lseries(5)
L.Dp_valued_series(4)  # long time (9s on sage.math, 2011)
bernardi_sigma_function(prec=20)[source]

Return the \(p\)-adic sigma function of Bernardi in terms of \(z = log(t)\).

This is the same as padic_sigma with E2 = 0.

EXAMPLES:

sage: E = EllipticCurve('14a')
sage: L = E.padic_lseries(5)
sage: L.bernardi_sigma_function(prec=5) # Todo: some sort of consistency check!?
z + 1/24*z^3 + 29/384*z^5 - 8399/322560*z^7 - 291743/92897280*z^9 + O(z^10)
>>> from sage.all import *
>>> E = EllipticCurve('14a')
>>> L = E.padic_lseries(Integer(5))
>>> L.bernardi_sigma_function(prec=Integer(5)) # Todo: some sort of consistency check!?
z + 1/24*z^3 + 29/384*z^5 - 8399/322560*z^7 - 291743/92897280*z^9 + O(z^10)
E = EllipticCurve('14a')
L = E.padic_lseries(5)
L.bernardi_sigma_function(prec=5) # Todo: some sort of consistency check!?
frobenius(prec=20, algorithm='mw')[source]

Return a geometric Frobenius \(\varphi\) on the Dieudonné module \(D_p(E)\) with respect to the basis \(\omega\), the invariant differential, and \(\eta=x\omega\).

It satisfies \(\varphi^2 - a_p/p\, \varphi + 1/p = 0\).

INPUT:

  • prec – (default: 20) a positive integer

  • algorithm – either ‘mw’ (default) for Monsky-Washnitzer or ‘approx’ for the algorithm described by Bernardi and Perrin-Riou (much slower and not fully tested)

EXAMPLES:

sage: E = EllipticCurve('14a')
sage: L = E.padic_lseries(5)
sage: phi = L.frobenius(5)
sage: phi
[                  2 + 5^2 + 5^4 + O(5^5)    3*5^-1 + 3 + 5 + 4*5^2 + 5^3 + O(5^4)]
[      3 + 3*5^2 + 4*5^3 + 3*5^4 + O(5^5) 3 + 4*5 + 3*5^2 + 4*5^3 + 3*5^4 + O(5^5)]
sage: -phi^2
[5^-1 + O(5^4)        O(5^4)]
[       O(5^5) 5^-1 + O(5^4)]
>>> from sage.all import *
>>> E = EllipticCurve('14a')
>>> L = E.padic_lseries(Integer(5))
>>> phi = L.frobenius(Integer(5))
>>> phi
[                  2 + 5^2 + 5^4 + O(5^5)    3*5^-1 + 3 + 5 + 4*5^2 + 5^3 + O(5^4)]
[      3 + 3*5^2 + 4*5^3 + 3*5^4 + O(5^5) 3 + 4*5 + 3*5^2 + 4*5^3 + 3*5^4 + O(5^5)]
>>> -phi**Integer(2)
[5^-1 + O(5^4)        O(5^4)]
[       O(5^5) 5^-1 + O(5^4)]
E = EllipticCurve('14a')
L = E.padic_lseries(5)
phi = L.frobenius(5)
phi
-phi^2
is_ordinary()[source]

Return True if the elliptic curve that this \(L\)-function is attached to is ordinary.

EXAMPLES:

sage: L = EllipticCurve('11a').padic_lseries(19)
sage: L.is_ordinary()
False
>>> from sage.all import *
>>> L = EllipticCurve('11a').padic_lseries(Integer(19))
>>> L.is_ordinary()
False
L = EllipticCurve('11a').padic_lseries(19)
L.is_ordinary()
is_supersingular()[source]

Return True if the elliptic curve that this L function is attached to is supersingular.

EXAMPLES:

sage: L = EllipticCurve('11a').padic_lseries(19)
sage: L.is_supersingular()
True
>>> from sage.all import *
>>> L = EllipticCurve('11a').padic_lseries(Integer(19))
>>> L.is_supersingular()
True
L = EllipticCurve('11a').padic_lseries(19)
L.is_supersingular()
power_series(n=3, quadratic_twist=1, prec=5, eta=0)[source]

Return the \(n\)-th approximation to the \(p\)-adic \(L\)-series as a power series in \(T\) (corresponding to \(\gamma-1\) with \(\gamma=1+p\) as a generator of \(1+p\ZZ_p\)). Each coefficient is an element of a quadratic extension of the \(p\)-adic number whose precision is provably correct.

Here the normalization of the \(p\)-adic \(L\)-series is chosen such that \(L_p(E,1) = (1-1/\alpha)^2 L(E,1)/\Omega_E\) where \(\alpha\) is a root of the characteristic polynomial of Frobenius on \(T_pE\) and \(\Omega_E\) is the Néron period of \(E\).

INPUT:

  • n – (default: 2) a positive integer

  • quadratic_twist – (default: +1) a fundamental discriminant of a quadratic field, coprime to the conductor of the curve

  • prec – (default: 5) maximal number of terms of the series to compute; to compute as many as possible just give a very large number for prec; the result will still be correct.

  • eta – (default: 0) an integer (specifying the power of the Teichmueller character on the group of roots of unity in \(\ZZ_p^\times\))

OUTPUT:

a power series with coefficients in a quadratic ramified extension of the \(p\)-adic numbers generated by a root \(alpha\) of the characteristic polynomial of Frobenius on \(T_pE\).

ALIAS: power_series is identical to series.

EXAMPLES:

A supersingular example, where we must compute to higher precision to see anything:

sage: e = EllipticCurve('37a')
sage: L = e.padic_lseries(3); L
3-adic L-series of Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
sage: L.series(2)
O(T^3)
sage: L.series(4)         # takes a long time (several seconds)
O(alpha) + (alpha^-2 + O(alpha^0))*T + (alpha^-2 + O(alpha^0))*T^2 + O(T^5)
sage: L.alpha(2).parent()
3-adic Eisenstein Extension Field in alpha defined by x^2 + 3*x + 3
>>> from sage.all import *
>>> e = EllipticCurve('37a')
>>> L = e.padic_lseries(Integer(3)); L
3-adic L-series of Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
>>> L.series(Integer(2))
O(T^3)
>>> L.series(Integer(4))         # takes a long time (several seconds)
O(alpha) + (alpha^-2 + O(alpha^0))*T + (alpha^-2 + O(alpha^0))*T^2 + O(T^5)
>>> L.alpha(Integer(2)).parent()
3-adic Eisenstein Extension Field in alpha defined by x^2 + 3*x + 3
e = EllipticCurve('37a')
L = e.padic_lseries(3); L
L.series(2)
L.series(4)         # takes a long time (several seconds)
L.alpha(2).parent()

An example where we only compute the leading term (Issue #15737):

sage: E = EllipticCurve("17a1")
sage: L = E.padic_lseries(3)
sage: L.series(4,prec=1)
alpha^-2 + alpha^-1 + 2 + 2*alpha + ... + O(alpha^38) + O(T)
>>> from sage.all import *
>>> E = EllipticCurve("17a1")
>>> L = E.padic_lseries(Integer(3))
>>> L.series(Integer(4),prec=Integer(1))
alpha^-2 + alpha^-1 + 2 + 2*alpha + ... + O(alpha^38) + O(T)
E = EllipticCurve("17a1")
L = E.padic_lseries(3)
L.series(4,prec=1)

It works also for \(p=2\):

sage: E = EllipticCurve("11a1")
sage: lp = E.padic_lseries(2)
sage: lp.series(10)
O(alpha^-3) + (alpha^-4 + O(alpha^-3))*T + (alpha^-4 + O(alpha^-3))*T^2 + (alpha^-5 + alpha^-4 + O(alpha^-3))*T^3 + (alpha^-4 + O(alpha^-3))*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve("11a1")
>>> lp = E.padic_lseries(Integer(2))
>>> lp.series(Integer(10))
O(alpha^-3) + (alpha^-4 + O(alpha^-3))*T + (alpha^-4 + O(alpha^-3))*T^2 + (alpha^-5 + alpha^-4 + O(alpha^-3))*T^3 + (alpha^-4 + O(alpha^-3))*T^4 + O(T^5)
E = EllipticCurve("11a1")
lp = E.padic_lseries(2)
lp.series(10)
series(n=3, quadratic_twist=1, prec=5, eta=0)[source]

Return the \(n\)-th approximation to the \(p\)-adic \(L\)-series as a power series in \(T\) (corresponding to \(\gamma-1\) with \(\gamma=1+p\) as a generator of \(1+p\ZZ_p\)). Each coefficient is an element of a quadratic extension of the \(p\)-adic number whose precision is provably correct.

Here the normalization of the \(p\)-adic \(L\)-series is chosen such that \(L_p(E,1) = (1-1/\alpha)^2 L(E,1)/\Omega_E\) where \(\alpha\) is a root of the characteristic polynomial of Frobenius on \(T_pE\) and \(\Omega_E\) is the Néron period of \(E\).

INPUT:

  • n – (default: 2) a positive integer

  • quadratic_twist – (default: +1) a fundamental discriminant of a quadratic field, coprime to the conductor of the curve

  • prec – (default: 5) maximal number of terms of the series to compute; to compute as many as possible just give a very large number for prec; the result will still be correct.

  • eta – (default: 0) an integer (specifying the power of the Teichmueller character on the group of roots of unity in \(\ZZ_p^\times\))

OUTPUT:

a power series with coefficients in a quadratic ramified extension of the \(p\)-adic numbers generated by a root \(alpha\) of the characteristic polynomial of Frobenius on \(T_pE\).

ALIAS: power_series is identical to series.

EXAMPLES:

A supersingular example, where we must compute to higher precision to see anything:

sage: e = EllipticCurve('37a')
sage: L = e.padic_lseries(3); L
3-adic L-series of Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
sage: L.series(2)
O(T^3)
sage: L.series(4)         # takes a long time (several seconds)
O(alpha) + (alpha^-2 + O(alpha^0))*T + (alpha^-2 + O(alpha^0))*T^2 + O(T^5)
sage: L.alpha(2).parent()
3-adic Eisenstein Extension Field in alpha defined by x^2 + 3*x + 3
>>> from sage.all import *
>>> e = EllipticCurve('37a')
>>> L = e.padic_lseries(Integer(3)); L
3-adic L-series of Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
>>> L.series(Integer(2))
O(T^3)
>>> L.series(Integer(4))         # takes a long time (several seconds)
O(alpha) + (alpha^-2 + O(alpha^0))*T + (alpha^-2 + O(alpha^0))*T^2 + O(T^5)
>>> L.alpha(Integer(2)).parent()
3-adic Eisenstein Extension Field in alpha defined by x^2 + 3*x + 3
e = EllipticCurve('37a')
L = e.padic_lseries(3); L
L.series(2)
L.series(4)         # takes a long time (several seconds)
L.alpha(2).parent()

An example where we only compute the leading term (Issue #15737):

sage: E = EllipticCurve("17a1")
sage: L = E.padic_lseries(3)
sage: L.series(4,prec=1)
alpha^-2 + alpha^-1 + 2 + 2*alpha + ... + O(alpha^38) + O(T)
>>> from sage.all import *
>>> E = EllipticCurve("17a1")
>>> L = E.padic_lseries(Integer(3))
>>> L.series(Integer(4),prec=Integer(1))
alpha^-2 + alpha^-1 + 2 + 2*alpha + ... + O(alpha^38) + O(T)
E = EllipticCurve("17a1")
L = E.padic_lseries(3)
L.series(4,prec=1)

It works also for \(p=2\):

sage: E = EllipticCurve("11a1")
sage: lp = E.padic_lseries(2)
sage: lp.series(10)
O(alpha^-3) + (alpha^-4 + O(alpha^-3))*T + (alpha^-4 + O(alpha^-3))*T^2 + (alpha^-5 + alpha^-4 + O(alpha^-3))*T^3 + (alpha^-4 + O(alpha^-3))*T^4 + O(T^5)
>>> from sage.all import *
>>> E = EllipticCurve("11a1")
>>> lp = E.padic_lseries(Integer(2))
>>> lp.series(Integer(10))
O(alpha^-3) + (alpha^-4 + O(alpha^-3))*T + (alpha^-4 + O(alpha^-3))*T^2 + (alpha^-5 + alpha^-4 + O(alpha^-3))*T^3 + (alpha^-4 + O(alpha^-3))*T^4 + O(T^5)
E = EllipticCurve("11a1")
lp = E.padic_lseries(2)
lp.series(10)