昔 ツイートした方法をふと思い出しました
確率的アルゴリズム
決定的なアルゴリズム とは異なり、ランダム性を取り入れた確率的アルゴリズム(乱択アルゴリズム)を用いることで、効率的に計算できるようになる場合があります。
確率的アルゴリズムでは、計算時間がかかる場合 や 誤った判定をする場合 などが 無視できるほど低い確率であることを保証しており、決定的アルゴリズムと比較して 効率的に計算することが可能です。
決定的な素数判定アルゴリズム
単純な決定的な素数判定アルゴリズムとして の試し割りする方法 があります。
が与えられたときに、 が 以上 以下の整数で割り切れるかどうかを判定します。
template< typename T > bool is_prime(T N) { for(T i = 2; i * i <= N; i++) { if(N % i == 0) return false; } return true; }
より効率的な方法として、AKS 素数判定法 と呼ばれる の決定的アルゴリズムを用いる方法も存在します。
確率的素数判定アルゴリズム
常に素数ではないと判定すればよいです。
template< typename T > bool is_prime(T N) { return false; }
素数定理を用いてランダムに選んだ が素数である確率は に近似できます。
つまり正しい素数判定をする確率は に近似します。
このアルゴリズムは、実装が簡潔 であり 与えられる が大きいほど正しく動作する確率が高くなる 利点があります。(いや これ間違える確率を無視できねえな)
最後に
うし