ll qpow(ll a,ll b,ll M) //快速幂
{
ll ans =1;
while(b)
{
if(b&1)
ans*=a;ans%=M;
a*=a;a%=M;b>>=1;
}
return ans;
}
bool MillerRabinTest(ll x,ll n)//选取x为底,判定n是否可能为素数
{
ll y=n-1;
while(!(y&1))y>>=1; //略去n-1(=d*2^s)右端连续的0,将其调整为d
x=qpow(x,y,n);//x=x^d mod n
while(y<n-1&&x!=1&&x!=n-1) //将x反复平方,直到模数值出现n-1或1为止
x=(x*x)%n,y<<=(ll)1;
return x==n-1 || y&1==1 ;//若x为n-1或y为奇数,则n可能为素数,否则一定不是
}
bool isprime32(ll n)//判断32位以内的整数n是否为素数
{
if(n==2||n==7||n==61)return 1;//若n为【2,7,61】中的元素,则n为素数
if(n==1||(n&1)==0) return 0;//若n是1或是非2偶数,则n为合数
return MillerRabinTest(2,n)&&MillerRabinTest(7,n)&&MillerRabinTest(61,n);//若n通过以2,7,61为基准的Miller-Rabin测试,则n一定是素数;否则为合数
}