Miller_Rabin素性测试:
二次探测定理:
(p)是质数,且(x^2equiv 1 pmod p)
则:
(xequiv1pmod p)或(xequiv p-1pmod p),且他的逆定理成立。
证明:
[ecause x^2equiv 1pmod p
]
[ herefore (x+1)(x-1)equiv 0pmod p
]
[ herefore p|(x+1)$$或 $$ p|(x-1)
]
( herefore)得证。
至于逆定理为啥成立我也不知道
欧拉函数:
(phi (x))表示(<x)的数中与(x)互质的数的个数。
显然,一个合数的(phi)值很小。
Miller_Rabin算法:
假设我现在要测(n)是否是素数,钦定(n>2)
随机几个素数(a),对于每一个(a),计算:
[a^{n-1}mod n
]
因为(n)是奇数,
所以(n-1)是偶数.
将$$a^{n-1}mod n$$
分解成$$a{2k*t}mod n$$
计算时,先算(a^t),然后不停平方,每次用二次探测定理判断他是否是素数。最后算到(a^{n-1}),用费马小定理判断是否是素数。如果
[a^{n-1}mod n!equiv 1
]
那么n一定是合数。
如果(a^{2^i*t}equiv 1pmod n)符合二次探测定理
而且(a^{2^{i-1}*t}!equiv 1pmod n)
并且(a^{2^{i-1}*t}!equiv n-1pmod n)
那么n就是合数。
以上都没判断出来的,就有(frac{3}{4})的几率是质数了。
证明:
据说可以用欧拉函数证,但我不会证qwq
Code
bool check(int p,ll n)
{
if(p==n)
return 1;
if(quick_pow(p,n-1,n)!=1)
return 0;
ll s=0,k=n-1;
while(!(k&1))
{
k>>=1;
s++;
}
ll last=quick_pow(p,k,n);
for(int i=1;i<=s;i++)
{
ll now=last*last%n;
if(now==1)
return last==n-1||last==1;
last=now;
}
return 0;
}
等等,还有一件事!
当 (N<4,759,123,141),选取 (a=2,7,61) 即可确保算法得出正确结果。
当(N<3,825,123,056,546,413,051≈3*10^{18}),选取(a=2,3,5,7,11,13,17,19,23)即可确保算法得出正确结果。
当(N<18,446,744,073,709,551,616=2^{64}),选取 (a=2,3,5,7,11,13,17,19,23,29,31,37)即可确保算法得出正确结果。