说明:如果n是一个正整数,如果存在和n互素的正整数a满足a^n-1=1(modn),则n是基于a的伪素数,如果先取多个基a都满足,则n几乎就是素数.这种算法可以快速地测试一个数是否满足素数的必要条件,但不是充分条件。不过也可以用它来测试素数,出错概率很小, 对于任意奇数n>2和正整数s,该算法出错概率至多为2^(-s),因此,增大s可以减小出错概率,一般取s=50就足够了.
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#ifdef WIN32
typedef __int64 i64;
#else
typedef long long i64;
#endif;
int modular_exponent(int a, int b,int n)
{
int ret=1;
while(b)
{
if(b&1) ret=(ret%n)*(a%n)%n;
b>>=1;
a=(a%n)*(a%n)%n;
}
return ret;
}
// Camicheal number:541,41041,825265,321197185
int miller_rabin(int n, int time = 10)
{
if(n==1||(n!=2&&!(n%2))||(n!=3&&!(n%3))||(n!=5&&!(n%5))||(n!=7&&!(n%7)))
return 0;
while(time--)
{
if(modular_exponent(((rand()&0x7fff<<16)+rand()&0x7fff+rand()&0x7fff)%(n-1)+1, n-1, n) != 1)
return 0;
}
return 1;
}
int main()
{
int n,time;
while(1)
{
scanf("%d",&n);
time = 10;
int t = miller_rabin(n,time);
printf("%d\n",t);
}
system("pause");
return 0;
}