(long longの範囲で)本当に大きい数値間の間隔で素数性をテストする必要があるため、数値が素数かどうかを確認するための高速アルゴリズムが必要です。あなたのアイデアを提案してください。
良い方法の1つは Miller-Rabin テストです。ただし、これは確率論的なテストにすぎないことに注意してください。
ジムシンクレアは、7の基数2、325、9375、28178、450775、9780504、1795265022に対するミラーラビンテストで、2 ^ 64未満の数が素数かどうかを決定論的にテストしました。 http://miller-rabin.appspot.com/ を参照してください。
漸近的に最も速い現在の(非確率論的)素数性テストは、本質的にO(n ^ 6)の複雑さを持つ「Lenstra/Pomerance改善AKS」であると私は信じています。
ただし、long long
の範囲(64ビット整数である一般的なシステムを想定)は、それほど大きくありません。特に、2 ^ 32未満の約2億の素数しかないため、高速確率検定を使用し、事前計算された素数のリストを使って試行分割を行います(または、素数がある場合は、素数のリストで数を調べます) )その範囲ではかなり速く、おそらくそれを回避するための正しい方法です。
Miller-Rabin アルゴリズムを使用する GNU MP library をお勧めします。数か月間使用しており、非常に高速です。 。
具体的には、関数mpz_probab_prime_pがこれを行います。別の関数mpz_nextprimeを使用して、数値より大きい次の素数を見つけることもできます。必要に応じて、コードサンプルを投稿できます。
私は本当に良いアルゴリズムを思いつきました、それはすべての除数をチェックするよりもはるかに高速です-もちろん、これにより公開鍵暗号を解読することもできます。
ちょっと待ってください-私は窓を閉めるだけです、頭上にこれらすべての黒いヘリコプターがあります........
(または どのように素数性をテストできますか? を見てください)
素数性についてlong longをテストする場合は、 Baillie PSW素数性テスト が適しています。このテストは、1つの強力な疑似素数テストと1つのルーカステストを実行するため、非常に高速です。このテストに合格するいくつかのコンポジットが存在することが予想されますが、現時点では既知のものはなく、10未満の例外もありません。15。このテストの変形は、たとえばMathematicaで使用されます。
Cobbalとgrokusは正しいです。 Miller-Rabinテストは、使用可能なアルゴリズムの中で最も有用です。はい、それは確率論的ですが、本当にあなたを怖がらせるべきではありません。テストは、実用的な目的で最も広く使用されています。
偽陽性の確率(偽陰性はありません)は、テストを繰り返すことで任意に小さくできることに注意してください。