费马小定理:若 ppp 为质数,则对于 a∈[1,p−1]a\in[1,p-1]a∈[1,p−1] ,有 ap−1≡1(modp)a^{p-1}\equiv1\pmod pap−1≡1(modp)
如果一个数ppp,不满足 ap−1≡1(modp)a^{p-1}\equiv1\pmod pap−1≡1(modp),那么这个数一定不是一个素数
二次探测定理:若 ppp 为质数,那么 x2≡1(modp)x^2\equiv 1\pmod px2≡1(modp) 的解只有 x1=1,x2=p−1x_1=1,x_2=p-1x1=1,x2=p−1
证明:x2−1≡0(modp)x^2-1\equiv 0\pmod px2−1≡0(modp)(x−1)(x+1)≡0(modp)(x-1)(x+1)\equiv 0\pmod p(x−1)(x+1)≡0(modp)所以 p∣(x−1)(x+1)p|(x-1)(x+1)p∣(x−1)(x+1) , 又因ppp 为质数,得到x−1=px-1=px−1=p或x+1=px+1=px+1=p
同理若ppp不满足上述条件,ppp不为质数
可以写出下述代码,选303030以内的质数做基,intintint范围为内的质数都不会错
int p[12]={11,2,3,5,7,11,13,17,19,23,29,31};
bool miller_rabin(int x)
{
for(int i=1;i<=p[0];i++) if(x==p[i]) return true;
if(x<=32||!(x&1)) return false;
int t=x-1,s=0;
while(!(t&1)) s++,t>>=1;
for(int i=1,r,pre;i<=p[0];i++)
{
if(x%p[i]==0) return false;
pre=r=ksm(p[i],t,x);
for(int j=1;j<=s;j++)
{
r=1ll*r*r%x;
if(r==1&&pre!=1&&pre!=x-1) return false;
pre=r;
}
if(r!=1) return false;
}
return true;
}
本文介绍了基于费马小定理和二次探测定理的Miller-Rabin素数测试方法。通过这种方法,可以判断一个数是否为素数。代码实现中选择30以内的质数作为基,确保在整数范围内判断的准确性。
6633

被折叠的 条评论
为什么被折叠?



