(漸近的に)最も効率的な確定的素数判定アルゴリズムは、に起因するLenstraとPomerance時間で実行されている、。拡張リーマン仮説を信じている場合、ミラーのアルゴリズムは時間内に実行されます。他にも多くの決定論的素数テストアルゴリズムがあります。たとえば、ミラーの論文にはO~(log6n)〜O(N1/7)O~(log4n)O~(n1/7)O(lognO(logloglogn))。
O~(log2n)2−80O~(log2n)
これらすべてのテストで、メモリは問題ではありません。
彼らのコメントでは、jbappleは実際にどの素数テストを使用するかを決定する問題を提起しています。これは実装とベンチマークの問題です。いくつかのアルゴリズムを実装して最適化し、どの範囲でどれが最速かを実験的に決定します。好奇心の強い人のために、PARIのコーダーはまさにそれを行い、決定論的関数isprime
と確率論的関数を考え出しispseudoprime
ました。どちらもここにあります。使用される確率検定はMiller–Rabinです。決定論的なものはBPSWです。
Dana Jacobsenからの詳細情報は次のとおりです。
バージョン2.3以降のPariは、に対してAPR-CLの素数性証明を使用し、に対してisprime(x)
BPSWの可能性のある素数テスト(「ほぼ強力な」ルーカステスト)を使用しispseudoprime(x)
ます。
それらは動作を変更する引数を取ります:
isprime(x,0)
(デフォルト。)組み合わせ(BPSW、クイックポックリントンまたはBLS75定理5、APR-CL)を使用します。
isprime(x,1)
n−1
isprime(x,2)
APR-CLを使用します。
ispseudoprime(x,0)
(デフォルト。)BPSWを使用します(基数2のMR、「ほぼ非常に強い」ルーカス)。
ispseudoprime(x,k)
k≥1kmpz_is_probab_prime_p(x,k)
Pari 2.1.7は、さらに悪いセットアップを使用していました。 isprime(x)
単にMRテスト(デフォルトは10)であり、isprime(9)
かなり頻繁にtrueを返すなどの楽しいことにつながりました。を使用isprime(x,1)
するとPocklingtonの証明が行われます。これは約80桁で問題ありませんでしたが、一般的に使用するには遅すぎました。
また、実際には、これらのアルゴリズムは遅すぎるため、誰もこれらのアルゴリズムを使用していません。 私はあなたの意味を知っていると思いますが、これはあなたの聴衆によっては強すぎると思います。AKSはもちろん驚くほど遅いですが、APR-CLとECPPは十分に高速であるため、一部の人々はそれらを使用しています。それらは偏執的な暗号化に役立ち、実証済みの素数を求めるのに十分な時間があるようなprimegaps
場合factordb
に役立ちます。
[それについての私のコメント:特定の範囲の素数を探すとき、私たちはいくつかのふるい分けアプローチに続いていくつかの比較的迅速な確率的テストを使用します。その場合にのみ、決定的なテストを実行します。]
これらすべてのテストで、メモリは問題ではありません。 これはAKSの問題です。たとえば、このeprintを参照してください。これのいくつかは実装に依存します。numberphileのビデオがAKSと呼んでいるもの(実際にはFermatのリトル定理の一般化)を実装すると、メモリ使用量が非常に高くなります。参考文献のようなv1またはv6アルゴリズムのNTL実装を使用すると、大量のメモリがバカになります。優れたv6 GMP実装では、1024ビットプライムに対して約2GBを使用しますが、これは多くの場合このような少数のメモリ。バーンスタインのいくつかの改善とGMPバイナリセグメンテーションを使用すると、成長が大幅に改善されます(たとえば、1024ビットで最大120MB)。これは、他の方法が必要とするよりもはるかに大きく、驚くことではありませんが、APR-CLまたはECPPよりも数百万倍遅くなります。