快速判断一个数是否为素数:
代码:
typedef long long LL;
LL exp_mod(LL a,LL b,LL m)
{
bool bit[64];
int i=0;
while(b)
{
bit[i++] = b&1 ? 1 : 0;
b >>= 1;
}
LL s=1;
for(i--; i>=0; i--)
{
s = s * s % m;
if(bit[i]) s = s * a % m;
}
return s;
}
bool Witness(LL a,LL n)
{
LL m = n-1;
int j=0;
while( !(m&1) )
{
j++;
m >>= 1;
}
LL x = exp_mod(a,m,n);
if(x == 1 || x == n-1) return false;
while(j--)
{
x = x * x % n;
if(x == n-1) return false;
}
return true;
}
bool Miller_Rabin(LL n,int T=1)
{
if(n<2) return false;
if(n==2) return true;
if( !(n&1) ) return false;
while(T--)
{
LL a = rand() * (n-2) / RAND_MAX + 1; //[1,n+1]
if( Witness(a,n) ) return false;
}
return true;
}