费马小定理:若
p
p
p 为质数,则对于
a
∈
[
1
,
p
−
1
]
a\in[1,p-1]
a∈[1,p−1] ,有
a
p
−
1
≡
1
(
m
o
d
p
)
a^{p-1}\equiv1\pmod p
ap−1≡1(modp)
如果一个数
p
p
p,不满足
a
p
−
1
≡
1
(
m
o
d
p
)
a^{p-1}\equiv1\pmod p
ap−1≡1(modp),那么这个数一定不是一个素数
二次探测定理:若
p
p
p 为质数,那么
x
2
≡
1
(
m
o
d
p
)
x^2\equiv 1\pmod p
x2≡1(modp) 的解只有
x
1
=
1
,
x
2
=
p
−
1
x_1=1,x_2=p-1
x1=1,x2=p−1
证明:
x
2
−
1
≡
0
(
m
o
d
p
)
x^2-1\equiv 0\pmod p
x2−1≡0(modp)
(
x
−
1
)
(
x
+
1
)
≡
0
(
m
o
d
p
)
(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) , 又因
p
p
p 为质数,得到
x
−
1
=
p
x-1=p
x−1=p或
x
+
1
=
p
x+1=p
x+1=p
同理若
p
p
p不满足上述条件,
p
p
p不为质数
可以写出下述代码,选
30
30
30以内的质数做基,
i
n
t
int
int范围为内的质数都不会错
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;
}