质数筛
判断一个数是否为质数的方法
暴力求解
时间复杂度为
适用于单次查询
bool isprime(long long x){//暴力做法 if(x==1) return false; for(long long i=2;i*i<=x;++i){ if(x%i==0) return false; } return true; }
埃筛
快捷判断1~N之间的数是不是质数
基于质数的倍数是合数的概念,我们从而开始遍历值域
适用于不太大值域?,多次查询
代码:
const int maxm=5e6+5; bool isprime[maxm];//数组标记快 void pre(){ isprime[1]=1;//为1不是质数 for(long long i=2;i<=maxm;++i){ if(isprime[i]==0){ for(long long j=i*i;j<=maxm;j+=i){ isprime[j]=1; } } } }
欧拉筛
在埃筛的过程中存在重复的情况,例如30会被3和5筛两遍,所以这就是埃筛中存在的赘余判断。
代码:
int N = 1e6 + 5, cnt = 0; vector<bool> isprime(N, true);//判断素数 vector<long long> prime;//存储素数 void pre(){ long long t; isprime[1] = false; for(long long i = 2; i < N; ++ i){ if(isprime[i]){ prime.push_back(i); ++ cnt; } for(int j = 0; j < cnt; ++ j){ t = i * prime[j]; if(t > N) break; isprime[t] = false; if(i % prime[j] == 0) break; } } return ; }
米勒-拉宾素性检验(MillerRabbin)
#include<iostream> #define ll long long #define lll __int128 using namespace std; lll qmksm(ll a,ll b,ll m){ lll s=1,z=a%m; while(b>0){ if(b&1==1){ s*=z; s%=m; } z*=z; z%=m; b>>=1; } return s; } bool prime(ll n){ if(n<3) return n==2; if(n%2==0) return 0; ll i,j,d=n-1,r=0,tss[8]={-1,2,325,9375,28178,450775,9780504,1795265022}; while(d%2==0) d/=2,r++; for(i=1;i<=7;i++){ lll zc=qmksm(tss[i],d,n); if(zc<=1 or zc==n-1) continue; for(j=0;j<=r-1;j++){ zc=(zc%n*zc%n)%n; if(zc==n-1 and j!=r-1){ zc=1; break; } if(zc==1) return 0; } if(zc!=1) return 0; } return 1; } int main(){ ll n; while(scanf("%lld",&n)!=EOF){ if(prime(n)) printf("Y\n"); else printf("N\n"); } return 0; }
相关资料
https://blog.csdn.net/holly_Z_P_F/article/details/85063174
https://oi-wiki.org/math/number-theory/sieve/
例题
1e18范围判质数 https://loj.ac/p/143
欧拉筛判第k大素数 https://www.luogu.com.cn/problem/P3383
本文来自博客园,作者:Qiansui,转载请注明原文链接:https://www.cnblogs.com/Qiansui/p/17282607.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现