与えられた数nより小さいすべての素数を出力する必要があります。私はEratothenesのふるいを使うことができますが、そのアルゴリズムの実行時間はO(n)ではありません。この問題のO(n)時間解決はありますか?nより小さいすべての素数を報告する
答えて
任意の数字をO(n)時間の複雑さの素数としてチェックするアルゴリズムはありません。私はNSA(および暗号問題を扱う他の組織)がそれほど満足できないと確信しています:-)
O(n)以上の方法は、最初の5000万の素数を事前に計算し(またはsomeone else's already-precalculated listを使用)、それをルックアップとして使用します。私はそのようなファイルをローカルに持っていて、番号がプライムかどうかを確認するためにgrep
を実行するのは簡単なことです。それは任意の数字には役立ちませんが、私はそれほど大きなものを使う必要はほとんどありません。もちろん、暗号の人はその目的のためにそのようなリストを消滅させることはほとんどないと考えています。
ビットマップ(最初の50万の素数は約120M)にすると、数字をバイトオフセットに変換するだけで複雑さをO(1)に減らすことさえできます。ビットシフトおよび/またはビット演算の2つが含まれる。
ただし、以下の素数のリストをある程度n
にすることは、確かにO(n)時間の複雑さで実行可能です。
我々は
O(N/log(log(N)))
追加を使用してNまでの素数を計算するアルゴリズムを導入...
わずか実際にはO(n)よりも優れて次のとおりです。Sieve of Atkin主張を詳述Atkin and Bernstein paper。
しかし、まだルックアップソリューションと競合する可能性は低いです。私のアドバイスは、AtkinやEratosthenesを使ってリストを作ることです。実際にはこのビットをのように実行するだけなので、パフォーマンスは重要ではありません。
次に、素数をチェックするためにリスト自体を使用します。
実装は難しくなりますが、Sieve of Atkinはより複雑です。
-1:2つの異なるアルゴリズムを比較するとき、漸近的計算の複雑さは、ビッグOのパフォーマンスが定数とオフセットを無視しているため、実用的な範囲では非常に重要です。事実、最大限ホイール分解されたEratostheneseのSieveの実用的な実装は、常にAtkinのSieveの実装と同等の複雑さを凌駕します。 AtkinとBernsteinの研究では、SoEよりも速いSoAが示されていましたが、意図的にSoEのホイール分解能のレベルをSoA(2/3/5)と同じに制限しました。 – GordonBGood
エラトステネスの篩は、時間複雑さO(n log log n)を有する。関数log log nの成長は非常に遅くなります。つまり、log(log(10^9))= 3となります。つまり、時間の複雑さの一部を定数として扱い、それを無視して時間の複雑さを「ほぼ」O(n) 。
時間O(n)またはO(n/log log n)で動作する様々なアルゴリズムがあります.PritchardのホイールふるいとAtkinsのふるいを含みます。しかし、一定の要因によって、一般に、エラトステネス篩よりも実際にはアルゴリズムの速度が遅くなります。あなたが極端なスピードを必要としない限り、あなたが何をしているのかを知っていて、それをやるのに多くの時間を費やしたいなら、実用的な答えはエラトステネスのふるいです。
あなたの質問には、素数のリストを印刷するつもりです。その場合、出力は選択したアルゴリズムの実行時間を支配します。だから自分自身に好意を持ち、シンプルなエラトステネス篩を実装してください。
- 1. 番号kより小さいフィボナッチ数の数。 Sub O(n)
- 2. 小さなサイズの報告ツール(施設)
- 3. Mathematica:リスト内のすべての整数が数値より小さいかどうかを調べる
- 4. Windowsキーボードが2回すべてを報告しています
- 5. 報告されているバグのオンラインリポジトリ
- 6. SQLの日付クエリ: 'より小さい'より小さい 'より小さい'
- 7. log4net NHibernate.Util.ADOExceptionReporterが複数回報告されています
- 8. Haskell:リストxsと整数nをとり、xsからの要素で長さnのすべてのリストを返す関数
- 9. 各配列要素、左の小さな要素を検索します。 O(n)
- 10. scipyでの最小化、N次元スカラー関数のすべての極小を見つけるアルゴリズム
- 11. ゼロより小さくない - 0より小さい変数をゼロにする
- 12. 2144より小さいすべての素数の和はどのようにして結果を出力しますか?
- 13. CoqのN個の要素のすべての関数を含む型
- 14. Zend_dbはより良いエラー報告を更新します
- 15. すべての値が小さい
- 16. f(n)= log(n)^ mはすべての自然数mに対してO(n)
- 17. 0より大きいか0より小さい浮動小数点
- 18. SQLステートメントは、誰かが彼または彼女に報告している人の直接報告の数を報告する
- 19. minより大きくmaxより小さい数値を評価する
- 20. バックグラウンドワーカーが複数の割合を報告している
- 21. 複数の-aがbashスクリプトを破るより大きい/より小さい
- 22. バイナリ検索ツリーでn番目に小さい要素を見つける
- 23. n個の整数の1cmのすべての素因数を計算するには?
- 24. SketchFlow - 複数のユーザーをマージして報告するフィードバック
- 25. ゼロのカウントが報告されている、Rの因子のカウント発生数
- 26. DOMに追加された新しい要素。関数を報告する必要があります。 (jQueryのを使用して)
- 27. FacebookのリンターはOGを報告します。画像が小さすぎる、それは画像よりも大きい場合、それは代わりに
- 28. sonarqubeによるXML解析の問題を報告してください
- 29. 各n番目の要素を取って並べ替える
- 30. なぜlsofがulimitの "open file"出力よりも高いオープンファイル数を報告するのですか
ハードウェアとプログラムによっては、ディスクからリストを読み取るよりもふるい分けが速くなることがあります。高速なアセンブラの実装は、遅いディスクに勝るでしょう。 – rossum
私はそれについてあまり気にしませんでした.50万番目のプライムについての私のgrepは半分かかりました。このふるいは1分10秒かかりましたが、その数よりも下のすべての素数を知っていると主張できますが、やや複雑な検索語を使った 'grep'解決法や' grep'を使って行番号を得るそれらをすべてその点まで印刷するために 'head'を使います)。特定の値の試行分割ははるかに高速でしたが、ネイティブ整数の領域から移動してbignumライブラリを使用すると、かなり遅くなる可能性があります。 – paxdiablo
高速ディスクと低速ふるい。 ;)今日のディスクが実際に高速かどうかはわかりませんが、ふるいは間違いなく遅いです。ハスケルで私のセグメント化されたエラトステネス型ふるいは、3.2秒で5千万の素数を見つける、D.J.バーンスタインのプライムジェンは0.5秒でそれを見つけます。 (ただし、最初のn個の素数ではなくn番目の素数が本当に必要な場合は、より高速な方法を使用します)。 –