以下代码(来自某博客)
ll pri[]={2,3,5,7,11,13,17,19,23,29,31,37};
inline bool chk(ll x)
{
ll v=qpow(x,mod-1);
if(v!=1)return 0;
ll d=mod-1;
while(!(d&1))
{
d>>=1;
v=qpow(x,d);
if(v==mod-1)return 1;
if(v!=1)return 0;
}
return 1;
}
inline bool MR(ll x)
{
mod=x;
for(auto p:pri)
{
if(x==p)return 1;
if(!chk(p))return 0;
}
return 1;
}
学的时候比较疑惑为什么 if(v==mod-1)return 1; 碰到 mod−1 可以直接返回,如果后面算出来的 v=1 且 v=mod−1 怎么办。。