CoCalc Public Fileswww / papers / anti-cyclotomic_height_pairing / height.texOpen with one click!
Author: William A. Stein
Compute Environment: Ubuntu 18.04 (Deprecated)
1
\documentclass{article}
2
\include{macros}
3
\title{\Large\sf Anti-cyclotomic Heights and Slopes}
4
\author{For Barry Mazur, by William Stein}
5
\voffset=-0.05\textheight
6
\textheight=1.1\textheight
7
\hoffset=-0.08\textwidth
8
\textwidth=1.16\textwidth
9
10
\newcommand{\Disc}{{\rm Disc}}
11
\begin{document}
12
\maketitle
13
14
\tableofcontents
15
16
17
\section{Some data on the slope distribution}
18
19
Let~$E$ be an elliptic curve over $\Q$ of rank $2$, and let $P$ and
20
$Q$ be a basis for $E(\Q)/E(\Q)_{\tor}$. Fix a prime number $p$
21
($p=3$ in this section) and consider quadratic imaginary extensions
22
$K$ of $\Q$ that ``satisfy the Heegner hypothesis'' and for which~$p$
23
splits in~$K$. For these $K$, Barry has told me how to compute
24
a naive height function
25
$$H_2 : E(K)' \ra \Qp,$$
26
where $E(K)'$ is a certain finite-index subgroup of $E(K)$.
27
Let
28
$$h^*(x) = H_2(p^2x)/p^4$$
29
be the ``second order'' approximation to
30
the canonical height. Let $C_K\in E(K)$ denote a point
31
that arises from a $\Q$-rational point of infinite order
32
on the quadratic twist of~$E$ corresponding to~$K$.
33
\begin{definition}
34
The {\em slope of the $K$-line} of $E$ is
35
$\displaystyle \frac{h(P+C_K)}{h(Q+C_K)}.$
36
\end{definition}
37
38
The following tables report on some partial computations of this
39
slope. Experience of the author suggests, but does not prove, that
40
the data below is equal to the slope modulo~$3^2$. (In particular, I
41
bet that the column labeled ``slope modulo $9$'' is really the slope
42
modulo $9$; however, this is only a ``bet''.)
43
44
\begin{table}
45
\begin{center}
46
\caption{\bf 389A, p=3}\vspace{1ex}\\
47
\begin{tabular}{lclc}
48
$\Disc(K)$ & \hspace{.5in}& $h^*(P+C_K)/h^*(Q+C_K)$& slope modulo $9$\\\hline
49
$-11$&& $1 + 3 - 3^2 - 3^3 + 3^5 +\cdots$ & 4\\
50
$-20$&& $1 + 3 - 3^2 - 3^4 + 3^5 +\cdots$ & 4\\
51
$-35$&& $1 + 3 + 3^3 - 3^4 + \cdots $ & 4\\
52
$-59$&& $3^2 - 3^3 + 3^4 + 3^5 + \cdots$ & 0\\
53
$-68$&& $1 - 3 + 3^2 + 3^4 + \cdots$ & 7\\
54
$-119$&& $1 + 3 - 3^2 + 3^3 - 3^4 + \cdots$ & 4\\
55
$-143$&& ? (it takes a long time to compute) & \\
56
$-164$&& $1 + 3 + 3^3 - 3^4 + \cdots$ & 4\\
57
$-179$&& undefined & \\
58
%$-239$&& ?\\
59
%$-248$&& program fails\\
60
%$-260$&& undef\\
61
%$-287$&& ?\\
62
%$-296$&& ?\\
63
%$-308$&& ?\\
64
%$-311$&& ?\\
65
\end{tabular}
66
\end{center}
67
\end{table}
68
69
70
\begin{table}
71
\begin{center}
72
\caption{\bf 433A, p=3}\vspace{1ex}\\
73
\begin{tabular}{lclc}
74
$\Disc(K)$ & \hspace{.5in}& $h^*(P+C_K)/h^*(Q+C_K)$& slope modulo $9$\\\hline
75
$-8$ && $-1 + 3 - 3^2 - 3^3 + 3^4 - 3^5 + \cdots$ & 2\\
76
$-11$ && $1 - 3^2 + 3^4 + 3^5 + \cdots$ & 1\\
77
$-35$ && $-3 + 3^2 - 3^3 + \cdots$ & 6\\
78
$-59$ && $-3^{-1} + 1 + 3 + 3^2 + 3^3 + 3^5 + \cdots$ & undefined\\
79
\end{tabular}
80
\end{center}
81
\end{table}
82
83
84
85
\begin{table}
86
\begin{center}
87
\caption{\bf 571B, p=3}\vspace{1ex}\\
88
\begin{tabular}{lclc}
89
$\Disc(K)$ & \hspace{.5in}& $h^*(P+C_K)/h^*(Q+C_K)$& slope modulo $9$\\\hline
90
$-8$& & $-3 - 3^3 - 3^4 + \cdots$ & $6$\\
91
92
$-35$& & $-3 + 3^3 + 3^4 + \cdots$& $6$\\
93
94
$-47$& & $-3 - 3^4 - 3^5 +\cdots$& $6$\\
95
96
$-68$& & $-3 + 3^3 + 3^4 - 3^5 +\cdots$& $6$\\
97
98
$-71$& & undefined \\
99
$-95$& & undefined \\
100
$-104$& & $-1 - 3^2 + \cdots$& $8$\\
101
\end{tabular}
102
\end{center}
103
\end{table}
104
105
106
\begin{table}
107
\begin{center}
108
\caption{\bf 707A, p=3}\vspace{1ex}\\
109
\begin{tabular}{lclc}
110
$\Disc(K)$ & \hspace{.5in}& $h^*(P+C_K)/h^*(Q+C_K)$& slope modulo $9$\\\hline
111
$-20$ &&$-3 - 3^2 - 3^5 + \cdots$ & $6$\\
112
$-47$ &&$3^{-1} - 1 - 3 - 3^3 - 3^4 + 3^5 +\cdots$& undefined\\
113
114
\end{tabular}
115
\end{center}
116
\end{table}
117
118
119
\begin{table}
120
\begin{center}
121
\caption{\bf 817A, p=3}\vspace{1ex}\\
122
\begin{tabular}{lclc}
123
$\Disc(K)$ & \hspace{.5in}& $h^*(P+C_K)/h^*(Q+C_K)$& slope modulo $9$\\\hline
124
$-8$ && $1 + 3 - 3^2 + 3^3 - 3^5 +\cdots$& $4$\\
125
126
\end{tabular}
127
\end{center}
128
\end{table}
129
130
131
\newpage
132
\section{Evidence that the height pairing is nonzero}
133
This numerical experiment gives evidence that the height pairing on
134
$E(K)$ is nontrivial when $p=3$. I ran the following computation for
135
many optimal elliptic curves~$E$ of conductor $<1000$ and rank~$2$.
136
\begin{enumerate}
137
\item Find the smallest quadratic imaginary field $K=\Q(\sqrt{D})$ that
138
satisfies hypothesis (a)-(d) for~$E$ and~$p$.
139
\item Let $x$, $y$ be a basis for $E(\Q)$ and $z$ a basis for the group
140
of rational points on the twist of $E$ by $K$.
141
Set $P_1=x+z$ and $P_2 = y+z$.
142
\item For $i=1,2$, compute $H_2(3^nP_i)/3^{2n}$ for $n=1,2,3,4$. The
143
value is undefined in some cases, because the first coordinate of $3^n
144
P_i$ might have numerator ideal not coprime to a prime lieing over~$3$.
145
{\bf Warning:} Judging by the undef's that appear below, it looks like
146
sometimes we get lucky and can ``compute'' $H_2(P)$ even though the
147
point doesn't lie in the special subgroup of Perrin-Riou's paper.
148
See, e.g., {\tt 446D}.
149
\end{enumerate}
150
151
152
\begin{verbatim}
153
E: 389A, K=Q(sqrt(-11))
154
H_2(3^1*P_1)/3^2 := undef
155
H_2(3^2*P_1)/3^4 := -3^-3 - 3^-1 - 1 + 3 - 3^2 + 3^4 + O(3^5)
156
H_2(3^3*P_1)/3^6 := -3^-3 + 3^-2 + 1 + 3 + 3^3 + O(3^5)
157
H_2(3^4*P_1)/3^8 := -3^-3 + 3^-2 - 1 - 3 + 3^2 - 3^3 - 3^4 + O(3^5)
158
159
H_2(3^1*P_2)/3^2 := undef
160
H_2(3^2*P_2)/3^4 := -3^-3 + 3^-2 - 3^-1 + 1 + 3 - 3^2 - 3^3 + O(3^5)
161
H_2(3^3*P_2)/3^6 := -3^-3 - 3^-2 + 3^-1 + 1 - 3 + 3^2 - 3^3 + 3^4 + O(3^5)
162
H_2(3^4*P_2)/3^8 := -3^-3 - 3^-2 + 3^-1 - 1 + O(3^5)
163
164
-------------------------------------------------------------
165
E: 433A, K=Q(sqrt(-8))
166
H_2(3^1*P_1)/3^2 := -3^-1 + 1 - 3 + 3^3 + O(3^5)
167
H_2(3^2*P_1)/3^4 := 3^-2 + 3 - 3^2 + 3^3 + 3^4 + O(3^5)
168
H_2(3^3*P_1)/3^6 := 3^-2 + 3 + 3^3 + 3^4 + O(3^5)
169
H_2(3^4*P_1)/3^8 := 3^-2 + 3 + 3^3 + 3^4 + O(3^5)
170
171
H_2(3^1*P_2)/3^2 := undef
172
H_2(3^2*P_2)/3^4 := -3^-2 - 3^-1 + 3 - 3^2 + 3^3 + 3^4 + O(3^5)
173
H_2(3^3*P_2)/3^6 := -3^-2 - 3^-1 + 3 + 3^2 - 3^3 + O(3^5)
174
H_2(3^4*P_2)/3^8 := -3^-2 - 3^-1 + 3 + 3^2 - 3^3 + O(3^5)
175
176
-------------------------------------------------------------
177
E: 446D, K=Q(sqrt(-23))
178
H_2(3^1*P_1)/3^2 := -3^-2 - 3^-1 + 3 - 3^2 - 3^4 + O(3^5)
179
H_2(3^2*P_1)/3^4 := undef
180
H_2(3^3*P_1)/3^6 := undef
181
H_2(3^4*P_1)/3^8 := 3^-7 - 3^-6 - 3^-4 - 3^-3 - 3^-2 + 3^-1 - 1 - 3 - 3^3 + 3^4 + O(3^5)
182
183
H_2(3^1*P_2)/3^2 := undef
184
H_2(3^2*P_2)/3^4 := undef
185
H_2(3^3*P_2)/3^6 := undef
186
H_2(3^4*P_2)/3^8 := undef
187
188
-------------------------------------------------------------
189
E: 571B, K=Q(sqrt(-8))
190
H_2(3^1*P_1)/3^2 := 3^-1 + 3^2 + 3^3 - 3^4 + O(3^5)
191
H_2(3^2*P_1)/3^4 := -3^-2 + 3^-1 + 1 + 3^4 + O(3^5)
192
H_2(3^3*P_1)/3^6 := -3^-2 + 3^-1 - 1 - 3^4 + O(3^5)
193
H_2(3^4*P_1)/3^8 := -3^-2 + 3^-1 - 1 + 3^2 - 3^3 + 3^4 + O(3^5)
194
195
H_2(3^1*P_2)/3^2 := -1 - 3 - 3^2 - 3^3 + 3^4 + O(3^5)
196
H_2(3^2*P_2)/3^4 := 3^-3 - 3^-2 + 3^-1 - 1 - 3^2 + O(3^5)
197
H_2(3^3*P_2)/3^6 := 3^-3 - 3^-2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5)
198
H_2(3^4*P_2)/3^8 := 3^-3 - 3^-2 - 3 + 3^2 + O(3^5)
199
200
-------------------------------------------------------------
201
E: 643A, K=Q(sqrt(-8))
202
H_2(3^1*P_1)/3^2 := undef
203
H_2(3^2*P_1)/3^4 := undef
204
H_2(3^3*P_1)/3^6 := undef
205
H_2(3^4*P_1)/3^8 := undef
206
207
H_2(3^1*P_2)/3^2 := 3^-1 - 1 - 3 - 3^3 + O(3^5)
208
H_2(3^2*P_2)/3^4 := -3^-3 - 3^-2 - 3^-1 - 3^2 + 3^3 + O(3^5)
209
H_2(3^3*P_2)/3^6 := -3^-3 - 3^-2 + 3 + 3^2 - 3^4 + O(3^5)
210
H_2(3^4*P_2)/3^8 := -3^-3 - 3^-2 - 3^3 - 3^4 + O(3^5)
211
212
-------------------------------------------------------------
213
E: 655A, K=Q(sqrt(-56))
214
H_2(3^1*P_1)/3^2 := undef
215
H_2(3^2*P_1)/3^4 := undef
216
H_2(3^3*P_1)/3^6 := -3^-5 + 3^-4 + 3^-3 + 3^-2 - 3^-1 - 1 - 3 - 3^2 - 3^4 + O(3^5)
217
H_2(3^4*P_1)/3^8 := undef
218
219
H_2(3^1*P_2)/3^2 := 3 - 3^2 - 3^4 + O(3^5)
220
H_2(3^2*P_2)/3^4 := 3^-3 + 3^-2 - 3^-1 + 1 - 3^2 + O(3^5)
221
H_2(3^3*P_2)/3^6 := undef
222
H_2(3^4*P_2)/3^8 := -3^-6 - 3^-3 + 3^-2 - 3^3 + O(3^5)
223
224
-------------------------------------------------------------
225
E: 664A, K=Q(sqrt(-47))
226
H_2(3^1*P_1)/3^2 := 3^-1 + 1 + 3 + 3^2 + 3^3 + O(3^5)
227
H_2(3^2*P_1)/3^4 := undef
228
H_2(3^3*P_1)/3^6 := undef
229
H_2(3^4*P_1)/3^8 := -3^-6 - 3^-5 + 3^-3 + 3^2 + 3^3 - 3^4 + O(3^5)
230
231
H_2(3^1*P_2)/3^2 := 3^-1 + 1 - 3 + 3^2 - 3^3 + O(3^5)
232
H_2(3^2*P_2)/3^4 := undef
233
H_2(3^3*P_2)/3^6 := undef
234
H_2(3^4*P_2)/3^8 := 3^-6 - 3^-5 + 3^-4 - 3^-3 + 3^-2 - 3^-1 + 1 - 3^2 - 3^3 + 3^4 + O(3^5)
235
236
-------------------------------------------------------------
237
E: 707A, K=Q(sqrt(-20))
238
H_2(3^1*P_1)/3^2 := 3^-1 - 1 + 3^2 - 3^3 + O(3^5)
239
H_2(3^2*P_1)/3^4 := 3^-1 - 1 - 3^2 + O(3^5)
240
H_2(3^3*P_1)/3^6 := 3^-1 - 1 - 3^2 + 3^4 + O(3^5)
241
H_2(3^4*P_1)/3^8 := 3^-1 - 1 - 3^2 + 3^4 + O(3^5)
242
243
H_2(3^1*P_2)/3^2 := undef
244
H_2(3^2*P_2)/3^4 := -3^-2 - 3^-1 - 1 + 3^3 + 3^4 + O(3^5)
245
H_2(3^3*P_2)/3^6 := -3^-2 - 3^-1 - 1 - 3^2 - 3^4 + O(3^5)
246
H_2(3^4*P_2)/3^8 := -3^-2 - 3^-1 - 1 - 3^2 - 3^4 + O(3^5)
247
248
-------------------------------------------------------------
249
E: 718B, K=Q(sqrt(-71))
250
H_2(3^1*P_1)/3^2 := undef
251
H_2(3^2*P_1)/3^4 := 3^-3 - 3^-2 - 3^-1 + 1 + 3 + 3^2 - 3^3 - 3^4 + O(3^5)
252
H_2(3^3*P_1)/3^6 := 3^-3 + 3^-2 - 3^-1 + 1 + 3^2 + 3^3 + O(3^5)
253
H_2(3^4*P_1)/3^8 := 3^-3 + 3^-2 - 3^-1 - 3 + 3^3 - 3^4 + O(3^5)
254
255
H_2(3^1*P_2)/3^2 := undef
256
H_2(3^2*P_2)/3^4 := 3^-3 + 3^-2 - 1 + 3 + 3^2 - 3^4 + O(3^5)
257
H_2(3^3*P_2)/3^6 := 3^-3 + 3^-1 - 1 - 3 + 3^2 - 3^3 + 3^4 + O(3^5)
258
H_2(3^4*P_2)/3^8 := 3^-3 + 3^-1 + 1 + 3^2 - 3^3 + 3^4 + O(3^5)
259
260
-------------------------------------------------------------
261
E: 794A, K=Q(sqrt(-23))
262
H_2(3^1*P_1)/3^2 := 3^-2 + 3^-1 - 1 - 3 - 3^2 - 3^3 - 3^4 + O(3^5)
263
H_2(3^2*P_1)/3^4 := -3^-2 + 1 - 3^3 + O(3^5)
264
H_2(3^3*P_1)/3^6 := -3^-2 - 3 + 3^3 + 3^4 + O(3^5)
265
H_2(3^4*P_1)/3^8 := -3^-2 - 3 - 3^2 + O(3^5)
266
267
H_2(3^1*P_2)/3^2 := 3^-2 - 3^-1 - 1 + 3 + 3^2 + O(3^5)
268
H_2(3^2*P_2)/3^4 := 3^-3 + 3^-2 - 3^-1 - 1 - 3 + 3^2 - 3^4 + O(3^5)
269
H_2(3^3*P_2)/3^6 := 3^-3 + 3^-2 + 3^-1 + 3 - 3^2 - 3^4 + O(3^5)
270
H_2(3^4*P_2)/3^8 := 3^-3 + 3^-2 + 3^-1 - 3^3 - 3^4 + O(3^5)
271
272
-------------------------------------------------------------
273
E: 817A, K=Q(sqrt(-8))
274
H_2(3^1*P_1)/3^2 := undef
275
H_2(3^2*P_1)/3^4 := -3^-3 + 3^-1 + 3 - 3^2 - 3^3 - 3^4 + O(3^5)
276
H_2(3^3*P_1)/3^6 := -3^-3 - 3^-1 + 1 - 3 + 3^4 + O(3^5)
277
H_2(3^4*P_1)/3^8 := -3^-3 - 3^-1 + 1 + 3 + 3^2 - 3^3 - 3^4 + O(3^5)
278
279
H_2(3^1*P_2)/3^2 := undef
280
H_2(3^2*P_2)/3^4 := -3^-3 + 3^-2 - 3^-1 - 3 - 3^2 + 3^3 - 3^4 + O(3^5)
281
H_2(3^3*P_2)/3^6 := -3^-3 + 3^-2 - 1 + 3^2 - 3^3 + 3^4 + O(3^5)
282
H_2(3^4*P_2)/3^8 := -3^-3 + 3^-2 - 1 - 3 - 3^2 + 3^3 + O(3^5)
283
284
\end{verbatim}
285
286
287
288
\newpage
289
\section{Source Code}
290
The \magma{} source code that I'm using is given below. Though it
291
depends on lots of other \magma{} code, at least it describes what I'm
292
computing fairly precisely.
293
\begin{verbatim}
294
/*******************************************************************
295
*
296
* anti-cyclotomic.m -- test Mazur's "sign conjecture"
297
*
298
* William A. Stein
299
*
300
* April 2001
301
*
302
* The file anti-cyclotomic_height.tex, which Mazur wrote,
303
* describes the algorithm that is implemented below.
304
*
305
********************************************************************/
306
307
declare verbose ac_height, 2;
308
309
intrinsic IsAcceptableK(E::CrvEll, p::RngIntElt, D::RngIntElt) -> BoolElt
310
// {True if and only if K=Q(sqrt(D)) satisfies conditions (a)--(d).}
311
{True if rank(E) is odd, which for all practical purposes in our cases means 1.}
312
313
if not IsFundamental(D) then
314
return false;
315
end if;
316
317
// condition (a)
318
N := Conductor(E);
319
if GCD(D,N*p) ne 1 then
320
return false;
321
end if;
322
323
// condition (b)
324
R<x> := PolynomialRing(RationalField());
325
K := NumberField(x^2-D);
326
O := MaximalOrder(K);
327
if #Factorization(ideal<O|p>) eq 1 then
328
return false;
329
end if;
330
331
332
// condition (c) // equiv to condition (d)?
333
// all primes dividing N split
334
for fac in Factorization(N) do
335
if IsOdd(fac[2]) and #Factorization(ideal<O|fac[1]>) eq 1 then
336
return false;
337
end if;
338
end for;
339
340
341
// condition (d)
342
E_D := QuadraticTwist(E,D);
343
if Evaluate(KroneckerCharacter(D),-N) eq 1 then // there's no chance to have rank 1
344
return false;
345
end if;
346
347
return true;
348
end intrinsic;
349
350
351
intrinsic FindAcceptableK(E::CrvEll, p::RngIntElt, Dmin::RngIntElt, Dmax::RngIntElt) -> SeqEnum
352
{The fields K whose discriminant lie between Dmin and Dmax and satisfy conditions (a)--(d).}
353
354
require IsPrime(p) and p gt 0 : "Argument 2 must be a prime number.";
355
require Dmin lt 0: "Argument 3 must be negative.";
356
require Dmax lt 0: "Argument 4 must be negative.";
357
require Dmin le Dmax: "Argument 3 must be less than or equal to argument 4.";
358
359
N := Conductor(E);
360
vprint ac_height : "Finding acceptable K for E of conductor", N;
361
return Reverse([D : D in [Dmin..Dmax] | IsAcceptableK(E,p,D)]);
362
end intrinsic;
363
364
365
intrinsic FindAcceptableK(E::CrvEll, p::RngIntElt) -> RngIntElt
366
{}
367
D := -1;
368
while true do
369
if IsAcceptableK(E,p,D) then
370
return D;
371
end if;
372
D := D - 1;
373
end while;
374
end intrinsic;
375
376
377
intrinsic QuadraticIdeal(I::RngOrdIdl, phi::Map) -> RngQuadIdl
378
{The ideal of the appropriate quadratic field defined by the
379
ideal I of a quadratic number field. This function exists only
380
because quadratic fields and number fields are distinct types
381
in MAGMA. Phi is a map from FractionField(Order(I)) to a
382
quadratic field.}
383
"Quad Ideal";
384
K := FieldOfFractions(Order(I));
385
L := Codomain(phi);
386
O := MaximalOrder(L);
387
"O=",O;
388
gens := [O!phi(K!g) : g in Generators(I)];
389
"gens=",gens;
390
Parent(gens[1]);
391
I := ideal<O | gens>;
392
"I=",I;
393
return I;
394
end intrinsic;
395
396
397
intrinsic rhotilde(I::RngOrdIdl , pi::RngLocElt, pibar::RngLocElt) -> FldLocElt
398
{I is an ideal of O_K that is coprime to p. Each of pi and pibar define
399
a map from O_K to Z_p; pi is the image of O.1, and similarly for pibar.
400
(Note that pi and pibar are computed by finding the roots of the charpoly
401
of O.1 over Z_p.)}
402
403
vprint ac_height : "rhotilde(I,", pi, ",", pibar,")";
404
405
p := Prime(Parent(pi));
406
time n := Numerator(Norm(I));
407
if n mod p eq 0 then
408
vprint ac_height : "Bad point.";
409
return false;
410
end if;
411
O := Order(I);
412
u := #UnitGroup(O);
413
vprint ac_height: "Computing class number h";
414
h := ClassNumber(O);
415
vprint ac_height: "Class number h =", h;
416
v := (p-1)*u*h;
417
vprint ac_height : "Raising ideal to the power h";
418
Ih := I^h;
419
vprint ac_height : "Finding generator for the principal ideal I^h";
420
_, alpha_h := IsPrincipal(Ih);
421
vprint ac_height : "I^h is principal.";
422
rep := Eltseq(alpha_h);
423
vprint ac_height : "Computing embeddings of canonical power of generator into Qp";
424
pi_alpha_v := (rep[1]+rep[2]*pi)^((p-1)*u);
425
pibar_alpha_v := (rep[1]+rep[2]*pibar)^((p-1)*u);
426
vprint ac_height : "pi_alpha_v =", pi_alpha_v;
427
vprint ac_height : "pibar_alpha_v =", pibar_alpha_v;
428
429
vprint ac_height : "pi_alpha_v-1 = ", pi_alpha_v-1;
430
val1 := Valuation(pi_alpha_v-1);
431
vprint ac_height : "Valuation(pi_alpha_v-1) = ", val1;
432
vprint ac_height : "pibar_alpha_v-1 = ", pibar_alpha_v-1;
433
val2 := Valuation(pibar_alpha_v-1);
434
vprint ac_height : "Valuation(pibar_alpha_v-1) = ", val2;
435
436
if val1*val2 eq 0 then
437
vprint ac_height : "Bad point.";
438
return false;
439
end if;
440
441
vprint ac_height : "Valuations ok -- now computing p-adic logarithms.";
442
logpi := Log(pi_alpha_v);
443
vprint ac_height : "lambda(pi_alpha_v) =", logpi;
444
logpibar := Log(pibar_alpha_v);
445
vprint ac_height : "lambda(pibar_alpha_v) =", logpibar;
446
447
return 1/v * ( logpi - logpibar );
448
end intrinsic;
449
450
intrinsic Num_and_Denom_Ideals(x::FldNumElt) -> RngOrdIdl
451
{I and J, where I is the numerator ideal of x and J is the denominator ideal of x.}
452
453
// We compute the denominator ideal as follows. Compute
454
// the intersection of the image of multiplication by x
455
// and O inside K. Let a and b be generators for this intersection,
456
// as a Z-module. Then the denominator ideal is generated by
457
// a/x and b/x. The numerator ideal is then generated by a and b.
458
459
vprint ac_height : "NumeratorIdeal()";
460
461
L := Parent(x);
462
O := MaximalOrder(L);
463
I := ideal<O|1>;
464
xI := x*I;
465
B := [L!z : z in Basis(I meet xI)];
466
a,b := Explode(B);
467
J := a/x*O + b/x*O;
468
I := ideal<O|a,b>;
469
return I, J;
470
471
end intrinsic;
472
473
474
intrinsic H_2(P::CrvEllPt, p::RngIntElt) -> FldLocElt
475
{The function H_2 defined in Mazur's note. This is rhotilde(J*x(P))/2, where
476
J is the "ideal denominator" of the principal ideal (x(P)) generated by
477
the x-coordinate of P.}
478
479
vprint ac_height : "H_2()";
480
481
require IsPrime(p) and p gt 0 : "Argument 2 must be a prime number.";
482
483
E := Parent(P);
484
K := BaseRing(E);
485
require Type(K) eq FldNum and Degree(K) eq 2 and Discriminant(K) lt 0 :
486
"The base field of the parent of argument 1 must be a quadratic imaginary number field.";
487
488
O := MaximalOrder(K);
489
f := PolynomialRing(pAdicRing(p : Precision := 40))!MinimalPolynomial(Basis(O)[2]);
490
fac := Factorization(f);
491
require #fac eq 2 : "Argument 2 must split in the base field of the parent of argument 1.";
492
pi := -Evaluate(fac[1][1],0);
493
pibar := -Evaluate(fac[2][1],0);
494
495
if P[3] eq 0 then
496
return pAdicField(p)!0;
497
end if;
498
x := P[1]/P[3];
499
500
I, J := Num_and_Denom_Ideals(x);
501
r := rhotilde(I, pi, pibar);
502
if Type(r) eq BoolElt then
503
return r;
504
end if;
505
return r/2;
506
507
end intrinsic;
508
509
510
intrinsic Pairing(P::CrvEllPt, Q::CrvEllPt, p::RngIntElt, n::RngIntElt) -> FldLocElt
511
{Let h(x) = H_2(p^n*x)/p^(2n). Then this returns
512
h(P+Q) + h(P-Q) - 2*h(P) - 2*h(Q),
513
which is an approximation for the height pairing of P and Q.}
514
function h(x,p)
515
return H_2(p^n*x,p)/p^(2*n);
516
end function;
517
return h(P+Q,p) + h(P-Q,p) - 2*h(P,p) - 2*h(Q,p);
518
end intrinsic;
519
520
521
intrinsic PointFromTwist(E::CrvEll, D::RngIntElt) -> CrvEllPt
522
{The point on E/Q(sqrt(D)) corresponding to a generator of E_D(Q)/tor,
523
assuming that the latter group has rank 1.}
524
525
Ew := WeierstrassModel(E);
526
_,_,_,a,b := Explode(aInvariants(Ew));
527
E_D := EllipticCurve([D^2*a,D^3*b]);
528
G,f := MordellWeilGroup(E_D : Bound := 2, HeightBound := 0.5);
529
// require TorsionFreeRank(G) eq 1 : "The twist of argument 1 by argument 2 must have rank 1.";
530
if TorsionFreeRank(G) gt 1 then
531
print "WARNING: rank is > 1 for E = ", E, " D = ", D;
532
end if;
533
if TorsionFreeRank(G) lt 1 then
534
return false;
535
/*
536
print "WARNING: rank of E_D computed is < 1. We have E = ", aInvariants(E), " D = ", D;
537
print "WARNING: rank computed is < 1 for E_D = ", aInvariants(E_D);
538
G,f := MordellWeilGroup(E_D); // this might take longer...!
539
print "Computed generators and go = ", G;
540
*/
541
end if;
542
543
// P is the generator for E_D(Q)/tor
544
P := f(G.Ngens(G));
545
x := P[1]/P[3];
546
y := P[2]/P[3];
547
548
R<z> := PolynomialRing(Rationals());
549
K<sqrtD> := NumberField(z^2-D);
550
Ew,_,psi := WeierstrassModel(E);
551
Ew := BaseExtend(Ew,K);
552
Pw := [x/D, (y/D^2)*sqrtD];
553
Q := Ew!Pw;
554
Qx := Q[1]/Q[3];
555
Qy := Q[2]/Q[3];
556
r,s,t,u := Explode(IsomorphismData(psi));
557
558
// (x, y) |-> (u^2x + r, u^3 y + su^2 x + t).
559
X := u^2*Qx + r;
560
Y := u^3*Qy + s*u^2*Qx + t;
561
E := BaseExtend(E,K);
562
return E![X,Y], E;
563
564
end intrinsic;
565
566
intrinsic TestNontrivialityConjecture(E::CrvEll, p::RngIntElt,
567
n::RngIntElt) -> List, RngIntElt
568
{}
569
require IsPrime(p) and p gt 0 : "Argument 2 must be a prime number.";
570
require Conductor(E) mod p ne 0 : "Argument 1 must have good reduction at argument 2.";
571
572
D := FindAcceptableK(E,p);
573
return TestNontrivialityConjecture(E,p,n,[D]), D;
574
end intrinsic;
575
576
577
intrinsic TestNontrivialityConjecture(E::CrvEll, p::RngIntElt, n::RngIntElt, Dlist::SeqEnum)
578
-> List
579
{Let E be a rank two elliptic curve and let P1, P2 be a basis for E(Q).
580
Let P = P1 + P0, where P0 is a point of infinite order in E_D(Q) subset E(Q(sqrt(D))).
581
The value returned is a list of pairs
582
583
<D, [* H_2(P), H_2(p*P)/p^2, H_2(p^2*P)/p^4, ..., H_2(p^(2*n)*P)/p^(2*n) *]>
584
585
Some of the H_2 values might equal false, if the point doesn't like in the
586
appropriate subgroup for H_2 to be defined.
587
}
588
589
require IsPrime(p) and p gt 0 : "Argument 2 must be a prime number.";
590
require Conductor(E) mod p ne 0 : "Argument 1 must have good reduction at argument 2.";
591
592
G,f := MordellWeilGroup(E);
593
require TorsionFreeRank(G) eq 2 : "Argument 1 must have rank 2.";
594
P1 := f(G.(Ngens(G)-1));
595
P2 := f(G.Ngens(G));
596
597
ans := [* *];
598
for D in Dlist do
599
P0 := PointFromTwist(E,D);
600
if Type(P0) eq BoolElt then
601
print "Couldn't find a point on the twist quickly enough, so bailing.";
602
print "E = ", E;
603
print "D = ", D;
604
continue;
605
end if;
606
Pa := P0 + Parent(P0)!Eltseq(P1);
607
Pb := P0 + Parent(P0)!Eltseq(P2);
608
hts := [* *];
609
for m in [1..n] do
610
H2a := H_2(Pa,p);
611
H2b := H_2(Pb,p);
612
613
if Type(H2a) ne BoolElt then
614
H2a := H2a/p^(2*m);
615
end if;
616
if Type(H2b) ne BoolElt then
617
H2b := H2b/p^(2*m);
618
end if;
619
Append(~hts, <H2a, H2b>);
620
621
vprint ac_height : "When m =", m, " hts = ", hts;
622
623
if m lt n then
624
vprint ac_height : "Multiplying each point by", p;
625
time Pa := p*Pa;
626
time Pb := p*Pb;
627
end if;
628
end for;
629
Append(~ans, <D, hts>);
630
vprint ac_height : "Answer so far = ", ans;
631
end for;
632
633
return ans;
634
end intrinsic;
635
636
637
638
intrinsic Rank2Curve(n::RngIntElt) -> CrvEll
639
{}
640
curves := ["389A","433A","446D", "563A","571B","643A","655A","664A","681C",
641
"707A","709A","718B","794A","817A","916C","944E","997B","997C","1001C",
642
"1028A","1034A","1058C","1070A","1073A","1077A","1088J","1094A","1102A",
643
"1126A","1132A","1137A","1141A","1143C","1147A","1171A"];
644
require n ge 1 and n le #curves : "Argument 1 must be between 1 and", #curves;
645
646
return EllipticCurve(CremonaDatabase(),curves[n]), curves[n];
647
end intrinsic;
648
649
650
intrinsic SmallestDTest(p::RngIntElt)
651
{}
652
out := Open(Sprintf("SmallestDTest_p%o.out",p),"w");
653
654
for n in [1..35] do
655
E, label := Rank2Curve(n);
656
if Conductor(E) mod p eq 0 then
657
continue;
658
end if;
659
f := qEigenform(E,p+1);
660
if Coefficient(f,p) eq 0 then
661
continue;
662
end if;
663
fprintf out, "\n// ** %o **: %o\n", label, E;
664
Flush(out);
665
ans, D := TestNontrivialityConjecture(E,p,4);
666
fprintf out, "\n// Q(sqrt(%o))\n\n", D;
667
fprintf out, "heights[%o] := %o;\n\n", n, ans;
668
Flush(out);
669
end for;
670
end intrinsic;
671
672
673
intrinsic EquidisTest(curve::MonStgElt, p::RngIntElt, n::RngIntElt, Dstart::RngIntElt, Dstop::RngIntElt)
674
{}
675
// curve := "389A";
676
E := EllipticCurve(CremonaDatabase(),curve);
677
D := FindAcceptableK(E,p,Dstop,Dstart);
678
Qp<q> := pAdicField(p);
679
Qp`SeriesPrinting := true;
680
681
vprint ac_height : "Finding mordell Weil group of", E;
682
G,f := MordellWeilGroup(E);
683
out := Open(Sprintf("equidis_test_%o_p%o_n%o_d%o.m", curve, p, n, Dstart),"w");
684
fprintf out, "D = %o\n", D;
685
686
for d in D do
687
t := Cputime();
688
fprintf out, "\nK = Q(sqrt(%o)):\t", d;
689
vprint ac_height : "Finding point on twist by", d;
690
P := PointFromTwist(E,d);
691
vprint ac_height : "The point is P = ", P;
692
if Type(P) eq BoolElt then
693
continue;
694
end if;
695
EE := Parent(P);
696
P0 := EE!Eltseq(f(G.1));
697
P1 := EE!Eltseq(f(G.2));
698
vprint ac_height : "Computing first height.";
699
hAC := H_2(p^n*(P0+P),p);
700
if Type(hAC) ne BoolElt then
701
hAC := hAC/p^(2*n);
702
vprint ac_height : "Computing second height.";
703
hBC := H_2(p^n*(P1+P),p);
704
if Type(hBC) ne BoolElt then
705
hBC := hBC/p^(2*n);
706
end if;
707
end if;
708
if Type(hAC) eq BoolElt or Type(hBC) eq BoolElt then
709
fprintf out, "(no data)";
710
else
711
r := hAC/hBC;
712
fprintf out, "%o", r;
713
end if;
714
fprintf out, " (time = %o)\n", Cputime(t);
715
Flush(out);
716
end for;
717
718
end intrinsic;
719
\end{verbatim}
720
721
722
\end{document}
723