CoCalc Public Fileswww / papers / anti-cyclotomic_height_pairing / height.tex
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
19Let~$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$
23splits in~$K$.  For these $K$, Barry has told me how to compute
24a naive height function
25$$H_2 : E(K)' \ra \Qp,$$
26where $E(K)'$ is a certain finite-index subgroup of $E(K)$.
27Let
28   $$h^*(x) = H_2(p^2x)/p^4$$
29be the second order'' approximation to
30the canonical height.  Let $C_K\in E(K)$ denote a point
31that arises from a $\Q$-rational point of infinite order
32on the quadratic twist of~$E$ corresponding to~$K$.
33\begin{definition}
34The {\em slope of the $K$-line} of $E$ is
35$\displaystyle \frac{h(P+C_K)}{h(Q+C_K)}.$
36\end{definition}
37
38The following tables report on some partial computations of this
39slope.  Experience of the author suggests, but does not prove, that
40the data below is equal to the slope modulo~$3^2$.  (In particular, I
41bet that the column labeled slope modulo $9$'' is really the slope
42modulo $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}
133This numerical experiment gives evidence that the height pairing on
134$E(K)$ is nontrivial when $p=3$.  I ran the following computation for
135many 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
138satisfies 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
140of rational points on the twist of $E$ by $K$.
141Set $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
143value is undefined in some cases, because the first coordinate of $3^n 144P_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
146sometimes we get lucky and can compute'' $H_2(P)$ even though the
147point doesn't lie in the special subgroup of Perrin-Riou's paper.
148See, e.g., {\tt 446D}.
149\end{enumerate}
150
151
152\begin{verbatim}
153E: 389A, K=Q(sqrt(-11))
154H_2(3^1*P_1)/3^2 := undef
155H_2(3^2*P_1)/3^4 := -3^-3 - 3^-1 - 1 + 3 - 3^2 + 3^4 + O(3^5)
156H_2(3^3*P_1)/3^6 := -3^-3 + 3^-2 + 1 + 3 + 3^3 + O(3^5)
157H_2(3^4*P_1)/3^8 := -3^-3 + 3^-2 - 1 - 3 + 3^2 - 3^3 - 3^4 + O(3^5)
158
159H_2(3^1*P_2)/3^2 := undef
160H_2(3^2*P_2)/3^4 := -3^-3 + 3^-2 - 3^-1 + 1 + 3 - 3^2 - 3^3 + O(3^5)
161H_2(3^3*P_2)/3^6 := -3^-3 - 3^-2 + 3^-1 + 1 - 3 + 3^2 - 3^3 + 3^4 + O(3^5)
162H_2(3^4*P_2)/3^8 := -3^-3 - 3^-2 + 3^-1 - 1 + O(3^5)
163
164-------------------------------------------------------------
165E: 433A, K=Q(sqrt(-8))
166H_2(3^1*P_1)/3^2 := -3^-1 + 1 - 3 + 3^3 + O(3^5)
167H_2(3^2*P_1)/3^4 := 3^-2 + 3 - 3^2 + 3^3 + 3^4 + O(3^5)
168H_2(3^3*P_1)/3^6 := 3^-2 + 3 + 3^3 + 3^4 + O(3^5)
169H_2(3^4*P_1)/3^8 := 3^-2 + 3 + 3^3 + 3^4 + O(3^5)
170
171H_2(3^1*P_2)/3^2 := undef
172H_2(3^2*P_2)/3^4 := -3^-2 - 3^-1 + 3 - 3^2 + 3^3 + 3^4 + O(3^5)
173H_2(3^3*P_2)/3^6 := -3^-2 - 3^-1 + 3 + 3^2 - 3^3 + O(3^5)
174H_2(3^4*P_2)/3^8 := -3^-2 - 3^-1 + 3 + 3^2 - 3^3 + O(3^5)
175
176-------------------------------------------------------------
177E: 446D, K=Q(sqrt(-23))
178H_2(3^1*P_1)/3^2 := -3^-2 - 3^-1 + 3 - 3^2 - 3^4 + O(3^5)
179H_2(3^2*P_1)/3^4 := undef
180H_2(3^3*P_1)/3^6 := undef
181H_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
183H_2(3^1*P_2)/3^2 := undef
184H_2(3^2*P_2)/3^4 := undef
185H_2(3^3*P_2)/3^6 := undef
186H_2(3^4*P_2)/3^8 := undef
187
188-------------------------------------------------------------
189E: 571B, K=Q(sqrt(-8))
190H_2(3^1*P_1)/3^2 := 3^-1 + 3^2 + 3^3 - 3^4 + O(3^5)
191H_2(3^2*P_1)/3^4 := -3^-2 + 3^-1 + 1 + 3^4 + O(3^5)
192H_2(3^3*P_1)/3^6 := -3^-2 + 3^-1 - 1 - 3^4 + O(3^5)
193H_2(3^4*P_1)/3^8 := -3^-2 + 3^-1 - 1 + 3^2 - 3^3 + 3^4 + O(3^5)
194
195H_2(3^1*P_2)/3^2 := -1 - 3 - 3^2 - 3^3 + 3^4 + O(3^5)
196H_2(3^2*P_2)/3^4 := 3^-3 - 3^-2 + 3^-1 - 1 - 3^2 + O(3^5)
197H_2(3^3*P_2)/3^6 := 3^-3 - 3^-2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5)
198H_2(3^4*P_2)/3^8 := 3^-3 - 3^-2 - 3 + 3^2 + O(3^5)
199
200-------------------------------------------------------------
201E: 643A, K=Q(sqrt(-8))
202H_2(3^1*P_1)/3^2 := undef
203H_2(3^2*P_1)/3^4 := undef
204H_2(3^3*P_1)/3^6 := undef
205H_2(3^4*P_1)/3^8 := undef
206
207H_2(3^1*P_2)/3^2 := 3^-1 - 1 - 3 - 3^3 + O(3^5)
208H_2(3^2*P_2)/3^4 := -3^-3 - 3^-2 - 3^-1 - 3^2 + 3^3 + O(3^5)
209H_2(3^3*P_2)/3^6 := -3^-3 - 3^-2 + 3 + 3^2 - 3^4 + O(3^5)
210H_2(3^4*P_2)/3^8 := -3^-3 - 3^-2 - 3^3 - 3^4 + O(3^5)
211
212-------------------------------------------------------------
213E: 655A, K=Q(sqrt(-56))
214H_2(3^1*P_1)/3^2 := undef
215H_2(3^2*P_1)/3^4 := undef
216H_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)
217H_2(3^4*P_1)/3^8 := undef
218
219H_2(3^1*P_2)/3^2 := 3 - 3^2 - 3^4 + O(3^5)
220H_2(3^2*P_2)/3^4 := 3^-3 + 3^-2 - 3^-1 + 1 - 3^2 + O(3^5)
221H_2(3^3*P_2)/3^6 := undef
222H_2(3^4*P_2)/3^8 := -3^-6 - 3^-3 + 3^-2 - 3^3 + O(3^5)
223
224-------------------------------------------------------------
225E: 664A, K=Q(sqrt(-47))
226H_2(3^1*P_1)/3^2 := 3^-1 + 1 + 3 + 3^2 + 3^3 + O(3^5)
227H_2(3^2*P_1)/3^4 := undef
228H_2(3^3*P_1)/3^6 := undef
229H_2(3^4*P_1)/3^8 := -3^-6 - 3^-5 + 3^-3 + 3^2 + 3^3 - 3^4 + O(3^5)
230
231H_2(3^1*P_2)/3^2 := 3^-1 + 1 - 3 + 3^2 - 3^3 + O(3^5)
232H_2(3^2*P_2)/3^4 := undef
233H_2(3^3*P_2)/3^6 := undef
234H_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-------------------------------------------------------------
237E: 707A, K=Q(sqrt(-20))
238H_2(3^1*P_1)/3^2 := 3^-1 - 1 + 3^2 - 3^3 + O(3^5)
239H_2(3^2*P_1)/3^4 := 3^-1 - 1 - 3^2 + O(3^5)
240H_2(3^3*P_1)/3^6 := 3^-1 - 1 - 3^2 + 3^4 + O(3^5)
241H_2(3^4*P_1)/3^8 := 3^-1 - 1 - 3^2 + 3^4 + O(3^5)
242
243H_2(3^1*P_2)/3^2 := undef
244H_2(3^2*P_2)/3^4 := -3^-2 - 3^-1 - 1 + 3^3 + 3^4 + O(3^5)
245H_2(3^3*P_2)/3^6 := -3^-2 - 3^-1 - 1 - 3^2 - 3^4 + O(3^5)
246H_2(3^4*P_2)/3^8 := -3^-2 - 3^-1 - 1 - 3^2 - 3^4 + O(3^5)
247
248-------------------------------------------------------------
249E: 718B, K=Q(sqrt(-71))
250H_2(3^1*P_1)/3^2 := undef
251H_2(3^2*P_1)/3^4 := 3^-3 - 3^-2 - 3^-1 + 1 + 3 + 3^2 - 3^3 - 3^4 + O(3^5)
252H_2(3^3*P_1)/3^6 := 3^-3 + 3^-2 - 3^-1 + 1 + 3^2 + 3^3 + O(3^5)
253H_2(3^4*P_1)/3^8 := 3^-3 + 3^-2 - 3^-1 - 3 + 3^3 - 3^4 + O(3^5)
254
255H_2(3^1*P_2)/3^2 := undef
256H_2(3^2*P_2)/3^4 := 3^-3 + 3^-2 - 1 + 3 + 3^2 - 3^4 + O(3^5)
257H_2(3^3*P_2)/3^6 := 3^-3 + 3^-1 - 1 - 3 + 3^2 - 3^3 + 3^4 + O(3^5)
258H_2(3^4*P_2)/3^8 := 3^-3 + 3^-1 + 1 + 3^2 - 3^3 + 3^4 + O(3^5)
259
260-------------------------------------------------------------
261E: 794A, K=Q(sqrt(-23))
262H_2(3^1*P_1)/3^2 := 3^-2 + 3^-1 - 1 - 3 - 3^2 - 3^3 - 3^4 + O(3^5)
263H_2(3^2*P_1)/3^4 := -3^-2 + 1 - 3^3 + O(3^5)
264H_2(3^3*P_1)/3^6 := -3^-2 - 3 + 3^3 + 3^4 + O(3^5)
265H_2(3^4*P_1)/3^8 := -3^-2 - 3 - 3^2 + O(3^5)
266
267H_2(3^1*P_2)/3^2 := 3^-2 - 3^-1 - 1 + 3 + 3^2 + O(3^5)
268H_2(3^2*P_2)/3^4 := 3^-3 + 3^-2 - 3^-1 - 1 - 3 + 3^2 - 3^4 + O(3^5)
269H_2(3^3*P_2)/3^6 := 3^-3 + 3^-2 + 3^-1 + 3 - 3^2 - 3^4 + O(3^5)
270H_2(3^4*P_2)/3^8 := 3^-3 + 3^-2 + 3^-1 - 3^3 - 3^4 + O(3^5)
271
272-------------------------------------------------------------
273E: 817A, K=Q(sqrt(-8))
274H_2(3^1*P_1)/3^2 := undef
275H_2(3^2*P_1)/3^4 := -3^-3 + 3^-1 + 3 - 3^2 - 3^3 - 3^4 + O(3^5)
276H_2(3^3*P_1)/3^6 := -3^-3 - 3^-1 + 1 - 3 + 3^4 + O(3^5)
277H_2(3^4*P_1)/3^8 := -3^-3 - 3^-1 + 1 + 3 + 3^2 - 3^3 - 3^4 + O(3^5)
278
279H_2(3^1*P_2)/3^2 := undef
280H_2(3^2*P_2)/3^4 := -3^-3 + 3^-2 - 3^-1 - 3 - 3^2 + 3^3 - 3^4 + O(3^5)
281H_2(3^3*P_2)/3^6 := -3^-3 + 3^-2 - 1 + 3^2 - 3^3 + 3^4 + O(3^5)
282H_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}
290The \magma{} source code that I'm using is given below.  Though it
291depends on lots of other \magma{} code, at least it describes what I'm
292computing 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
307declare verbose ac_height, 2;
308
309intrinsic 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;
348end intrinsic;
349
350
351intrinsic 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)]);
362end intrinsic;
363
364
365intrinsic 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;
374end intrinsic;
375
376
378{The ideal of the appropriate quadratic field defined by the
379ideal I of a quadratic number field.  This function exists only
380because quadratic fields and number fields are distinct types
381in MAGMA.   Phi is a map from FractionField(Order(I)) to a
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;
390Parent(gens[1]);
391   I := ideal<O | gens>;
392"I=",I;
393   return I;
394end intrinsic;
395
396
397intrinsic 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 );
448end intrinsic;
449
450intrinsic 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
471end intrinsic;
472
473
474intrinsic 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
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
507end intrinsic;
508
509
510intrinsic 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);
518end intrinsic;
519
520
521intrinsic 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
564end intrinsic;
565
566intrinsic 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;
574end intrinsic;
575
576
577intrinsic 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;
634end intrinsic;
635
636
637
638intrinsic 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];
647end intrinsic;
648
649
650intrinsic 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;
670end intrinsic;
671
672
673intrinsic 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   QpSeriesPrinting := 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
718end intrinsic;
719\end{verbatim}
720
721
722\end{document}
723
`