私の篩のエラトステネスに問題があります。私は、あなたが望む最大の素数まですべての数字の配列を必要とせず、代わりにSieveがそれに達するごとに各素数を追跡するSieveを書こうと思っていました。つまり、すべての作業を前もってやる必要はなく、必要なときに次の素数を決定するだけです。また、「Nから始まるK個の素数を見つける」のようなインターフェイス機能を追加することも簡単です。ここで擬似コードは次のとおりです。エラトステネスのふるいは、すべての数字が素数であると考えている127
Begin with current number set to 2
Loop:
If prime queue is not empty:
Peek at the top prime in the queue
If current > top, we can move top to the next multiple
Remove the top prime from the prime queue
Increment top to its next multiple
Re-add it to the queue
If current == top, current is not a prime
Increment current number to next integer
If current < top, we've found a prime
Break
Push current number onto prime queue
Increment current number to next integer
Return the new prime
ので、ここで問題です:私は正常に(127まで)最初の31個の素数を計算し、それの後にそれがすべての数が素数であると考えています。私はIdeoneに自分のコードを書いています - アルゴリズム自体ではなく、Javaのコレクションの動作、または簡単なバグだと思っています。特定の数の素数の後にアルゴリズムが壊れなければならない理由は考えられません。私は手動で、127の後に、ヒープが適切に順序付けされていると、私のアルゴリズムは128をプライムではないと認識するはずですが、それはコードが私に示すものではありません。
提案がありますか?
(Iは、2によるもちろん、増分(私は基本的なアルゴリズムが働いて得れば。私はおそらくもふるい反復可能な作ります)すべての非プライム偶数をスキップします。)
投票に参加してください:検査であなたのコードのエラーを見つけ出すことは、生産的ではありません。デバッガやprintステートメントを使用して問題を特定(または少なくとも分離)してから、さらに具体的な質問に戻ってください(10行[テストケース](http: /sscce.org))。 –
アイデアは新しいものではありません:[Melissa O'Neillの論文](http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf) –
@ダニエル:私はそれがあるとは思わなかった新しい、もちろん。しかし、私にとっては斬新で面白かったです;) – theazureshadow