Maxima で綴る数学の旅

紙と鉛筆の代わりに、数式処理システムMaxima / Macsyma を使って、数学を楽しみましょう

-数学- ゼータ関数の非自明零点と行列の固有値(その2)ゼータの非自明零点の間隔分布を求める

f:id:jurupapa:20150712083541j:plain

ボール取ってきました

 前の記事ではランダムエルミート行列の固有値を求め、その間隔分布をグラフにプロットし、理論分布との一致を確認したのでした。

残りの仕事は、ゼータ関数の非自明零点について隣り合っているもの同士の間隔を求め、その分布をグラフにプロットすることです。それにはゼータ関数の非自明零点を大量に求める必要があります。昨日ご紹介した本:

 

 では\( \frac{1}{2}+14.1347 \, i \)を1つ目、\( \frac{1}{2}+21.022 \, i \)を2つ目の非自明零点として数えるとき、10000個目から10000個の非自明零点について補正を行ったのちに間隔分布を求めています。ここでも同じことをしてみましょう。Maximaにはゼータの非自明零点を求める関数は組み込まれていませんが、世の中にはそういったものを提供しているサイトがあるのです。

 

以前にも紹介したThe LMFDB CollaborationのウェブサイトのZeta zerosというページ*1にいけば、10000個目からの10000個と指定するとゼータの非自明零点の虚数部をテキストとしてダウンロードできます。小数点以下32桁もあるんですよ。

 

これでただひたすらに10000個の浮動小数が改行区切りで並んでいるファイルが得られます。このファイルを少し加工してMaximaのプログラムにしてしまいます。

zetazeros:[

68194.35279481130814071080220469047908,
68195.19508666543159718116712329789924,

...

74920.25979325889143654984885753694514,
74920.82749899418679384920094691834673
];

行末にカンマをつけ、全ての数字を一つのリストに見えるように[, ]で括り、zetazerosという変数への代入の形にしました。このファイルをzetazero10000.macという名前で保存すれば準備は出来上がりです。

 

まずパッケージ読み込みなどの準備を行います。

(%i1) (fpprintprec:4,load(draw),load(descriptive),load(distrib),load(lapack))$

先ほど作成した非自明零点のファイルを読み込みます。
(%i2) load("/Users/XXX/YYY/zetazero10000.mac")$

(%i3) len:length(zetazeros);
$$ \tag{%o3} 10000 $$

 

補正を行います。ゼータ関数の非自明零点は(RHを仮定して)実部=\( \frac{1}{2} \)の直線上に並んでいます。この直線を先のほうに行けば行くほど零点の間隔が詰まってきます。これを補正するために 全ての零点についてそれ自身のlogをかけて間隔が一様になるようにします。

(%i4) z1list:map(lambda([x],x*log(x)),zetazeros)$

次に正規化を行います。この辺の手順は固有値で行ったのと全く同じです。
(%i5) z2list:map(lambda([x],x-z1list[1]),z1list)$
(%i6) z3list:map(lambda([x],x/(z2list[len]/len)),z2list)$
(%i7) z3difflist:[]$

そして最後に固有値の間隔を求めます。
(%i8) for i:1 step 1 while i<len do
z3difflist:endcons(z3list[i+1]-z3list[i],z3difflist)$

ランダムエルミート行列の固有値の分布関数を理論的に求めたものを再掲します。

(%i9) p2(s):=32/%pi^2*s^2*exp(-4/%pi*s^2)$
(%i10) p2(s);
$$ \tag{%o10} \frac{32\,s^2\,e^ {- \frac{4\,s^2}{\pi} }}{\pi^2} $$

 

それでは上記の理論曲線と固有値の間隔をヒストグラムにしたものを一緒に表示してみましょう。
(%i11) draw2d(grid=true,title="Spacing distribution of non-trivial zeros of the Riemann Zeta function", histogram_description(z3difflist, nclasses=20, fill_color=red, frequency=density), explicit(p2(s),s,0,3), xrange=[0,3])$

f:id:jurupapa:20150816145041p:plain

いい感じで重なっていますね。

 

このグラフからは、ゼータ関数の非自明零点にも斥力が働いていることがわかります。零点の間隔が0に近い状況はほとんど起こっていないからです。

*1:The LMFDB Collaboration, The L-functions and Modular Forms Database, Home page of the zeros of zeta(s), http://www.lmfdb.org/zeros/zeta/, 2015 , [Online; accessed 14 August 2015].