知识前置:
a^(p-1)≡1(mod p)(费马小定理)(p为素数,且a<p)
用途:
检验一个数是否为素数
实现方法:
快速幂+随机化
原理:
一个素数一定是满足费马小定理的,而一个合数有一定的可能性满足费马小定理,所以可以利用随机化随机a,来测试一个数是否为素数
优点:
时间短,有一个判断一个,无需范围
缺点:
有一定的可能性会误判
补充:
miller rabin不一定只用费马小定理,其他只有素数满足的数学定理也能放进去测试,还能提高准确率
代码:
long long pw(long long va,long long k) { if(k==1) { return va%p; } if(k%2==0) { return pw((va*va)%p,k/2)%p; } else { return ((pw((va*va)%p,k/2)%p)*va)%p; } } bool check(int val) { if(val==1) { return false; } if(val==2) { return true; } if(val==3) { return true; } long long pd=0; for(rii=1;i<=10;i++) { int kkk=rand(); int ltt=rand(); p=val; kkk=kkk*ltt%97;//取膜和判断次数由题目给的时间而定,测试次数越多,取膜越大,时间耗费越多 kkk*=2; pd=max(pd,pw(kkk,val-1)); } if(pd==1) { return true; } else { return false; } }