2012-03-15 7 views
0

与えられた数nより小さいすべての素数を出力する必要があります。私はEratothenesのふるいを使うことができますが、そのアルゴリズムの実行時間はO(n)ではありません。この問題のO(n)時間解決はありますか?nより小さいすべての素数を報告する

答えて

0

任意の数字を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を使ってリストを作ることです。実際にはこのビットをのように実行するだけなので、パフォーマンスは重要ではありません。

次に、素数をチェックするためにリスト自体を使用します。

+0

ハードウェアとプログラムによっては、ディスクからリストを読み取るよりもふるい分けが速くなることがあります。高速なアセンブラの実装は、遅いディスクに勝るでしょう。 – rossum

+0

私はそれについてあまり気にしませんでした.50万番目のプライムについての私のgrepは半分かかりました。このふるいは1分10秒かかりましたが、その数よりも下のすべての素数を知っていると主張できますが、やや複雑な検索語を使った 'grep'解決法や' grep'を使って行番号を得るそれらをすべてその点まで印刷するために 'head'を使います)。特定の値の試行分割ははるかに高速でしたが、ネイティブ整数の領域から移動してbignumライブラリを使用すると、かなり遅くなる可能性があります。 – paxdiablo

+0

高速ディスクと低速ふるい。 ;)今日のディスクが実際に高速かどうかはわかりませんが、ふるいは間違いなく遅いです。ハスケルで私のセグメント化されたエラトステネス型ふるいは、3.2秒で5千万の素数を見つける、D.J.バーンスタインのプライムジェンは0.5秒でそれを見つけます。 (ただし、最初のn個の素数ではなくn番目の素数が本当に必要な場合は、より高速な方法を使用します)。 –

-2

実装は難しくなりますが、Sieve of Atkinはより複雑です。

+0

-1:2つの異なるアルゴリズムを比較するとき、漸近的計算の複雑さは、ビッグOのパフォーマンスが定数とオフセットを無視しているため、実用的な範囲では非常に重要です。事実、最大限ホイール分解されたEratostheneseのSieveの実用的な実装は、常にAtkinのSieveの実装と同等の複雑さを凌駕します。 AtkinとBernsteinの研究では、SoEよりも速いSoAが示されていましたが、意図的にSoEのホイール分解能のレベルをSoA(2/3/5)と同じに制限しました。 – GordonBGood

1

エラトステネスの篩は、時間複雑さO(n log log n)を有する。関数log log nの成長は非常に遅くなります。つまり、log(log(10^9))= 3となります。つまり、時間の複雑さの一部を定数として扱い、それを無視して時間の複雑さを「ほぼ」O(n) 。

時間O(n)またはO(n/log log n)で動作する様々なアルゴリズムがあります.PritchardのホイールふるいとAtkinsのふるいを含みます。しかし、一定の要因によって、一般に、エラトステネス篩よりも実際にはアルゴリズムの速度が遅くなります。あなたが極端なスピードを必要としない限り、あなたが何をしているのかを知っていて、それをやるのに多くの時間を費やしたいなら、実用的な答えはエラトステネスのふるいです。

あなたの質問には、素数のリストを印刷するつもりです。その場合、出力は選択したアルゴリズムの実行時間を支配します。だから自分自身に好意を持ち、シンプルなエラトステネス篩を実装してください。

関連する問題