2 つの素数の和として表される 1 から 1000 までのすべての数を見つけたいと考えています。例: 8 = 3+5、24 = 13+11
これは、1 から 1000 までの素数のリストを反復処理することにより、O(n^2) で実行できます。
O(n^2)未満で同じことをする方法はありますか?線形時間でこれを行う方法はありますか?
2 つの素数の和として表される 1 から 1000 までのすべての数を見つけたいと考えています。例: 8 = 3+5、24 = 13+11
これは、1 から 1000 までの素数のリストを反復処理することにより、O(n^2) で実行できます。
O(n^2)未満で同じことをする方法はありますか?線形時間でこれを行う方法はありますか?
現在知られているすべての偶数は、2 つの素数の和として表すことができます (ゴールドバッハの予想を参照) 。
すべての奇数について、2 つの素数の和として表すことができる場合、そのうちの 1 つが 2 で、もう 1 つが奇素数でなければなりません。
したがって、合計数は (1000/2 - 1) + (3 から 997 までの素数カウント) になるはずです。
その中で、
(1000/2 - 1) はシリーズ 4、6、8、10 の合計数です...
(3 から 997 までの素数のカウント) は、シリーズ 5(2+3)、7(2+5)、9(2+7)、13(2+11) ... の合計数です。
p
1000 個のブール値の配列を作成します。が素数の場合に設定p[i]
し、そうでない場合に設定します。true
i
false
次に、O(N^2)
アルゴリズムは簡単になります。k
外側のループで 1 から 1000までの数字を調べてから、内側のループx
よりも大きいすべての素数を調べて、次のような素数がk
存在するかどうかを確認します。p[k-x]
true
for k in 1..1000
for x in primes greater than k
if (p[x-k])
print k can be represented as x plus (x-k)
break
現在、コンピューター支援による検証はかなり遅い速度で進行しているためO(N)
、1000 の数字の合計実行時間に対して一定の時間でチェックを実行できるとは思えません。