Tate’s parametrisation of -adic curves with multiplicative reduction#
Let
See chapter V of [Sil1994] for more details.
AUTHORS:
Chris Wuthrich (23/05/2007): first version
William Stein (2007-05-29): added some examples; editing.
Chris Wuthrich (04/09): reformatted docstrings.
- class sage.schemes.elliptic_curves.ell_tate_curve.TateCurve(E, p)[source]#
Bases:
SageObject
Tate’s
-adic uniformisation of an elliptic curve with multiplicative reduction.Note
Some of the methods of this Tate curve only work when the reduction is split multiplicative over
.EXAMPLES:
sage: e = EllipticCurve('130a1') sage: eq = e.tate_curve(5); eq 5-adic Tate curve associated to the Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field sage: eq == loads(dumps(eq)) True
e = EllipticCurve('130a1') eq = e.tate_curve(5); eq eq == loads(dumps(eq))
>>> from sage.all import * >>> e = EllipticCurve('130a1') >>> eq = e.tate_curve(Integer(5)); eq 5-adic Tate curve associated to the Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field >>> eq == loads(dumps(eq)) True
REFERENCES: [Sil1994]
- E2(prec=20)[source]#
Return the value of the
-adic Eisenstein series of weight 2 evaluated on the elliptic curve having split multiplicative reduction.INPUT:
prec
– the -adic precision, default is 20.
EXAMPLES:
sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.E2(prec=10) 4 + 2*5^2 + 2*5^3 + 5^4 + 2*5^5 + 5^7 + 5^8 + 2*5^9 + O(5^10) sage: T = EllipticCurve('14').tate_curve(7) sage: T.E2(30) 2 + 4*7 + 7^2 + 3*7^3 + 6*7^4 + 5*7^5 + 2*7^6 + 7^7 + 5*7^8 + 6*7^9 + 5*7^10 + 2*7^11 + 6*7^12 + 4*7^13 + 3*7^15 + 5*7^16 + 4*7^17 + 4*7^18 + 2*7^20 + 7^21 + 5*7^22 + 4*7^23 + 4*7^24 + 3*7^25 + 6*7^26 + 3*7^27 + 6*7^28 + O(7^30)
eq = EllipticCurve('130a1').tate_curve(5) eq.E2(prec=10) T = EllipticCurve('14').tate_curve(7) T.E2(30)
>>> from sage.all import * >>> eq = EllipticCurve('130a1').tate_curve(Integer(5)) >>> eq.E2(prec=Integer(10)) 4 + 2*5^2 + 2*5^3 + 5^4 + 2*5^5 + 5^7 + 5^8 + 2*5^9 + O(5^10) >>> T = EllipticCurve('14').tate_curve(Integer(7)) >>> T.E2(Integer(30)) 2 + 4*7 + 7^2 + 3*7^3 + 6*7^4 + 5*7^5 + 2*7^6 + 7^7 + 5*7^8 + 6*7^9 + 5*7^10 + 2*7^11 + 6*7^12 + 4*7^13 + 3*7^15 + 5*7^16 + 4*7^17 + 4*7^18 + 2*7^20 + 7^21 + 5*7^22 + 4*7^23 + 4*7^24 + 3*7^25 + 6*7^26 + 3*7^27 + 6*7^28 + O(7^30)
- L_invariant(prec=20)[source]#
Return the mysterious
-invariant associated to an elliptic curve with split multiplicative reduction.One instance where this constant appears is in the exceptional case of the
-adic Birch and Swinnerton-Dyer conjecture as formulated in [MTT1986]. See [Col2004] for a detailed discussion.INPUT:
prec
– the -adic precision, default is 20.
EXAMPLES:
sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.L_invariant(prec=10) 5^3 + 4*5^4 + 2*5^5 + 2*5^6 + 2*5^7 + 3*5^8 + 5^9 + O(5^10)
eq = EllipticCurve('130a1').tate_curve(5) eq.L_invariant(prec=10)
>>> from sage.all import * >>> eq = EllipticCurve('130a1').tate_curve(Integer(5)) >>> eq.L_invariant(prec=Integer(10)) 5^3 + 4*5^4 + 2*5^5 + 2*5^6 + 2*5^7 + 3*5^8 + 5^9 + O(5^10)
- curve(prec=20)[source]#
Return the
-adic elliptic curve of the form .This curve with split multiplicative reduction is isomorphic to the given curve over the algebraic closure of
.INPUT:
prec
– the -adic precision, default is 20.
EXAMPLES:
sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.curve(prec=5) Elliptic Curve defined by y^2 + (1+O(5^5))*x*y = x^3 + (2*5^4+5^5+2*5^6+5^7+3*5^8+O(5^9))*x + (2*5^3+5^4+2*5^5+5^7+O(5^8)) over 5-adic Field with capped relative precision 5
eq = EllipticCurve('130a1').tate_curve(5) eq.curve(prec=5)
>>> from sage.all import * >>> eq = EllipticCurve('130a1').tate_curve(Integer(5)) >>> eq.curve(prec=Integer(5)) Elliptic Curve defined by y^2 + (1+O(5^5))*x*y = x^3 + (2*5^4+5^5+2*5^6+5^7+3*5^8+O(5^9))*x + (2*5^3+5^4+2*5^5+5^7+O(5^8)) over 5-adic Field with capped relative precision 5
- is_split()[source]#
Return
True
if the given elliptic curve has split multiplicative reduction.EXAMPLES:
sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.is_split() True sage: eq = EllipticCurve('37a1').tate_curve(37) sage: eq.is_split() False
eq = EllipticCurve('130a1').tate_curve(5) eq.is_split() eq = EllipticCurve('37a1').tate_curve(37) eq.is_split()
>>> from sage.all import * >>> eq = EllipticCurve('130a1').tate_curve(Integer(5)) >>> eq.is_split() True >>> eq = EllipticCurve('37a1').tate_curve(Integer(37)) >>> eq.is_split() False
- lift(P, prec=20)[source]#
Given a point
in the formal group of the elliptic curve with split multiplicative reduction, this produces an element in mapped to the point by the Tate parametrisation. The algorithm return the unique such element in .INPUT:
P
– a point on the elliptic curve.prec
– the -adic precision, default is 20.
EXAMPLES:
sage: e = EllipticCurve('130a1') sage: eq = e.tate_curve(5) sage: P = e([-6,10]) sage: l = eq.lift(12*P, prec=10); l 1 + 4*5 + 5^3 + 5^4 + 4*5^5 + 5^6 + 5^7 + 4*5^8 + 5^9 + O(5^10)
e = EllipticCurve('130a1') eq = e.tate_curve(5) P = e([-6,10]) l = eq.lift(12*P, prec=10); l
>>> from sage.all import * >>> e = EllipticCurve('130a1') >>> eq = e.tate_curve(Integer(5)) >>> P = e([-Integer(6),Integer(10)]) >>> l = eq.lift(Integer(12)*P, prec=Integer(10)); l 1 + 4*5 + 5^3 + 5^4 + 4*5^5 + 5^6 + 5^7 + 4*5^8 + 5^9 + O(5^10)
Now we map the lift l back and check that it is indeed right.:
sage: eq.parametrisation_onto_original_curve(l) (4*5^-2 + 2*5^-1 + 4*5 + 3*5^3 + 5^4 + 2*5^5 + 4*5^6 + O(5^7) : 2*5^-3 + 5^-1 + 4 + 4*5 + 5^2 + 3*5^3 + 4*5^4 + O(5^6) : 1 + O(5^10)) sage: e5 = e.change_ring(Qp(5,9)) sage: e5(12*P) (4*5^-2 + 2*5^-1 + 4*5 + 3*5^3 + 5^4 + 2*5^5 + 4*5^6 + O(5^7) : 2*5^-3 + 5^-1 + 4 + 4*5 + 5^2 + 3*5^3 + 4*5^4 + O(5^6) : 1 + O(5^9))
eq.parametrisation_onto_original_curve(l) e5 = e.change_ring(Qp(5,9)) e5(12*P)
>>> from sage.all import * >>> eq.parametrisation_onto_original_curve(l) (4*5^-2 + 2*5^-1 + 4*5 + 3*5^3 + 5^4 + 2*5^5 + 4*5^6 + O(5^7) : 2*5^-3 + 5^-1 + 4 + 4*5 + 5^2 + 3*5^3 + 4*5^4 + O(5^6) : 1 + O(5^10)) >>> e5 = e.change_ring(Qp(Integer(5),Integer(9))) >>> e5(Integer(12)*P) (4*5^-2 + 2*5^-1 + 4*5 + 3*5^3 + 5^4 + 2*5^5 + 4*5^6 + O(5^7) : 2*5^-3 + 5^-1 + 4 + 4*5 + 5^2 + 3*5^3 + 4*5^4 + O(5^6) : 1 + O(5^9))
- original_curve()[source]#
Return the elliptic curve the Tate curve was constructed from.
EXAMPLES:
sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.original_curve() Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field
eq = EllipticCurve('130a1').tate_curve(5) eq.original_curve()
>>> from sage.all import * >>> eq = EllipticCurve('130a1').tate_curve(Integer(5)) >>> eq.original_curve() Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field
- padic_height(prec=20)[source]#
Return the canonical
-adic height function on the original curve.INPUT:
prec
– the -adic precision, default is 20.
OUTPUT:
A function that can be evaluated on rational points of
.
EXAMPLES:
sage: e = EllipticCurve('130a1') sage: eq = e.tate_curve(5) sage: h = eq.padic_height(prec=10) sage: P = e.gens()[0] sage: h(P) 2*5^-1 + 1 + 2*5 + 2*5^2 + 3*5^3 + 3*5^6 + 5^7 + O(5^9)
e = EllipticCurve('130a1') eq = e.tate_curve(5) h = eq.padic_height(prec=10) P = e.gens()[0] h(P)
>>> from sage.all import * >>> e = EllipticCurve('130a1') >>> eq = e.tate_curve(Integer(5)) >>> h = eq.padic_height(prec=Integer(10)) >>> P = e.gens()[Integer(0)] >>> h(P) 2*5^-1 + 1 + 2*5 + 2*5^2 + 3*5^3 + 3*5^6 + 5^7 + O(5^9)
Check that it is a quadratic function:
sage: h(3*P)-3^2*h(P) O(5^9)
h(3*P)-3^2*h(P)
>>> from sage.all import * >>> h(Integer(3)*P)-Integer(3)**Integer(2)*h(P) O(5^9)
- padic_regulator(prec=20)[source]#
Compute the canonical
-adic regulator on the extended Mordell-Weil group as in [MTT1986] (with the correction of [Wer1998] and sign convention in [SW2013].)The
-adic Birch and Swinnerton-Dyer conjecture predicts that this value appears in the formula for the leading term of the -adic L-function.INPUT:
prec
– the -adic precision, default is 20.
EXAMPLES:
sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.padic_regulator() 2*5^-1 + 1 + 2*5 + 2*5^2 + 3*5^3 + 3*5^6 + 5^7 + 3*5^9 + 3*5^10 + 3*5^12 + 4*5^13 + 3*5^15 + 2*5^16 + 3*5^18 + 4*5^19 + 4*5^20 + 3*5^21 + 4*5^22 + O(5^23)
eq = EllipticCurve('130a1').tate_curve(5) eq.padic_regulator()
>>> from sage.all import * >>> eq = EllipticCurve('130a1').tate_curve(Integer(5)) >>> eq.padic_regulator() 2*5^-1 + 1 + 2*5 + 2*5^2 + 3*5^3 + 3*5^6 + 5^7 + 3*5^9 + 3*5^10 + 3*5^12 + 4*5^13 + 3*5^15 + 2*5^16 + 3*5^18 + 4*5^19 + 4*5^20 + 3*5^21 + 4*5^22 + O(5^23)
- parameter(prec=20)[source]#
Return the Tate parameter
such that the curve is isomorphic over the algebraic closure of to the curve .INPUT:
prec
– the -adic precision, default is 20.
EXAMPLES:
sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.parameter(prec=5) 3*5^3 + 3*5^4 + 2*5^5 + 2*5^6 + 3*5^7 + O(5^8)
eq = EllipticCurve('130a1').tate_curve(5) eq.parameter(prec=5)
>>> from sage.all import * >>> eq = EllipticCurve('130a1').tate_curve(Integer(5)) >>> eq.parameter(prec=Integer(5)) 3*5^3 + 3*5^4 + 2*5^5 + 2*5^6 + 3*5^7 + O(5^8)
- parametrisation_onto_original_curve(u, prec=None)[source]#
Given an element
in , this computes its image on the original curve under the -adic uniformisation of .INPUT:
u
– a non-zero -adic number.prec
– the -adic precision, default is the relative precision ofu
otherwise 20.
EXAMPLES:
sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.parametrisation_onto_original_curve(1+5+5^2+O(5^10)) (4*5^-2 + 4*5^-1 + 4 + 2*5^3 + 3*5^4 + 2*5^6 + O(5^7) : 3*5^-3 + 5^-2 + 4*5^-1 + 1 + 4*5 + 5^2 + 3*5^5 + O(5^6) : 1 + O(5^10)) sage: eq.parametrisation_onto_original_curve(1+5+5^2+O(5^10), prec=20) Traceback (most recent call last): ... ValueError: requested more precision than the precision of u
eq = EllipticCurve('130a1').tate_curve(5) eq.parametrisation_onto_original_curve(1+5+5^2+O(5^10)) eq.parametrisation_onto_original_curve(1+5+5^2+O(5^10), prec=20)
>>> from sage.all import * >>> eq = EllipticCurve('130a1').tate_curve(Integer(5)) >>> eq.parametrisation_onto_original_curve(Integer(1)+Integer(5)+Integer(5)**Integer(2)+O(Integer(5)**Integer(10))) (4*5^-2 + 4*5^-1 + 4 + 2*5^3 + 3*5^4 + 2*5^6 + O(5^7) : 3*5^-3 + 5^-2 + 4*5^-1 + 1 + 4*5 + 5^2 + 3*5^5 + O(5^6) : 1 + O(5^10)) >>> eq.parametrisation_onto_original_curve(Integer(1)+Integer(5)+Integer(5)**Integer(2)+O(Integer(5)**Integer(10)), prec=Integer(20)) Traceback (most recent call last): ... ValueError: requested more precision than the precision of u
Here is how one gets a 4-torsion point on
over :sage: R = Qp(5,30) sage: i = R(-1).sqrt() sage: T = eq.parametrisation_onto_original_curve(i, prec=30); T (2 + 3*5 + 4*5^2 + 2*5^3 + 5^4 + 4*5^5 + 2*5^7 + 5^8 + 5^9 + 5^12 + 3*5^13 + 3*5^14 + 5^15 + 4*5^17 + 5^18 + 3*5^19 + 2*5^20 + 4*5^21 + 5^22 + 3*5^23 + 3*5^24 + 4*5^25 + 3*5^26 + 3*5^27 + 3*5^28 + 3*5^29 + O(5^30) : 3*5 + 5^2 + 5^4 + 3*5^5 + 3*5^7 + 2*5^8 + 4*5^9 + 5^10 + 2*5^11 + 4*5^13 + 2*5^14 + 4*5^15 + 4*5^16 + 3*5^17 + 2*5^18 + 4*5^20 + 2*5^21 + 2*5^22 + 4*5^23 + 4*5^24 + 4*5^25 + 5^26 + 3*5^27 + 2*5^28 + O(5^30) : 1 + O(5^30)) sage: 4*T (0 : 1 + O(5^30) : 0)
R = Qp(5,30) i = R(-1).sqrt() T = eq.parametrisation_onto_original_curve(i, prec=30); T 4*T
>>> from sage.all import * >>> R = Qp(Integer(5),Integer(30)) >>> i = R(-Integer(1)).sqrt() >>> T = eq.parametrisation_onto_original_curve(i, prec=Integer(30)); T (2 + 3*5 + 4*5^2 + 2*5^3 + 5^4 + 4*5^5 + 2*5^7 + 5^8 + 5^9 + 5^12 + 3*5^13 + 3*5^14 + 5^15 + 4*5^17 + 5^18 + 3*5^19 + 2*5^20 + 4*5^21 + 5^22 + 3*5^23 + 3*5^24 + 4*5^25 + 3*5^26 + 3*5^27 + 3*5^28 + 3*5^29 + O(5^30) : 3*5 + 5^2 + 5^4 + 3*5^5 + 3*5^7 + 2*5^8 + 4*5^9 + 5^10 + 2*5^11 + 4*5^13 + 2*5^14 + 4*5^15 + 4*5^16 + 3*5^17 + 2*5^18 + 4*5^20 + 2*5^21 + 2*5^22 + 4*5^23 + 4*5^24 + 4*5^25 + 5^26 + 3*5^27 + 2*5^28 + O(5^30) : 1 + O(5^30)) >>> Integer(4)*T (0 : 1 + O(5^30) : 0)
- parametrisation_onto_tate_curve(u, prec=None)[source]#
Given an element
in , this computes its image on the Tate curve under the -adic uniformisation of .INPUT:
u
– a non-zero -adic number.prec
– the -adic precision, default is the relative precision ofu
otherwise 20.
EXAMPLES:
sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.parametrisation_onto_tate_curve(1+5+5^2+O(5^10), prec=10) (5^-2 + 4*5^-1 + 1 + 2*5 + 3*5^2 + 2*5^5 + 3*5^6 + O(5^7) : 4*5^-3 + 2*5^-1 + 4 + 2*5 + 3*5^4 + 2*5^5 + O(5^6) : 1 + O(5^10)) sage: eq.parametrisation_onto_tate_curve(1+5+5^2+O(5^10)) (5^-2 + 4*5^-1 + 1 + 2*5 + 3*5^2 + 2*5^5 + 3*5^6 + O(5^7) : 4*5^-3 + 2*5^-1 + 4 + 2*5 + 3*5^4 + 2*5^5 + O(5^6) : 1 + O(5^10)) sage: eq.parametrisation_onto_tate_curve(1+5+5^2+O(5^10), prec=20) Traceback (most recent call last): ... ValueError: requested more precision than the precision of u
eq = EllipticCurve('130a1').tate_curve(5) eq.parametrisation_onto_tate_curve(1+5+5^2+O(5^10), prec=10) eq.parametrisation_onto_tate_curve(1+5+5^2+O(5^10)) eq.parametrisation_onto_tate_curve(1+5+5^2+O(5^10), prec=20)
>>> from sage.all import * >>> eq = EllipticCurve('130a1').tate_curve(Integer(5)) >>> eq.parametrisation_onto_tate_curve(Integer(1)+Integer(5)+Integer(5)**Integer(2)+O(Integer(5)**Integer(10)), prec=Integer(10)) (5^-2 + 4*5^-1 + 1 + 2*5 + 3*5^2 + 2*5^5 + 3*5^6 + O(5^7) : 4*5^-3 + 2*5^-1 + 4 + 2*5 + 3*5^4 + 2*5^5 + O(5^6) : 1 + O(5^10)) >>> eq.parametrisation_onto_tate_curve(Integer(1)+Integer(5)+Integer(5)**Integer(2)+O(Integer(5)**Integer(10))) (5^-2 + 4*5^-1 + 1 + 2*5 + 3*5^2 + 2*5^5 + 3*5^6 + O(5^7) : 4*5^-3 + 2*5^-1 + 4 + 2*5 + 3*5^4 + 2*5^5 + O(5^6) : 1 + O(5^10)) >>> eq.parametrisation_onto_tate_curve(Integer(1)+Integer(5)+Integer(5)**Integer(2)+O(Integer(5)**Integer(10)), prec=Integer(20)) Traceback (most recent call last): ... ValueError: requested more precision than the precision of u
- prime()[source]#
Return the residual characteristic
.EXAMPLES:
sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.original_curve() Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field sage: eq.prime() 5
eq = EllipticCurve('130a1').tate_curve(5) eq.original_curve() eq.prime()
>>> from sage.all import * >>> eq = EllipticCurve('130a1').tate_curve(Integer(5)) >>> eq.original_curve() Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field >>> eq.prime() 5