Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/schemes/elliptic_curves/ell_tate_curve.py
4156 views
1
r"""
2
Tate's parametrisation of `p`-adic curves with multiplicative reduction
3
4
Let `E` be an elliptic curve defined over the `p`-adic numbers `\QQ_p`.
5
Suppose that `E` has multiplicative reduction, i.e. that the `j`-invariant
6
of `E` has negative valuation, say `n`. Then there exists a parameter
7
`q` in `\ZZ_p` of valuation `n` such that the points of `E` defined over
8
the algebraic closure `\bar{\QQ}_p` are in bijection with
9
`\bar{\QQ}_p^{\times}\,/\, q^{\ZZ}`. More precisely there exists
10
the series `s_4(q)` and `s_6(q)` such that the
11
`y^2+x y = x^3 + s_4(q) x+s_6(q)` curve is isomorphic to `E` over
12
`\bar{\QQ}_p` (or over `\QQ_p` if the reduction is *split* multiplicative). There is `p`-adic analytic map from
13
`\bar{\QQ}^{\times}_p` to this curve with kernel `q^{\ZZ}`.
14
Points of good reduction correspond to points of valuation
15
`0` in `\bar{\QQ}^{\times}_p`.
16
See chapter V of [Sil2] for more details.
17
18
REFERENCES :
19
20
- [Sil2] Silverman Joseph, Advanced Topics in the Arithmetic of Elliptic Curves,
21
GTM 151, Springer 1994.
22
23
24
AUTHORS:
25
26
- chris wuthrich (23/05/2007): first version
27
28
- William Stein (2007-05-29): added some examples; editing.
29
30
- chris wuthrich (04/09): reformatted docstrings.
31
32
"""
33
34
######################################################################
35
# Copyright (C) 2007 chris wuthrich
36
#
37
# Distributed under the terms of the GNU General Public License (GPL)
38
#
39
# This code is distributed in the hope that it will be useful,
40
# but WITHOUT ANY WARRANTY; without even the implied warranty of
41
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
42
# General Public License for more details.
43
#
44
# The full text of the GPL is available at:
45
#
46
# http://www.gnu.org/licenses/
47
######################################################################
48
49
from sage.rings.integer_ring import ZZ
50
from sage.rings.padics.factory import Qp
51
from sage.structure.sage_object import SageObject
52
from sage.rings.arith import LCM
53
from sage.modular.modform.constructor import EisensteinForms, CuspForms
54
from sage.schemes.elliptic_curves.constructor import EllipticCurve
55
from sage.misc.functional import log
56
from sage.misc.all import denominator, prod
57
import sage.matrix.all as matrix
58
59
class TateCurve(SageObject):
60
r"""
61
Tate's `p`-adic uniformisation of an elliptic curve with
62
multiplicative reduction.
63
64
.. note::
65
66
Some of the methods of this Tate curve only work when the
67
reduction is split multiplicative over `\QQ_p`.
68
69
EXAMPLES::
70
71
sage: e = EllipticCurve('130a1')
72
sage: eq = e.tate_curve(5); eq
73
5-adic Tate curve associated to the Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field
74
sage: eq == loads(dumps(eq))
75
True
76
77
REFERENCES :
78
79
- [Sil2] Silverman Joseph, Advanced Topics in the Arithmetic of Elliptic Curves,
80
GTM 151, Springer 1994.
81
82
"""
83
def __init__(self,E,p):
84
r"""
85
INPUT:
86
87
- ``E`` - an elliptic curve over the rational numbers
88
89
- ``p`` - a prime where `E` has multiplicative reduction,
90
i.e., such that `j(E)` has negative valuation.
91
92
EXAMPLES::
93
94
sage: e = EllipticCurve('130a1')
95
sage: eq = e.tate_curve(2); eq
96
2-adic Tate curve associated to the Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field
97
"""
98
self._p = ZZ(p)
99
self._E = E
100
self._q = self.parameter()
101
if not p.is_prime():
102
raise ValueError, "p (=%s) must be a prime"%p
103
if E.j_invariant().valuation(p) >= 0:
104
raise ValueError, "The elliptic curve must have multiplicative reduction at %s"%p
105
106
def __cmp__(self, other):
107
r"""
108
Compare self and other.
109
110
TESTS::
111
112
sage: E = EllipticCurve('35a')
113
sage: eq5 = E.tate_curve(5)
114
sage: eq7 = E.tate_curve(7)
115
sage: eq7 == eq7
116
True
117
sage: eq7 == eq5
118
False
119
"""
120
c = cmp(type(self), type(other))
121
if c: return c
122
return cmp((self._E, self._p), (other._E, other._p))
123
124
125
def _repr_(self):
126
r"""
127
Return print representation.
128
129
EXAMPLES::
130
131
sage: e = EllipticCurve('130a1')
132
sage: eq = e.tate_curve(2)
133
sage: eq._repr_()
134
'2-adic Tate curve associated to the Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field'
135
"""
136
s = "%s-adic Tate curve associated to the %s"%(self._p, self._E)
137
return s
138
139
def original_curve(self):
140
r"""
141
Returns the elliptic curve the Tate curve was constructed from.
142
143
EXAMPLES::
144
145
sage: eq = EllipticCurve('130a1').tate_curve(5)
146
sage: eq.original_curve()
147
Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field
148
"""
149
return self._E
150
151
def prime(self):
152
r"""
153
Returns the residual characteristic `p`.
154
155
EXAMPLES::
156
157
sage: eq = EllipticCurve('130a1').tate_curve(5)
158
sage: eq.original_curve()
159
Elliptic Curve defined by y^2 + x*y + y = x^3 - 33*x + 68 over Rational Field
160
sage: eq.prime()
161
5
162
"""
163
return self._p
164
165
166
def parameter(self,prec=20):
167
r"""
168
Returns the Tate parameter `q` such that the curve is isomorphic
169
over the algebraic closure of `\QQ_p` to the curve
170
`\QQ_p^{\times}/q^{\ZZ}`.
171
172
INPUT:
173
174
- ``prec`` - the `p`-adic precision, default is 20.
175
176
EXAMPLES::
177
178
sage: eq = EllipticCurve('130a1').tate_curve(5)
179
sage: eq.parameter(prec=5)
180
3*5^3 + 3*5^4 + 2*5^5 + 2*5^6 + 3*5^7 + O(5^8)
181
"""
182
try:
183
qE = self._q
184
if qE.absolute_precision() >= prec:
185
return qE
186
except AttributeError:
187
pass
188
189
jE = self._E.j_invariant()
190
E4 = EisensteinForms(weight=4).basis()[0]
191
Delta = CuspForms(weight=12).basis()[0]
192
j = (E4.q_expansion(prec+3))**3/Delta.q_expansion(prec+3)
193
jinv = (1/j).power_series()
194
q_in_terms_of_jinv = jinv.reversion()
195
R = Qp(self._p,prec=prec)
196
qE = q_in_terms_of_jinv(R(1/self._E.j_invariant()))
197
self._q = qE
198
return qE
199
200
__sk = lambda e,k,prec: sum( [n**k*e._q**n/(1-e._q**n) for n in range(1,prec+1)] )
201
202
__delta = lambda e,prec: e._q* prod([(1-e._q**n)**24 for n in range(1,prec+1) ] )
203
204
def curve(self,prec=20):
205
r"""
206
Returns the `p`-adic elliptic curve of the form `y^2+x y = x^3 + s_4 x+s_6`.
207
This curve with split multiplicative reduction is isomorphic to the given curve
208
over the algebraic closure of `\QQ_p`.
209
210
INPUT:
211
212
- ``prec`` - the `p`-adic precision, default is 20.
213
214
EXAMPLES::
215
216
sage: eq = EllipticCurve('130a1').tate_curve(5)
217
sage: eq.curve(prec=5)
218
Elliptic Curve defined by y^2 + (1+O(5^5))*x*y = x^3 +
219
(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
220
Field with capped relative precision 5
221
"""
222
try:
223
Eq = self.__curve
224
if Eq.a6().absolute_precision() >= prec:
225
return Eq
226
except AttributeError:
227
pass
228
229
230
qE = self.parameter(prec=prec)
231
n = qE.valuation()
232
precp = (prec/n).floor() + 2;
233
R = qE.parent()
234
235
tate_a4 = -5 * self.__sk(3,precp)
236
tate_a6 = (tate_a4 - 7 * self.__sk(5,precp) )/12
237
Eq = EllipticCurve([R(1),R(0),R(0),tate_a4,tate_a6])
238
self.__curve = Eq
239
return Eq
240
241
def _Csquare(self,prec=20):
242
r"""
243
Returns the square of the constant `C` such that the canonical Neron differential `\omega`
244
and the canonical differential `\frac{du}{u}` on `\QQ^{\times}/q^{\ZZ}` are linked by
245
`\omega = C \frac{du}{u}`. This constant is only a square in `\QQ_p` if the curve has split
246
multiplicative reduction.
247
248
INPUT:
249
250
- ``prec`` - the `p`-adic precision, default is 20.
251
252
EXAMPLES::
253
254
sage: eq = EllipticCurve('130a1').tate_curve(5)
255
sage: eq._Csquare(prec=5)
256
4 + 2*5^2 + 2*5^4 + O(5^5)
257
"""
258
try:
259
Csq = self.__Csquare
260
if Csq.absolute_precision() >= prec:
261
return Csq
262
except AttributeError:
263
pass
264
265
Eq = self.curve(prec=prec)
266
tateCsquare = Eq.c6() * self._E.c4()/Eq.c4()/self._E.c6()
267
self.__Csquare = tateCsquare
268
return tateCsquare
269
270
def E2(self,prec=20):
271
r"""
272
Returns the value of the `p`-adic Eisenstein series of weight 2 evaluated on the elliptic
273
curve having split multiplicative reduction.
274
275
INPUT:
276
277
- ``prec`` - the `p`-adic precision, default is 20.
278
279
EXAMPLES::
280
281
sage: eq = EllipticCurve('130a1').tate_curve(5)
282
sage: eq.E2(prec=10)
283
4 + 2*5^2 + 2*5^3 + 5^4 + 2*5^5 + 5^7 + 5^8 + 2*5^9 + O(5^10)
284
285
sage: T = EllipticCurve('14').tate_curve(7)
286
sage: T.E2(30)
287
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)
288
"""
289
290
p = self._p
291
Csq = self._Csquare(prec=prec)
292
qE = self._q
293
n = qE.valuation()
294
R = Qp(p,prec)
295
296
e2 = Csq*(1 - 24 * sum( [ qE**i/(1-qE**i)**2 for i in range(1,(prec/n).floor() + 5) ]))
297
298
return R(e2)
299
300
301
def is_split(self):
302
r"""
303
Returns True if the given elliptic curve has split multiplicative reduction.
304
305
EXAMPLES::
306
307
sage: eq = EllipticCurve('130a1').tate_curve(5)
308
sage: eq.is_split()
309
True
310
311
sage: eq = EllipticCurve('37a1').tate_curve(37)
312
sage: eq.is_split()
313
False
314
"""
315
return self._Csquare().is_square()
316
317
def parametrisation_onto_tate_curve(self,u,prec=20):
318
r"""
319
Given an element `u` in `\QQ_p^{\times}`, this computes its image on the Tate curve
320
under the `p`-adic uniformisation of `E`.
321
322
INPUT:
323
324
- ``u`` - a non-zero `p`-adic number.
325
326
- ``prec`` - the `p`-adic precision, default is 20.
327
328
329
EXAMPLES::
330
331
sage: eq = EllipticCurve('130a1').tate_curve(5)
332
sage: eq.parametrisation_onto_tate_curve(1+5+5^2+O(5^10))
333
(5^-2 + 4*5^-1 + 1 + 2*5 + 3*5^2 + 2*5^5 + 3*5^6 + O(5^7) :
334
4*5^-3 + 2*5^-1 + 4 + 2*5 + 3*5^4 + 2*5^5 + O(5^6) : 1 + O(5^20))
335
"""
336
if u == 1:
337
return self.curve(prec=prec)(0)
338
339
q = self._q
340
un = u * q**(-(u.valuation()/q.valuation()).floor())
341
342
precn = (prec/q.valuation()).floor() + 4
343
344
# formulas in Silverman II (Advanced Topics in the Arithmetic of Elliptic curves, p. 425)
345
346
xx = un/(1-un)**2 + sum( [q**n*un/(1-q**n*un)**2 + q**n/un/(1-q**n/un)**2-2*q**n/(1-q**n)**2 for n in range(1,precn) ])
347
348
yy = un**2/(1-un)**3 + sum( [q**(2*n)*un**2/(1-q**n*un)**3 - q**n/un/(1-q**n/un)**3+q**n/(1-q**n)**2 for n in range(1,precn) ])
349
350
return self.curve(prec=prec)( [xx,yy] )
351
352
353
354
# From here on all function need that the curve has split multiplicative reduction.
355
356
def L_invariant(self,prec=20):
357
r"""
358
Returns the *mysterious* `\mathcal{L}`-invariant associated
359
to an elliptic curve with split multiplicative reduction. One
360
instance where this constant appears is in the exceptional
361
case of the `p`-adic Birch and Swinnerton-Dyer conjecture as
362
formulated in [MTT]. See [Col] for a detailed discussion.
363
364
INPUT:
365
366
- ``prec`` - the `p`-adic precision, default is 20.
367
368
REFERENCES:
369
370
- [MTT] B. Mazur, J. Tate, and J. Teitelbaum,
371
On `p`-adic analogues of the conjectures of Birch and
372
Swinnerton-Dyer, Inventiones mathematicae 84, (1986), 1-48.
373
374
- [Col] Pierre Colmez, Invariant `\mathcal{L}` et derivees de
375
valeurs propores de Frobenius, preprint, 2004.
376
377
EXAMPLES::
378
379
sage: eq = EllipticCurve('130a1').tate_curve(5)
380
sage: eq.L_invariant(prec=10)
381
5^3 + 4*5^4 + 2*5^5 + 2*5^6 + 2*5^7 + 3*5^8 + 5^9 + O(5^10)
382
"""
383
384
if not self.is_split():
385
raise RuntimeError, "The curve must have split multiplicative reduction"
386
qE = self.parameter(prec=prec)
387
n = qE.valuation()
388
u = qE/self._p**n # the p-adic logarithm of Iwasawa normalised by log(p) = 0
389
return log(u)/n
390
391
392
def _isomorphism(self,prec=20):
393
r"""
394
Returns the isomorphism between ``self.curve()`` and the given curve in the
395
form of a list ``[u,r,s,t]`` of `p`-adic numbers. For this to exist
396
the given curve has to have split multiplicative reduction over `\QQ_p`.
397
398
More precisely, if `E` has coordinates `x` and `y` and the Tate curve
399
has coordinates `X`, `Y` with `Y^2 + XY = X^3 + s_4 X +s_6` then
400
`X = u^2 x +r` and `Y = u^3 y +s u^2 x +t`.
401
402
INPUT:
403
404
- ``prec`` - the `p`-adic precision, default is 20.
405
406
EXAMPLES::
407
408
sage: eq = EllipticCurve('130a1').tate_curve(5)
409
sage: eq._isomorphism(prec=5)
410
[2 + 3*5^2 + 2*5^3 + 4*5^4 + O(5^5), 4 + 3*5 + 4*5^2 + 2*5^3 + O(5^5),
411
3 + 2*5 + 5^2 + 5^3 + 2*5^4 + O(5^5), 2 + 5 + 3*5^2 + 5^3 + 5^4 + O(5^5)]
412
"""
413
414
if not self.is_split():
415
raise RuntimeError, "The curve must have split multiplicative reduction"
416
417
Csq = self._Csquare(prec=prec+4)
418
C = Csq.sqrt()
419
R = Qp(self._p,prec)
420
C = R(C)
421
s = (C * R(self._E.a1()) -R(1))/R(2)
422
r = (C**2*R(self._E.a2()) +s +s**2)/R(3)
423
t = (C**3*R(self._E.a3()) - r)/R(2)
424
return [C,r,s,t]
425
426
def _inverse_isomorphism(self,prec=20):
427
r"""
428
Returns the isomorphism between the given curve and ``self.curve()`` in the
429
form of a list ``[u,r,s,t]`` of `p`-adic numbers. For this to exist
430
the given curve has to have split multiplicative reduction over `\QQ_p`.
431
432
More precisely, if `E` has coordinates `x` and `y` and the Tate curve
433
has coordinates `X`, `Y` with `Y^2 + XY = X^3 + s_4 X +s_6` then
434
`x = u^2 X +r` and `y = u^3 Y +s u^2 X +t`.
435
436
INPUT:
437
438
- ``prec`` - the `p`-adic precision, default is 20.
439
440
EXAMPLES::
441
442
sage: eq = EllipticCurve('130a1').tate_curve(5)
443
sage: eq._inverse_isomorphism(prec=5)
444
[3 + 2*5 + 3*5^3 + O(5^5), 4 + 2*5 + 4*5^3 + 3*5^4 + O(5^5),
445
1 + 5 + 4*5^3 + 2*5^4 + O(5^5), 5 + 2*5^2 + 3*5^4 + O(5^5)]
446
"""
447
if not self.is_split():
448
raise RuntimeError, "The curve must have split multiplicative reduction"
449
vec = self._isomorphism(prec=prec)
450
return [1/vec[0],-vec[1]/vec[0]**2,-vec[2]/vec[0],(vec[1]*vec[2]-vec[3])/vec[0]**3]
451
452
def lift(self,P, prec = 20):
453
r"""
454
Given a point `P` in the formal group of the elliptic curve `E` with split multiplicative reduction,
455
this produces an element `u` in `\QQ_p^{\times}` mapped to the point `P` by the Tate parametrisation.
456
The algorithm return the unique such element in `1+p\ZZ_p`.
457
458
INPUT:
459
460
- ``P`` - a point on the elliptic curve.
461
462
- ``prec`` - the `p`-adic precision, default is 20.
463
464
EXAMPLES::
465
466
sage: e = EllipticCurve('130a1')
467
sage: eq = e.tate_curve(5)
468
sage: P = e([-6,10])
469
sage: l = eq.lift(12*P, prec=10); l
470
1 + 4*5 + 5^3 + 5^4 + 4*5^5 + 5^6 + 5^7 + 4*5^8 + 5^9 + O(5^10)
471
472
Now we map the lift l back and check that it is indeed right.::
473
474
sage: eq.parametrisation_onto_original_curve(l)
475
(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^20))
476
sage: e5 = e.change_ring(Qp(5,9))
477
sage: e5(12*P)
478
(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))
479
"""
480
p = self._p
481
R = Qp(self._p,prec)
482
if not self._E == P.curve():
483
raise ValueError , "The point must lie on the original curve."
484
if not self.is_split():
485
raise ValueError, "The curve must have split multiplicative reduction."
486
if P.is_zero():
487
return R(1)
488
if P[0].valuation(p) >= 0:
489
raise ValueError , "The point must lie in the formal group."
490
491
Eq = self.curve(prec=prec)
492
isom = self._isomorphism(prec=prec)
493
C = isom[0]
494
r = isom[1]
495
s = isom[2]
496
t = isom[3]
497
xx = r + C**2 * P[0]
498
yy = t + s * C**2 * P[0] + C**3 * P[1]
499
try:
500
Pq = Eq([xx,yy])
501
except:
502
raise RuntimeError, "Bug : Point %s does not lie on the curve "%[xx,yy]
503
504
tt = -xx/yy
505
eqhat = Eq.formal()
506
eqlog = eqhat.log(prec + 3)
507
z = eqlog(tt)
508
u = ZZ(1)
509
fac = ZZ(1)
510
for i in range(1,2*prec+1):
511
fac = fac * i
512
u = u + z**i/fac
513
return u
514
515
def parametrisation_onto_original_curve(self,u,prec=20):
516
r"""
517
Given an element `u` in `\QQ_p^{\times}`, this computes its image on the original curve
518
under the `p`-adic uniformisation of `E`.
519
520
INPUT:
521
522
- ``u`` - a non-zero `p`-adic number.
523
524
- ``prec`` - the `p`-adic precision, default is 20.
525
526
EXAMPLES::
527
528
sage: eq = EllipticCurve('130a1').tate_curve(5)
529
sage: eq.parametrisation_onto_original_curve(1+5+5^2+O(5^10))
530
(4*5^-2 + 4*5^-1 + 4 + 2*5^3 + 3*5^4 + 2*5^6 + O(5^7) :
531
3*5^-3 + 5^-2 + 4*5^-1 + 1 + 4*5 + 5^2 + 3*5^5 + O(5^6) : 1 + O(5^20))
532
533
Here is how one gets a 4-torsion point on `E` over `\QQ_5`::
534
535
sage: R = Qp(5,10)
536
sage: i = R(-1).sqrt()
537
sage: T = eq.parametrisation_onto_original_curve(i); T
538
(2 + 3*5 + 4*5^2 + 2*5^3 + 5^4 + 4*5^5 + 2*5^7 + 5^8 + 5^9 + O(5^10) :
539
3*5 + 5^2 + 5^4 + 3*5^5 + 3*5^7 + 2*5^8 + 4*5^9 + O(5^10) : 1 + O(5^20))
540
sage: 4*T
541
(0 : 1 + O(5^20) : 0)
542
"""
543
if not self.is_split():
544
raise ValueError, "The curve must have split multiplicative reduction."
545
P = self.parametrisation_onto_tate_curve(u,prec=20)
546
isom = self._inverse_isomorphism(prec=prec)
547
C = isom[0]
548
r = isom[1]
549
s = isom[2]
550
t = isom[3]
551
xx = r + C**2 * P[0]
552
yy = t + s * C**2 * P[0] + C**3 * P[1]
553
R = Qp(self._p,prec)
554
E_over_Qp = self._E.base_extend(R)
555
return E_over_Qp([xx,yy])
556
557
558
559
__padic_sigma_square = lambda e,u,prec: (u-1)**2/u* prod([((1-e._q**n*u)*(1-e._q**n/u)/(1-e._q**n)**2)**2 for n in range(1,prec+1)])
560
561
# the following functions are rather functions of the global curve than the local curve
562
# we use the same names as for elliptic curves over rationals.
563
564
def padic_height(self,prec=20):
565
r"""
566
Returns the canonical `p`-adic height function on the original curve.
567
568
INPUT:
569
570
- ``prec`` - the `p`-adic precision, default is 20.
571
572
OUTPUT:
573
574
- A function that can be evaluated on rational points of `E`.
575
576
EXAMPLES::
577
578
sage: e = EllipticCurve('130a1')
579
sage: eq = e.tate_curve(5)
580
sage: h = eq.padic_height(prec=10)
581
sage: P=e.gens()[0]
582
sage: h(P)
583
2*5^-1 + 1 + 2*5 + 2*5^2 + 3*5^3 + 3*5^6 + 5^7 + O(5^8)
584
585
Check that it is a quadratic function::
586
587
sage: h(3*P)-3^2*h(P)
588
O(5^8)
589
"""
590
591
if not self.is_split():
592
raise NotImplementedError, "The curve must have split multiplicative reduction"
593
594
p = self._p
595
596
# we will have to do it properly with David Harvey's _multiply_point(E, R, Q)
597
n = LCM(self._E.tamagawa_numbers()) * (p-1)
598
599
# this function is a closure, I don't see how to doctest it (PZ)
600
def _height(P,check=True):
601
if check:
602
assert P.curve() == self._E, "the point P must lie on the curve from which the height function was created"
603
Q = n * P
604
cQ = denominator(Q[0])
605
uQ = self.lift(Q,prec = prec)
606
si = self.__padic_sigma_square(uQ, prec=prec)
607
nn = self._q.valuation()
608
qEu = self._q/p**nn
609
return -(log(si*self._Csquare()/cQ) + log(uQ)**2/log(qEu)) / n**2
610
611
return _height
612
613
614
def padic_regulator(self,prec=20):
615
r"""
616
Computes the canonical `p`-adic regulator on the extended Mordell-Weil group as in [MTT]
617
(with the correction of [Wer] and sign convention in [SW].)
618
The `p`-adic Birch and Swinnerton-Dyer conjecture
619
predicts that this value appears in the formula for the leading term of the
620
`p`-adic L-function.
621
622
INPUT:
623
624
- ``prec`` - the `p`-adic precision, default is 20.
625
626
REFERENCES:
627
628
- [MTT] B. Mazur, J. Tate, and J. Teitelbaum,
629
On `p`-adic analogues of the conjectures of Birch and
630
Swinnerton-Dyer, Inventiones mathematicae 84, (1986), 1-48.
631
632
- [Wer] Annette Werner, Local heights on abelian varieties and rigid analytic unifomization,
633
Doc. Math. 3 (1998), 301-319.
634
635
- [SW] William Stein and Christian Wuthrich, Computations About Tate-Shafarevich Groups
636
using Iwasawa theory, preprint 2009.
637
638
EXAMPLES::
639
640
sage: eq = EllipticCurve('130a1').tate_curve(5)
641
sage: eq.padic_regulator()
642
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 + O(5^20)
643
644
"""
645
prec = prec + 4
646
647
K = Qp(self._p, prec=prec)
648
rank = self._E.rank()
649
if rank == 0:
650
return K(1)
651
652
if not self.is_split():
653
raise NotImplementedError, "The p-adic regulator is not implemented for non-split multiplicative reduction."
654
655
656
basis = self._E.gens()
657
M = matrix.matrix(K, rank, rank, 0)
658
659
height = self.padic_height(prec= prec)
660
point_height = [height(P) for P in basis]
661
for i in range(rank):
662
for j in range(i+1, rank):
663
M[i, j] = M[j, i] = (- point_height[i] - point_height[j] + height(basis[i] + basis[j]))/2
664
for i in range(rank):
665
M[i,i] = point_height[i]
666
667
return M.determinant()
668
669
670