prime-counting function実装の計算可能な擬似コードを誰でも提供できますか?私は最初にHardy-Wright algorithmをコーディングしようとしましたが、その階乗は悲惨なオーバーフローを発生させ始めました。私は実用的なソリューションのためにGoogleを精査したが、せいぜい、従来のプログラムでは実現しなかった非常に難解な数学を発見した。実現可能なプライムカウント関数の実装
答えて
prime-counting関数pi(x)は、xを超えない素数の数を計算し、何世紀にもわたって数学者を魅了しました。 Adrien-Marie Legendreは18世紀の初めに、補助関数phi(x、a)を使って数式を与えました。これは最初の素数でふるい落とされないx以下の数を数えます。例えば、番号1,7,11,13,17,19,23,29,31,37,41,43,47および49の場合、φ(50,3)= 14である.φ関数は、φ (x、1)は、xを超えない奇数の数であり、P(a)は、 a番目の素数(P(1)= 2から数えて)です。
function phi(x, a)
if (phi(x, a) is in cache)
return phi(x, a) from cache
if (a == 1)
return (x + 1) // 2
t := phi(x, a-1) - phi(x // p[a], a-1)
insert phi(x, a) = t in cache
return t
配列P店小さなするA番目の素数を、ふるい分けすることによって計算します。キャッシュは重要です。これがなければ、実行時間は指数関数的になります。与えられたφをとると、ルジャンドルの素数計算式は、a = pi(floor(sqrt(x)))であり、pi(x)=φi(x、a)+ a-1である。 Legendreはpi(10^6)を計算するために彼の公式を使用しましたが、78498という正解の代わりに78526を報告しました。これは、間違っていますが、手作業の複雑な計算では驚くほど近かったです。 1950年代
は、デリックH.レーマーはカウント素数のための改良されたアルゴリズムを与えた:あっても、これらのアルゴリズムと
例えばfunction pi(x)
if (x < limit) return count(primes(x))
a := pi(root(x, 4)) # fourth root of x
b := pi(root(x, 2)) # square root of x
c := pi(root(x, 3)) # cube root of x
sum := phi(x,a) + (b+a-2) * (b-a+1)/2
for i from a+1 to b
w := n/p[i]
lim := pi(sqrt(w))
sum := sum - pi(w)
if (i <= c)
for j from i to lim
sum := sum - pi(w/p[j]) + j - 1
return sum
、PI(10^12)= 37607912018.、およびそれらの近代的変異体、及び非常に高速のコンピュータでは、piの大きな値を計算するのはやめても面倒です。この書面では、最も大きな既知の値はpi(10^24)= 18435599767349200867866です。
n番目の素数を計算するためにこのアルゴリズムを使用するには、素数定理の帰結はn番目の素数P )はn> 5のn log nとn(log n + log log n)の間にあるので、境界でpiを計算し、二分法を使ってn番目の素数を決定し、境界が近いときにふるいに切り替える。
my blogにいくつかのエントリで素数について議論します。
最初のコードスニペットから、phi(x、a)= tであることが暗示されていますが、ここではphi(x、a-1)= tを格納しています(後者が真であれば、 )。私はこれを自分で編集したでしょうが、編集の愚かな制限は6文字以上でなければなりません。 –
@StrategyThinker:ありがとうございました。一定。 – user448810
最近、pi(10^25)とpi(10^26)が計算されました。 [ここでは40ページ](http://dalspace.library.dal.ca/handle/10222/60524)を参照してください。 – qwr
ウィキペディアも役に立ちます。 prime countingの記事には、いくつかのポインタが含まれています。まず、すべての素数を生成しない最も単純なアルゴリズムの1つである「π(x)を評価するためのアルゴリズム」の項のMeisselによるアルゴリズムをお勧めします。
また、PomeranceとCrandallの本"Prime numbers a computational perspective"が役に立ちました。この本は、素数カウント方法の詳細で非常に使いやすい説明をしています。しかし、その性質上の話題は読者のほとんどにとってはあまりにも進んでいることを覚えておいてください。
- 1. 相補誤差関数erfcf()のベクトル化可能な実装
- 2. 可能System.String実装
- 3. Moqの連鎖可能な実装
- 4. クリック可能なLabelFieldの実装方法。
- 5. カテゴリ実装可能な問題
- 6. Pythonでプラグイン可能な関数の 'daisychaining'を実装する方法は?
- 7. なぜこの "実行可能な関数"のPython実装が失敗しますか?
- 8. このバックグラウンドスレッドキューは実行可能な実装ですか?
- 9. 関数の "show"の実装
- 10. rand関数の実装
- 11. 関数の実装execve(unistd.h)
- 12. ヌル関数の実装
- 13. 関数を実装する
- 14. 現在の実行可能ファイル名を取得するglibc関数?
- 15. gitサーバを実装する可能性
- 16. Mobxで観測可能な関数を実行するには?
- 17. C#で実行可能な関数を書く
- 18. 実行可能な関数ポインタをプッシュしますか?
- 19. WCF単一サービス実装、複数の動作。可能
- 20. SAFELY Windowsで実行可能な実行可能ファイルへのパス
- 21. 実際に実行可能な結合の数は、
- 22. バイナリデータ用の移植可能なhashCodeの実装
- 23. MATLABのMeijerのG関数の実装
- 24. 入れ子のテンプレート関数の実装
- 25. linuxのsocket()関数の実装
- 26. matlab関数fzeroのC/C++の実装
- 27. Haskellのライブラリ関数の実装方法
- 28. PHPを実行可能なウェブサイトとして実行可能
- 29. のasp.net MVC関連NULL可能実体
- 30. 拡張現実感の大きさオブジェクトのサイズ - 実現可能性
申し訳ありませんが、これはマクドナルドではありません。ここにリクエストはありません。あなたは質問があります。正確なプログラミングの問題について... [FAQ] – ppeterka
は、floor(x/j)* j == x - (x%j) 'ではありません。あなたがリンクしている数式は 'pi(x)=(-1)+ SUM {j = 3..n}(((j-2)!)%j)'(?)になります。次に、モジュラ乗算(すなわち、(5)%7 ==((((2 * 3)%7)* 4)%7)* 5)%7 ')を使用する。 –
@ SevennKozakこれはプログラミング上の問題ではないと言う理由は、質問にコードが含まれていないためです。 –