『2つの素数の差』解答


◆愛知県 Y.M.Ojisan さんからの解答。

【はじめに】

次のHPによれば、「ゴールドバッハ予想」同様本問題も未解決問題のようです。

http://www80.sakura.ne.jp/~aozora/suuron/node16.html

あるHPによれば「ゴールドバッハ予想」は40兆まで計算機により確認されているそうです(年代不詳)。
そこでここではパソコンで何処まで確認できるか(目標は40兆)に挑戦しました。

【解答】

 0〜4000億 および 40兆〜40兆1000億の範囲で反例なし。

【予備調査】

 まずパソコンで凝らずに計算できる10億までを確認しました。
その結果、素数の存在確率が素数定理π(x)=x/log(x)に従うとして統計処理した結果と大差ないことを確認しました。
下記は減算側素数の最大値、平均値、標準偏差値の統計理論値との比較結果です。
2素数をP1,P2とし 凵≠o2−P1とします。

凾ェ大きいとき それぞれの値は次のように近似できます。
(P1素数列に対しポアソン分布です)。
なお最大値はあと一個程度存在する可能性のある位置としました。

平均値 P1m=E[P1] は
 P1m/log(P1m)=log()2/2(log()-1)

最大値 P1max は
 P1max/log(P1max)= log(/2)log()2/2(log()-1)

標準偏差値 P1σ は
  (P1σ+P1m)/log(P1σ+P1m)= log(/2)log()2/(log()-1)−2

から得られる値です。

以上の結果から40兆まで調べる場合でも、P1は高々4124程度まで調べれば、例外が1個出る程度と予測されます。

【数値実験法】

1億(偶数5000万個)につき10秒程度で検査できるソフトを作成することができました。
(PC=1.7G Note)

方法は、

(1)4byte整数の配列上に素数判定ビットマップMap[i]を考えます。
Map[i]のjビットは奇数3+2*(j+32i)に対応しており、値が1なら素数であるとします。
このビットマップを40兆までに対応して√(40兆)までエラトステネスのふるい法で作成します。
(これはCPU2秒ほど)

(2)ここからP1に対応するビット列並びが逆順のP1mapを作成します。
前の予測から8095まで分(128バイト)だけで十分です。
(下図例は13まで)

(3)検査する偶数をG1〜G2とするとき、(G1+3)〜(G2+8095)の間の素数のビットマップP2mapをMapを用いてやはりエラトステネス法で作成します。

(4)偶数のマップGmapをクリアします。
Gmap[i]のjビットは偶数2*(j+32i)に対応します。

(5)P2mapをP2=(G1+3)から順に調べて、1(素数)であればP1mapその位置を先頭にしてGmapにOrします。
これはGmapの(P2−P1)の位置をマークしていると言うことです。

(6)そしてG1〜G2に対応するbit位置が全部1なら例外なしになります。

(7)実際にはP1mapは0〜31bitずらしたものを予め全部用意しておき、計算時間を短縮しました。

この問題では検査すべきP1mapの巾が非常に狭くて済むので、この方法におけるG1を任意の位置から始めても、計算時間に無駄はほとんどありません。
そこで目標の40兆あたりも容易に検査することができ、計算時間もさほど延びないことが確認できました。
従って、パソコンでも50日ほど回せば確認することが可能です。

【数値実験結果】

今回は一夜分で、目標の1%の4000億まで例外がなく、また目標の40兆付近の0.25%でも例外がないこと、およびP1の最大が4000も超えなかったことを報告して終了します。
結果のうち、小区間におけるP1の最大値の分布を追加拡大したものを下図に示します。
予測を否定できない結果です。

なお、分かりにくいですが一応ソースを添付しておきます。
C++ソース

【感想】

 最初PCでは無理かなと思いましたが、意外と高速に検査することができました。
このプログラムの場合、検査領域を分割して並列に計算することができるので、最近はやりのグリッドコンピューティング(ネット上につながるPCを使って並列に高速計算する方法)を、数学の部屋でボランティアを募って行えば、1日でもできそうな程度でした。


 『2つの素数の差』へ

 数学の部屋へもどる