n番目の素数,p(n)を与える式があることを初めて知った。Mathematicaでは,Prime[] という関数があり,10^12番目までを15秒で計算してくれる。
In[1]:= Table[Timing[Prime[10^k]], {k, 1, 12}]
Out[1]= {{0.000014, 29}, {5.*10^-6, 541}, {4.*10^-6, 7919}, {0.000238, 104729}, {6.*10^-6, 1299709}, {3.*10^-6, 15485863}, {3.*10^-6, 179424673}, {3.*10^-6, 2038074743}, {4.*10^-6,22801763489}, {3.*10^-6, 252097800623}, {2.41945,2760727302517}, {15.5547, 29996224275833}}
そのp(n)の公式は,1964年にWillansが与えたものである。まず準備として,1からnまでの自然数の集合に含まれる素数の個数を与える関数を Φ(n)として以下で定義する。ただし,⌊x⌋ はfloor関数(ガウス関数)であり,xを越えない最大の整数を与えるものである。
Φ(n)=m∑k=1⌊cos2(k−1)!+1kπ⌋−1
例えば,Φ(1)=0,Φ(2)=1,Φ(3)=2,Φ(4)=2,Φ(5)=3,Φ(6)=3,Φ(7)=4である。この式が成り立つのはウィルソンの定理を用いているからだ。k が素数ならば (k−1)!+1≡0 (mod k) が成り立つというものであり,素数に対しては⌊cos2⌋の項が1,それ以外では0となるため,これを加え合わせたものが素数の数に対応する(1は素数でないために取り除いている)。
次に,これを用いて,n番目の素数p(n)を与える式が次のようになる。
p(n)=1+2n∑m=1⌊(n1+Φ(m))1n⌋
ここで,floor関数の値は,mまでの素数の数 <nならば1, mまでの素数の数 ≥nならば0である。つまりこれは1からmまでの自然数の集合における素数カウンターの働きをすることから,与式によりp(n)が得られることになる。
なお,mを1から2nまでとしているのは,ベルトランの仮説(任意の自然数 n に対して,n<m≤2n を満たす素数 m が存在する)より,n個の素数を含む十分大きな範囲としているためである。この仮説は高校生時代のエルデシュによって初等的な証明がされたといういわくつきのものだ。2nはn=104程度の範囲なら10nで置き換えられる。
コンパクトな式ではあるが,実際にMathematicaに落とし込んで数値計算してみると,2nが効くので,p(11)で23秒,p(12)で195秒という悲惨な結果となるのであった。Φ(n)をあらかじめ配列にいれて,10nを用いれば,p(1000)が15秒で実行できる。
0 件のコメント:
コメントを投稿