web-dev-qa-db-ja.com

素数性テストの最速アルゴリズム

(long longの範囲で)本当に大きい数値間の間隔で素数性をテストする必要があるため、数値が素数かどうかを確認するための高速アルゴリズムが必要です。あなたのアイデアを提案してください。

34
dada

良い方法の1つは Miller-Rabin テストです。ただし、これは確率論的なテストにすぎないことに注意してください。

19
cobbal

ジムシンクレアは、7の基数2、325、9375、28178、450775、9780504、1795265022に対するミラーラビンテストで、2 ^ 64未満の数が素数かどうかを決定論的にテストしました。 http://miller-rabin.appspot.com/ を参照してください。

17
user448810

漸近的に最も速い現在の(非確率論的)素数性テストは、本質的にO(n ^ 6)の複雑さを持つ「Lenstra/Pomerance改善AKS」であると私は信じています。

ただし、long longの範囲(64ビット整数である一般的なシステムを想定)は、それほど大きくありません。特に、2 ^ 32未満の約2億の素数しかないため、高速確率検定を使用し、事前計算された素数のリストを使って試行分割を行います(または、素数がある場合は、素数のリストで数を調べます) )その範囲ではかなり速く、おそらくそれを回避するための正しい方法です。

10
Stephen Canon

Miller-Rabin アルゴリズムを使用する GNU MP library をお勧めします。数か月間使用しており、非常に高速です。 。

具体的には、関数mpz_probab_prime_pがこれを行います。別の関数mpz_nextprimeを使用して、数値より大きい次の素数を見つけることもできます。必要に応じて、コードサンプルを投稿できます。

7
grokus

私は本当に良いアルゴリズムを思いつきました、それはすべての除数をチェックするよりもはるかに高速です-もちろん、これにより公開鍵暗号を解読することもできます。

ちょっと待ってください-私は窓を閉めるだけです、頭上にこれらすべての黒いヘリコプターがあります........

(または どのように素数性をテストできますか? を見てください)

6
Martin Beckett

素数性についてlong longをテストする場合は、 Baillie PSW素数性テスト が適しています。このテストは、1つの強力な疑似素数テストと1つのルーカステストを実行するため、非常に高速です。このテストに合格するいくつかのコンポジットが存在することが予想されますが、現時点では既知のものはなく、10未満の例外もありません。15。このテストの変形は、たとえばMathematicaで使用されます。

5
Accipitridae

Cobbalとgrokusは正しいです。 Miller-Rabinテストは、使用可能なアルゴリズムの中で最も有用です。はい、それは確率論的ですが、本当にあなたを怖がらせるべきではありません。テストは、実用的な目的で最も広く使用されています。

偽陽性の確率(偽陰性はありません)は、テストを繰り返すことで任意に小さくできることに注意してください。

1
Rob Lachlan

ここで私の答えを見てください:

1000桁の素数をテストする方法

テストは非常に高速です。 64ビット以下の範囲で作業している場合は、30030のGCDを投入して、大部分の数値の時間を少し節約できます。

1
Sam Harwell