米勒-拉宾算法:快速判断一个数是不是素数
需要用到的定理:
最小费马定理:如果n是素数,则(a ^ (n - 1)) % n恒等于1。
快速模取幂
米勒-拉宾算法就是结合上面两种,通过不断判断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("非素数\n");
continue;
}
if(check(n))
printf("素数\n");
else
printf("非素数\n");
}
return 0;
}