デザート
最近の幾つかの記事で、総積を高速に計算したり、楕円曲線の法pでの解を高速に求めるプログラムを紹介し、それを使って谷山志村対応を具体例で確認してきました。このような計算ができるようになると、やってみたいのが、佐藤テイト予想のグラフ作りです。
佐藤テイト予想はすでにハーバード大学のテイラー教授らによって証明されています。従って「佐藤テイト予想・テイラーの定理」と呼ぶのが正しいかもしれません。
佐藤テイト予想・テイラーの定理
虚数乗法を持たない楕円曲線Eに対して、法pでの解の個数をNsolve(E,p)とする。
$$ \frac{\left| \mathrm{\%Nsolve}\left(E , p\right)-p \right| }{2\,\sqrt{p}}=\cos \vartheta_{p} $$
となる\( \vartheta_{p} \)は様々な値をとるが、\( \frac{2}{\pi}\,sin ^2x \)という形で分布する。
この定理を具体的に確かめるためには、Eを固定して、多くのpについて\( \vartheta_{p}=\arccos\left(\frac{\left| \mathrm{\%Nsolve}\left(E , p\right)-p \right| }{2\,\sqrt{p}} \right) \)を計算しヒストグラムを作って、分布が定理のようになっていることを確かめます。
今回は楕円曲線として\( y^2=x^3-7\,x-6 \)を使います(適当に選びました)。
まず楕円曲線の法pでの解の個数を求める関数Nsolve()とNsolveF()を定義します。
(%i1) Nsolve(elc,p):=block([c:0,evelc],
for x:0 while x<p do
for y:0 while y<p do
(evelc:ev(elc), if 0=mod(rhs(evelc)-lhs(evelc),p) then c:c+1),
return (c))$
(%i2) NsolveF(elc,p):=(elc:ev(elc,nouns),if lhs(elc)#y^2 or p=2 or p=3 then Nsolve(elc,p) else sum(1+ev(jacobi(rhs(elc),p),nouns),x,0,p-1))$
こちらが今回使う楕円曲線の定義です。
(%i3) elc:y^2=x^3-7*x-6;
$$ \tag{%o3} y^2=x^3-7\,x-6 $$
指定された楕円曲線について、指定された範囲の素数に対して\( \vartheta_{p} \)を計算してリストにして返す関数を定義します。
(%i4) sato_tate(elc,minp,maxp):=block([res],
res:[ ],
for p:next_prime(minp-1) next next_prime(p) thru maxp do
(res:append([acos((p-NsolveF(elc,p))/(2*ev(sqrt(p),numer)))],res),
if mod(p,1000)<5 then print(p)),
res)$
ここで定義した関数を全てコンパイルします。
(%i5) compile(Nsolve, NsolveF, sato_tate)$
10000までの素数について\( \vartheta_{p} \)を計算します。
(%i6) res:sato_tate(elc,1,10000)$
グラフ描画用の関数を読み込みます。
(%i7) load(draw)$ load(descriptive)$
グラフを描いてみます。
(%i9) draw2d(proportional_axes=xy,
histogram_description(res,nclasses=20,frequency=density),
explicit(2/%pi*sin(x)^2,x,0,%pi),xrange=[0,%pi]);
20万までの素数について計算したグラフはこちらになります。
いろいろな本やウェブサイトを参考に書いていますが、今回、メインで参考にしたのは次の本でした。