素数判定法は、入力された数が素数であるかどうかを判定するアルゴリズムです。数学の分野の中でも、暗号学などに用いられています。整数因数分解とは異なり、素数判定法は一般的に素因数を与えるのではなく、入力された数が素数であるかどうかだけを示します。因数分解は計算上難しい問題と考えられていますが、素数判定法は比較的容易です(実行時間は入力数のサイズに対して多項式時間です)。素数判定法の中には、数が素数であることを証明するものもあれば、ミラー・ラビン判定法のように、数が合成数であることを証明するものもあります。そのため、後者は素数判定法というよりも、合成数判定法と呼ぶ方がより正確かもしれません。
最も単純な素数判定は試行除算です。入力された数値が与えられた場合、2 から 1 までの素数で割り切れるかどうかを確認します。(つまり、分割しても余りが出ないかどうか)。もしそうなら、合成数である。そうでなければ、素数である。[ 1 ]すべての約数約数を持つ必要があります、そして素因数のしたがって、素因数を探すと、それで十分です。
例えば、100という数を考えてみましょう。100の約数は次のとおりである。
可能な約数がすべてテストを行うと、一部の約数は2回見つかるでしょう。これを観察するために、100の約数のペアのリストを考えてみましょう。
過去の製品これらは、先に登場した製品の逆です。たとえば、そして互いに逆の関係にある。さらに、2 つの約数のうち、そしてこの観察は、すべてに一般化される。: すべての約数ペア以下の約数を含むアルゴリズムは、以下の約数を探すだけでよい。すべての約数ペアの検出を保証するため。[ 1 ]
また、2は100を割り切る素数であり、これは100が素数ではないことを即座に証明します。算術の基本定理により、1を除くすべての正の整数は少なくとも1つの素数で割り切れます。したがって、アルゴリズムは、以下の素因数のみを探索する必要があります。。
別の例として、このアルゴリズムが17の素数性をどのように判定するかを考えてみましょう。、そして唯一の素数2と3です。どちらも17を割り切らないので、17は素数であることが証明されます。最後の例として、221を考えてみましょう。、そして素数2、3、5、7、11、13です。それぞれを確認すると、221が素数ではないことを証明する。
素数のリストを計算する場合実現不可能、すべての数値はそして約数を簡単に(そしてゆっくりと)チェックできます。簡単な改善策は、2 と 3 から 1 までの奇数のみで割り切れるかどうかをテストすることです。偶数で割り切れるということは、2で割り切れることを意味するからです。
この方法はさらに改善できる。5より大きい素数はすべて次の形式であることに注目してください。非負整数の場合そして実際、すべての整数は次の形式です。正の整数そして2 は割り切れるので、 そして、そして3分割そして3より大きい素数の場合、mod 6で可能な余りは1と5のみです。したがって、より効率的な素数判定法は、テストするのはが 2 または 3 で割り切れる場合は、その形式のすべての数をチェックします。そしてそれはこれは、すべての数値をテストするよりもほぼ3倍速い。。
さらに一般化すると、(( 番目の素数)は、、 どこそして原始的なもの、つまり最初のものの産物素数。
例えば、すべての整数は次の形式です。、 どこ. 2 は割り切れる3 分割、そして5は分割しますしたがって、30より大きいすべての素数は次の形式になります。のためにもちろん、この形式のすべての数字がと互いに素な素数である。例えば、は素数ではないが、17は互いに素である。。
その間、 どこオイラーのトーシェント関数は、以下のすべての素数による割り切れるかどうかをチェックします。は依然として必要です。前述の観察と同様の観察を再帰的に適用することで、エラトステネスの篩が得られます。
これらの方法(および以下で述べる他のすべての方法)を高速化する1つの方法は、200までのすべての素数など、特定の上限までのすべての素数のリストを事前に計算して保存することです。(このようなリストは、エラトステネスの篩、または各増分をテストするアルゴリズムによって計算できます。)既知のすべての素数に対して) そして、テストする前に大規模な方法による素数判定、まず、リストにある素数で割り切れるかどうかを確認します。もしそれらの数のいずれかで割り切れる場合は合成数であり、それ以上の判定は省略できます。
単純だが非効率的な素数判定法は、ウィルソンの定理を使用する。ウィルソンの定理は次のように述べている。素数であるのは、以下の条件を満たす場合に限る。
この方法は約モジュラー乗法は実用的ではないが、素数とモジュラー剰余に関する定理は、より実用的な多くの方法の基礎となっている。[ 2 ]
これらは実際にはうまく機能するように見えるテストですが、証明されていないため、厳密に言えばアルゴリズムではありません。フェルマー素数判定法とフィボナッチ数列判定法はその簡単な例であり、組み合わせると効果的です。ジョン・セルフレッジは、 pが奇数で、p ≡ ±2 (mod 5) である場合、以下の2つが両方とも成り立つ場合にpは素数であると推測しました。
ここで、f kはk番目のフィボナッチ数です。最初の条件は、基数 2 を使用したフェルマー素数判定です。
一般に、p ≡ a (mod x 2 +4) (ただし、a は(mod x 2 +4)の非剰余数)である場合、以下の条件が満たされればpは素数であるはずです。
f ( x ) kはxにおけるk番目のフィボナッチ多項式です。
セルフレッジ、ポメランス、ワグスタッフは、反例または反例が存在しないという証明に対して合計620ドルを提供した[ 3 ] 。現在、その賞金は数論財団から支払われる予定である。
確率的テストは、合成数に騙される確率の証明可能な上限を提供する点で、ヒューリスティックよりも厳密です。よく使われる素数判定法の多くは確率的テストです。これらのテストでは、テスト対象の数nの他に、サンプル空間からランダムに選択された数aを使用します。通常のランダム化素数判定法では、素数が合成数として報告されることはありませんが、合成数が素数として報告される可能性はあります。エラーの確率は、独立して選択された複数のaの値でテストを繰り返すことで低減できます。よく使われる 2 つのテストでは、任意の合成数nに対して、少なくとも半分のaがnの合成数性を検出します。したがって、 k回の繰り返しでエラーの確率は最大で 2 − kに低減され、 k を増やすことで任意に小さくすることができます。
ランダム化素数判定法の基本的な構造は以下のとおりです。
1回以上の反復の後、nが合成数でないことが判明した場合、nはおそらく素数であると宣言できます。
最も単純な確率的素数判定法は、フェルマー素数判定法(実際には合成数判定法)です。その仕組みは以下のとおりです。
a n −1 (mod n ) が 1 であるがnが素数でない場合、 nはa を基数とする擬素数と呼ばれます 。実際には、 a n −1 (mod n ) が 1 の場合、nは通常素数です。しかし、反例を以下に示します。n = 341 かつa = 2 の場合、
341 = 11·31 は合成数であるにもかかわらず、実際には 341 は最小の擬似素数で基数は 2 である ( [ 4 ]の図 1 を参照)。
2進数で2.5 × 10未満の擬素数はわずか21853個しかない。10 ( [ 4 ]の1005ページを参照)。これは、 nが2.5 × 10までの10、 2 n −1 (mod n ) が 1 に等しい場合、 nは素数である。ただし、nがこれらの 21853 個の擬似素数のいずれかである場合は除く。
合成数(カーマイケル数)の中には、 nと互いに素なすべてのaに対してa n − 1が 1 (mod n )となる性質を持つものがあります。最小の例はn = 561 = 3·11·17 で、この場合、561 と互いに素なすべてのaに対してa 560が 1 (mod 561) となります。しかしながら、フェルマーテストは、例えばRSA 公開鍵暗号アルゴリズムの鍵生成フェーズのように、数値を迅速にスクリーニングする必要がある場合によく使用されます。
ミラー・ラビン素数判定法とソロベイ・ストラッセン素数判定法は、より洗練された変種であり、すべての合成数を検出します(つまり、任意の合成数nに対して、少なくとも 3/4 (ミラー・ラビン) または 1/2 (ソロベイ・ストラッセン) の数aがnの合成数であることの証拠となります)。これらも合成数判定法です。
ミラー・ラビン素数判定法は次のように機能します。整数nが与えられたとき、nより小さい正の整数aを選びます。2 s d = n − 1 とします。ここでdは奇数です。
そして
この場合、 nは合成数であり、aは合成数の証拠となる。それ以外の場合、n は素数である場合もそうでない場合もある。ミラー・ラビン検定は、強力な素数判定検定である(PSW [ 4 ] 1004 ページを参照)。
Solovay–Strassen素数判定法は別の等式を使用する:奇数nが与えられたとき、nより小さい整数aを選び、
この場合、 nは合成数であり、a は合成数であることの証拠となる。そうでない場合、n は素数である場合もそうでない場合もある。ソロベイ・ストラッセン検定はオイラーの確率素数検定である(PSW [ 4 ] 1003 ページを参照)。
aの個々の値ごとに、Solovay–Strassen テストは Miller–Rabin テストよりも弱い。たとえば、n = 1905 でa = 2 の場合、Miller–Rabin テストではnが合成数であることが示されるが、Solovay–Strassen テストでは示されない。これは、1905 が Euler 擬素数 (基数 2) ではあるが、強い擬素数 (基数 2) ではないためである (これは PSW [ 4 ]の図 1 に示されている)。
ミラー・ラビン素数判定法とソロベイ・ストラッセンの素数判定法は単純で、他の一般的な素数判定法よりもはるかに高速です。場合によっては、フロベニウス擬似素数判定法を用いることでさらに効率を向上させることができます。この判定法は、ミラー・ラビン判定法の約3倍の時間がかかりますが、7回のミラー・ラビン判定法に匹敵する確率上限値を達成できます。
フロベニウス判定法は、ルーカス素数判定法の一般化である。
ベイリー-PSW素数判定法は、フェルマー素数判定法またはミラー-ラビン素数判定法とルーカス素数判定法を組み合わせた確率的素数判定法であり、既知の反例が存在しない素数判定法である。つまり、この判定法でnが素数であると判定されるような合成数nは知られていない。 [ 5 ] [ 6 ] nに対して反例が存在しないことが証明されている。。
レナード・アドレマンとミン・デ・フアンは、楕円曲線素数判定法の誤りのない(ただし期待される多項式時間)変種を発表した。他の確率的判定法とは異なり、このアルゴリズムは素数証明書を生成するため、数が素数であることを証明するために使用できる。[ 7 ]このアルゴリズムは実際には非常に遅い。
量子コンピュータが利用可能であれば、素数判定は古典コンピュータを使用するよりも漸近的に高速に行える。ショアのアルゴリズム、整数因数分解法、ポックリントン素数判定法を組み合わせることで、この問題を解決できる可能性がある。[ 8 ]
20 世紀初頭近く、フェルマーの小定理の系が素数判定に使えることが示されました。[ 9 ]これにより、ポックリントン素数判定法が生まれました。[ 10 ]しかし、この判定法はn − 1の部分因数分解を必要とするため、最悪の場合の実行時間はかなり遅いものでした。素朴な方法よりも大幅に高速な最初の決定論的素数判定法は、円分割判定法でした。その実行時間はO ((log n ) c log log log n )であることが証明できます。ここで、 nは素数判定する数、c はnに依存しない定数です。さらにいくつかの改良が加えられましたが、いずれも実行時間が多項式時間であることが証明できませんでした。 (実行時間は入力のサイズで測定され、この場合、入力サイズは ~ log nであり、これは数nを表すのに必要なビット数です。)解析的整数論に関するいくつかの予想が正しい場合、楕円曲線素数判定は O((log n ) 6 )で実行できることが証明できます。同様に、一般化リーマン予想(ミラーは紛らわしいことに「拡張リーマン予想」と呼んでいます) の下では、確率的ミラー・ラビン判定の基礎となる決定論的ミラー判定はÕ ((log n ) 4 ) で実行できることが証明できます。[ 11 ]実際には、このアルゴリズムは、そもそも処理できる数のサイズに対して、他の 2 つのアルゴリズムよりも遅くなります。これら 2 つの方法の実装はかなり難しく、プログラミング エラーのリスクを生み出すため、遅くても単純な判定が好まれることがよくあります。
2002年、Manindra Agrawal、Neeraj Kayal、Nitin Saxenaによって、証明可能な無条件の決定論的多項式時間素数判定法が初めて考案されました。AKS素数判定法はÕ((log n ) 12 )で実行されます(彼らの論文の改訂版ではÕ((log n ) 7.5 ) [ 12 ]に改善されています)。Sophie Germain予想が正しい場合は、さらにÕ((log n ) 6 )に短縮できます。 [ 13 ]その後、LenstraとPomeranceは、無条件でÕ((log n ) 6 )の時間で実行される判定法のバージョンを発表しました。[ 14 ]
アグラワル、カヤル、サクセナは、アグラワルの予想が正しい場合、彼らのアルゴリズムの変種が Õ((log n ) 3 ) で実行されることを提案している。しかし、ヘンドリック・レンストラとカール・ポメランスによるヒューリスティックな議論は、それがおそらく偽であることを示唆している。 [ 12 ]アグラワルの予想の修正版であるアグラワル・ポポヴィッチ予想[ 15 ]は、依然として正しい可能性がある。
計算複雑性理論において、素数に対応する形式言語はPRIMESと表記される。PRIMESがCo-NPに属することは容易に証明できる。その補集合であるCOMPOSITESはNPに属する。なぜなら、因数を非決定論的に推測することで合成性を判定できるからである。
1975年、ヴォーン・プラットは、素数判定のための証明書が多項式時間で検証可能であることを示し、それによってPRIMESがNPに属し、したがって詳細は素数証明書を参照してください。
その後、Solovay–StrassenアルゴリズムとMiller–Rabinアルゴリズムが発見され、PRIMESはcoRPに含まれるようになった。1992年、Adleman–Huangアルゴリズム[ 7 ]により複雑さはに削減された。これはプラットの結果を上回った。
1983年のアドルマン・ポメランス・ルーメリー素数判定法は、PRIMESをQP(準多項式時間)に分類したが、これは上述のクラスと比較できるものではないことが知られている。
実用上の扱いやすさ、リーマン予想を仮定した多項式時間アルゴリズム、その他の同様の証拠から、素数判定は多項式時間で解けるのではないかと長い間疑われていたが、証明されていなかった。AKS素数判定法の存在により、この長年の疑問はついに解決され、PRIMESはPに位置づけられた。しかし、PRIMESがP完全であるとは知られておらず、 NCやLなどPに含まれるクラスに属するかどうかも知られていない。PRIMESがAC 0に含まれないことは知られている。[ 16 ]
ルーカス判定法やプロス判定法など、ある数が素数かどうかを判定するための数論的な方法が存在する。これらの判定法は通常、n + 1、n − 1、または同様の数の因数分解を必要とするため、一般的な素数判定には適さないが、判定対象の数nが特定の形式であることが分かっている場合には非常に有効であることが多い。
ルーカス判定法は、素数nに対して、aがnを法とする原始根である場合、aのnを法とする乗法位数がn -1になるという事実に基づいています。aがnに対して原始根であることを示せれば、nが素数であることを示すことができます。