目次

ゼータ関数の零点の計算

calculation of the Riemann zeta zeros

 

ゼータ関数の零点の値を求める。ニュートン法を使用したプログラムにより計算する。


ゼータ関数の級数による式は「級数と乗積 二項係数の級数とゼータ関数を参照。

sn+1 = sn-ζ(sn)/ζ'(sn)  ,   ζ'(sn)≒(ζ(sn+h)-ζ(sn))/h    hは微小な値

より   sn+1 = sn-ζ(sn)h/(ζ(sn+h)-ζ(sn)) = sn+h/(1-ζ(sn+h)/ζ(sn))  とする。

h=ζ(sn)/snとして、収束の判定にはζ(s)の絶対値を使用する。UBASICプログラムは次の通り。

 

220   point -10:word -40:M=1850:dim C(M):C(0)=1:S=1/2+14#i
250   for K=1 to M:for J=K to 1 step -1:C(J)=(C(J)+C(J-1))/2:next:next
300   ' find zeta zero
330   repeat
350     Z=fnZeta(S):H=Z/S:W=fnZeta(S+H):S+=H/(1-W/Z)
360     print using(8,20),S
380   until abs(Z)<1/10^18
390   end
800   ' zeta function
810   fnZeta(X)
820   local J,U
830   for J=1 to M:U+=(-1)^(J-1)*C(J)/J^X:next:U/=1-2^(1-X)
880   return(U)

非自明な零点の初期値としてs=1/2+14i から開始すると、最初の零点に収束する。

       0.50758974993024427495     +14.13558444989598483799#i
       0.49997720386661645733     +14.13471625740151952033#i
       0.49999999984206884658     +14.13472514154016738957#i
       0.50000000000000000001     +14.13472514173469379043#i
       0.50000000000000000000     +14.13472514173469379046#i
最初の非自明な零点の正確な値は 0.5+14.13472514173469379045725198…i  である。



実数部は初期値 s= 0 +14i から開始しても0.5 になる。

       0.41833496948542243845     +14.07645024653248000524#i
       0.49916484106395386811     +14.13066995863602495569#i
       0.50000693105447366678     +14.13472328584511145747#i
       0.49999999997996781442     +14.13472514174264008280#i
       0.50000000000000000000     +14.13472514173469379046#i
       0.50000000000000000000     +14.13472514173469379046#i

初期値がs= 2 +14i であっても最初の零点に収束する。

      -0.92707299992992668900     +14.15826732248992932600#i
      -0.12175976448439554067     +14.10335229782430610623#i
       0.36268298001830905457     +14.10513082285623101699#i
       0.49321098475328483663     +14.13049441833890484983#i
       0.49999179184087164570     +14.13469968657916528188#i
       0.50000000026583803932     +14.13472514159688702844#i
       0.49999999999999999997     +14.13472514173469379048#i
       0.50000000000000000000     +14.13472514173469379046#i



より大きな虚数部を持つ零点を求める。s=1/2+1000i を初期値にした例。

       0.58685359001856217683    +999.83619290605366949033#i
       0.49133736539816212004    +999.76560627179415829529#i
       0.50167136925745494820    +999.79060459365507529421#i
       0.49999387802951372332    +999.79157899348567507971#i
       0.50000000000613823586    +999.79157155765172943357#i
       0.50000000000000000015    +999.79157155741294046318#i
       0.50000000000000000000    +999.79157155741294046316#i


s=1/2 を初期値にすると、最初の自明な零点である-2 になる。

      -2.40497477767311191727
      -1.60002505075782479194
      -1.88254687558083333765
      -1.98685749797395830033
      -1.99981381392326113779
      -1.99999996200374428046
      -1.99999999999999841717
      -2.00000000000000000000
      -2.00000000000000000000

s=-1+i を初期値にしても同様である。

      -1.69567811770189209518      +0.77410534680183550810#i
      -2.10707853708190318087      +0.41463987093489378761#i
      -2.19247214989578497832      +0.01084314265021423681#i
      -1.94571714778927937344      -0.00722609287991353891#i
      -1.99702825784503374630      -0.00077784154117950848#i
      -1.99999101082137912548      -0.00000503994776057391#i
      -1.99999999993925725127      -0.00000000009933926121#i
      -2.00000000000000000001      -0.00000000000000000001#i
      -2.00000000000000000000      +0.00000000000000000000#i


s=-3 を初期値にすると-4 になる。精度の関係でsをあまり小さな値にすることはできない。

      -4.54368465627120233580
      -3.66164448434396066935
      -3.98241322990050864575
      -3.99989288394708271159
      -3.99999999588636420686
      -3.99999999999999999393
      -4.00000000000000000000


ゼータ関数の零点は「四則とべき乗演算」のみで計算可能である。ここまで単純化できる理由は次の通り。「級数と乗積 二項係数の級数とゼータ関数」を参照。

 

・ζ(1-s)=21-sπ-ssin((1-s)π/2)Γ(s)ζ(s) の関係ではなく、二項係数の級数を使用する。

  そのため三角関数やガンマ関数は不要である。

・二項係数をそのまま使用するのではなく、パスカルの三角形の性質を利用する。

  そのため二項係数の関数や階乗の関数は不要である。

・ニュートン法においてζ'(s)の値ではなく、その近似値を使用する。

  そのためζ(s)の導関数は不要である。


最初の零点を高精度で求める。

 

220   point -35:word -140:M=535:dim C(M):C(0)=1:S=1/2+14#i
250   for K=1 to M:for J=K to 1 step -1:C(J)=(C(J)+C(J-1))/2:next:next
300   ' find zeta zero
330   repeat
350     Z=fnZeta(S):H=Z/S:W=fnZeta(S+H):S+=H/(1-W/Z)
360     print using(5,154),S
380   until abs(Z)<1/10^70
390   end
zeta function の部分は最初のプログラムと同じで、実行結果は以下の通り。

    0.50758974993024427495199811334098905312233402079728265125362572531457861810
77374401590748788456535754412261057383876701315014301138827009284771818518029915
  +14.13558444989598483798911284406977559617481341814039160135843717930301271212
33852167907311487490725608759323729268072110586501578696725322900023173059921159
#i

    0.49997720386661645733303694446578370827900867950146832608045760632684583478
85017418880126065947058331809296002799233937576291902727854065813189418181566812
  +14.13471625740151952033331883744747939073307413277058415553913333298551823710
40771542434625355197298091885820726164226270277513206788029144585662676265229626
#i

    0.49999999984206884658005842136441219790784670793537049857753525266108047381
68259813117330065704648423011733190812583573480510965887637305842999328744308721
  +14.13472514154016738956897475703546043662547425037199699887363640635189212688
90837827435143235317533077083699708016302282994998573646851099763328149341700909
#i

    0.50000000000000000000907393723220762685587980382709200420812894033319002637
05376922514208378602467257884284147700623783586867978630992205427137365436776310
  +14.13472514173469379043258791506095657754225445552059145161748380159678472729
54172259415153087165643780894347674773963818496506651197235153109253850719961904
#i

    0.50000000000000000000000000000000000000019065352927224833908483303026830305
57622365918436596030212030043192191740537828042318355061823682977016844512058299
  +14.13472514173469379045725198356247027078447444125566453208616403240221837646
00388943062130059334908101700162352977588842445909092160368311259112028992532532
#i

    0.50000000000000000000000000000000000000000000000000000000000000000000000000
00000095399963507391630275123917927213918057100300369380206406180391575655328168
  +14.13472514173469379045725198356247027078425711569924317568556746014996342980
92567312893943001902628609788235469689087617600795327097308349733328174308711496
#i

    0.50000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
  +14.13472514173469379045725198356247027078425711569924317568556746014996342980
92567649490103931715610127792029715487974367661426914698822545825053632394471378
#i

最後の桁は四捨五入されているが、小数点以下150桁以上が正しい数字である。


導関数を使用する方法を考える。ただし簡単のためζ(s)の零点を含む

η(s)=(1-21-s)ζ(s) を対象として  sn+1 = sn-η(sn)/η'(sn)  により求める。

 

次のプログラムにおいて Uはη(s)であり、Vはη'(s) (正確には級数を項別微分したもの)である。

 

220   point -10:word -40:M=1850:dim C(M):C(0)=1:S=1/2+14#i
250   for K=1 to M:for J=K to 1 step -1:C(J)=(C(J)+C(J-1))/2:next:next
300   ' find  eta zero
330   repeat
340     U=0:V=0:F=-1
350     for J=1 to M
360       F=-F:W=F*C(J)/J^S:U+=W:V-=W*log(J)
370     next
380     S-=U/V:print using(8,20),S
390   until abs(U)<1/10^18

初期値としてs=1/2+14i から開始すると、ゼータ関数の最初の非自明な零点に収束する。

       0.51465456894550842195     +14.13390195482083560500#i
       0.49982391690453977169     +14.13474103671477568026#i
       0.49999997488432152761     +14.13472514570833425528#i
       0.49999999999999949602     +14.13472514173469394124#i
       0.50000000000000000000     +14.13472514173469379046#i
       0.50000000000000000000     +14.13472514173469379046#i

実数部は初期値 s= 0 +14i から開始しても0.5 になる。

       0.35368126412084391241     +14.05597738850965127118#i
       0.48836413131439907972     +14.11772612182944754364#i
       0.50012831065643165891     +14.13440736073379824156#i
       0.50000006722951251326     +14.13472520964526432194#i
       0.50000000000000024663     +14.13472514173468636525#i
       0.50000000000000000000     +14.13472514173469379046#i
       0.50000000000000000000     +14.13472514173469379046#i

s=1/2 を初期値にすると、ゼータ関数の最初の自明な零点である-2 になる。

      -2.62950644013668291878
      -1.63535389888435073795
      -1.97712024818981755184
      -1.99985425875635826840
      -1.99999999388939167555
      -1.99999999999999998926
      -2.00000000000000000000
      -2.00000000000000000000


初期値によっては 1-21-s の零点 1+(2kπ/ln 2)i (kは整数)に収束することがある。

例えば 0+10i の場合は 1+(2π/ln 2)i に収束する。

       0.70651995720030240169      +9.69848794457433895642#i
       1.08580638698311160453      +9.27078199820368513472#i
       1.02120993395715894257      +9.05026681427353198184#i
       0.99984006904600630475      +9.06501284739965466332#i
       1.00000002382792932377      +9.06472033423899350805#i
       1.00000000000000115016      +9.06472028365438654671#i
       1.00000000000000000000      +9.06472028365438761926#i
       1.00000000000000000000      +9.06472028365438761926#i

上記の高精度版プログラムと実行結果は以下の通り。

 

220   point -35:word -140:M=535:dim C(M):C(0)=1:S=1/2+14#i
250   for K=1 to M:for J=K to 1 step -1:C(J)=(C(J)+C(J-1))/2:next:next
300   ' find  eta zero
330   repeat
340     U=0:V=0:F=-1
350     for J=1 to M
360       F=-F:W=F*C(J)/J^S:U+=W:V-=W*log(J)
370     next
380     S-=U/V:print using(5,154),S
390   until abs(U)<1/10^70

    0.51465456894550842195492089427504225938837617946861742682207079646776555802
54979937092851318295260911884918187092927209053701168447727859499961579416026690
  +14.13390195482083560500138423426062771279219603933886812657188384528454639411
44693448984683165044814758657317681513368338968521796432216011967110349039255296
#i

               途中の値を6個省略

 

    0.50000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
  +14.13472514173469379045725198356247027078425711569924317568556746014996342980
92567649490103931715610127792029715487974367661426914698822545825053632394471378
#i

 

          目次