素数判定 学习笔记
费马素性测试
费马小定理:
因为费马小定理的逆命题对于绝大部分的数是正确的,所以我们可以用它来测试素性。
我们可以随机若干个
- 如果
,那么继续检测。 - 否则其为合数。
相关题目:ARC017A。
代码
int p;
int qpo(int a,int b,const int mod){
a%=mod;
int res=1;
while(b){
if(b&1) res=(res*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return res;
}
mt19937 rd(time(NULL));
signed main() {
in1(p);
For(i,1,1000000) {
int a=abs((int)rd());
if(a%p==0) continue;
if(qpo(a,p-1,p)!=1) {
cout<<"NO\n";
return 0;
}
}
cout<<"YES\n";
return 0;
}
但是值得注意的是,有这样一类数,如 if(a%p==0) continue;
的方式筛掉大部分的这些数。
证明
当
所以一定不会出现
所以可能出现一个
Miller-Rabin 素性测试
二次探测定理:
证明
设
通过选取一些固定的数字,也可以实现一定范围内的正确性。
在考场上选取
如果你想知道前
相关题目:SPOJ 288 PON - Prime or Not。
代码
#define int __int128
int t,p;
int tst[15]={0,2,3,5,7,11,13,17,19,23,29,31,37};
int qpo(int a,int b,int mod) {
int res=1;
for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=(res*a)%mod;
return res;
}
void divide(int p,int &x,int &u) {
while(p%(1<<(x+1))==0) x++;
u=p/(1<<x);
}
bool check(int p) {
if(p<=40) {
For(i,1,12) if(p==tst[i]) return 1;
return 0;
}
int t=0,u=0;
divide(p-1,t,u);
For(i,1,12) {
int a=tst[i];
a=qpo(a,u,p);
if(a==1) continue;
bool flg=0;
For(j,1,t) {
if(a==p-1) {
flg=1;
break;
}
a=(a*a)%p;
}
if(!flg) return 0;
}
return 1;
}
本文来自博客园,作者:coding_goat_qwq,转载请注明原文链接:https://www.cnblogs.com/CodingGoat/p/18456506
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!