ミラーラビンアルゴリズム
ミラー・ラビンアルゴリズム:1つの数が素数であるかどうかを迅速に判断する
必要な定理:
最小Ferma定理:nが素数であれば(a^(n−1)))%nは1に等しい.
クイックモードべき乗
ミラー・ラビンアルゴリズムは,上記2つを組み合わせて,fmod(a,n−1,n)の値が1であるか否かを絶えず判断することによって判断する.これは確率アルゴリズムであり,1であれば素数とは限らず,1でなければ必ず合数である.繰り返し判断すると確率が極めて小さくなります.
アルゴリズムテンプレート:
必要な定理:
最小Ferma定理:nが素数であれば(a^(n−1)))%nは1に等しい.
クイックモードべき乗
ミラー・ラビンアルゴリズムは,上記2つを組み合わせて,fmod(a,n−1,n)の値が1であるか否かを絶えず判断することによって判断する.これは確率アルゴリズムであり,1であれば素数とは限らず,1でなければ必ず合数である.繰り返し判断すると確率が極めて小さくなります.
アルゴリズムテンプレート:
#include <iostream>
using namespace std;
int fmod(int a, int b, int c)//
{
if(b == 1) return a;
int t = fmod(a, b / 2, c);
t = (t * t) % c;
if(b & 1) t = (t * a) % c;
return t;
}
int check(int n)// -
{
srand(time(0));
for(int i = 0; i < 100; ++ i)
{
if(fmod(rand() % (n - 1) + 1, n - 1, n) != 1)//a , ;a [1,n-1], n , n a
return 0;
}
return 1;
}
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
if(n < 2)
{
printf("
");
continue;
}
if(check(n))
printf("
");
else
printf("
");
}
return 0;
}