Primesieve

エラトステヘンの実装の最適化されたふるい
今すぐダウンロード

Primesieve ランキングとまとめ

広告

  • Rating:
  • ライセンス:
  • BSD License
  • 価格:
  • FREE
  • 出版社名:
  • Kim Walisch
  • 出版社のWebサイト:
  • http://code.google.com/u/108247660239931147235/

Primesieve タグ


Primesieve 説明

Primesieveは、素数とプライムK-Tuplets(Twin Primes、Prime Triplets、...)を生成するC ++ライブラリです。因数分解、このアルゴリズムはO(NログログN)の操作の複雑さを有し、o(SQRT(N))Spaceを使用している。セグメント化は現在、エラトステンの篩に対する最もよく知られている実用的な改善です。一度に区間を篩い分けする代わりに、篩間隔を篩い分間に細分化させ、次に連続して篩過する。セグメンテーションは、エレトステンの篩のメモリ要件をO(N)からO(SQRT(N))に降下します。セグメントサイズは通常、CPUの高速L1またはL2キャッシュメモリに収まるように選択され、これが著しく高速化されます。 1969年にシングルトンのセグメント版が最初にシングルトンによって発行されました、BaysとHudsonのは、アルゴリズムをより詳細に説明しています。 k番目の車輪がエラトステンのふるいに加えられた場合、それらの倍数のみが最初のKのプライズへのコリメである、すなわち最初のKプライズのいずれかによって割り切れる倍数がスキップされる。第1のホイールは奇数のみを考慮して、第2の車輪(モジュロ6)は2と3の倍数をスキップし、3番目の車輪(モジュロ30)は2,3,5などの倍数をスキップします。 PRITCHARDは、ホイールサイズがSQRT(N)である場合は、エラトステンの濃度の走行時間をログログnの範囲で減らすことができますが、キャッシュの理由で、通常はモジュロ30で最高の機能を果たします。または210車輪。 Sorensonはでホイールを説明します。このアルゴリズムは比較的新しいもので、2001年のTomsOliveirae Silvaによって考案されています。このアイデアは、各リストがセグメントに関連付けられているバケットのリストに篩い援送用のプライムを保存することです。特定のセグメントに関連する篩い分けのプライムのリストには、そのセグメントに複数の出現があるPRIMESのみが含まれています。セグメントを熟考するとともに、関連リストのPRIMESのみがSIVEINGに使用され、各PRIMEは処理中に次の倍数の責任を負うリストに再割り当てされます。このアプローチの利点は、効率を低下させることなくSQRT(N)よりも小さいセグメント(すなわちシーブアレイ)を使用することが可能になり、これはCPUのL1またはL2キャッシュに収まる小さなセグメントのみが高速メモリアクセスを提供するので重要であるということである。 ImplementationPrimeveieveは完全にC ++で書かれており、外部ライブラリーには依存しません、すべての標準準拠C ++コンパイラーでコンパイルしてください。その速度は主に、より広く使用されているバイト(Boolean)アレイの代わりに、シーブアレイ内の倍数を遮断するとキャッシュミスとビットアレイを使用するときにキャッシュミスを妨げるエラトステンの篩のセグメンテーションによるものです。これらは私の実装で使用する最適化です。 2,3,5,7-小型、中程度、大きな篩い分けのプライムのための特殊なアルゴリズムを使用します。 「Source」Tab.c ++ LibraryPrimeieveを参照してください。他のプロジェクトで再利用可能に書かれているのは、次のC ++コードスニペットでは、Prime Number Generationにlibprideieveを使用する方法を示します。これがより多くの使用例です.// sum_primes.cpp // 1000#以下のプライムの合計を計算します。 PSを印刷する。 PS.GeneratePrime(2,1000、コールバック)。 STD :: COUT <"1000 =" <<


Primesieve 関連ソフトウェア