LL mul(LL x,LL y,LL mod)
{
return (x*y-(long long)(x/(long double)mod*y+1e-3)*mod+mod)%mod;
}
LL pow_mod(LL a,LL n, LL mod)
{
LL ret=1;
while(n)
{
if(n&1) ret=mul(ret,a,mod);
a=mul(a,a,mod);
n>>=1;
}
return ret;
}
bool isprime(LL n)
{
if(n < 2) return 0;
if(n!=2 && n%2==0) return 0;
LL a[]={2, 3, 5,233,331};
LL s=n-1;
while(!(s&1)) s>>=1;
for(int i = 0; i <= 4; i++)
{
if(n==a[i]) return 1;
LL t=s,m=pow_mod(a[i],s,n);
while(t!=n-1 && m!=1 && m!=n-1)
{
m=mul(m,m,n);
t<<=1;
}
if(m!=n-1 && !(t&1)) return 0;
}
return 1;
}
判断一个大数(小于2的63次方)是否是素数
猜你喜欢
转载自blog.csdn.net/int_lyy/article/details/100016409
今日推荐
周排行