当前位置: 首页 > news >正文

质数筛法

质数:大于一的自然数中,除了1和它本身外没有其他因数的数
大于2的偶数一定不是质数

暴力

bool isPrime(int x){if(x<=1)return false;for(int i=2;i<x;i++){if(x%i==0)return false;}return true;
}

O(N)

优化1:跳过偶数

bool isPrime(int x){if(x<=1)return false;if(x==2)return true;if(x%2==0)return false;for(int i=3;i<x;i+=2){if(x%i==0)return false;}return true;
}

仍然是O(N)

优化2:因数是成对出现的,一个因数小于sqrt(x),另一个因数就大于sqrt(x),只需要枚举到sqrt(x)

bool isPrime(int x){if(x<=1)return false;for(int i=2;i*i<=x;i++){if(x%i==0)return false;}return true;
}

O($N^{1/2}$)

埃氏筛法

唯一分解定理:一个合数可以分解成若干个质数的乘积
一个质数的倍数一定是合数

埃氏算法求一个范围n内的所有质数:

vector<int> primes;    //存找到的质数
bool isPrime[maxNum];    //标记下标是否是质数void Ero(int n){memset(isPrime,true,n);isPrime[0]=isPrime[1]=false;for(int i=2;i<=n;i++){if(isPrime[i]==true){primes.push_back(i);for(int j=i+i;j<=n;j+=i){isPrime[j]=false;}}}
}

O(Nlog(logN))

缺点:合数被重复标记

欧拉筛法

规定每个合数只被其最小的质因数筛掉,每个数只处理一次(质数直接收集,合数只需标记一次),所以是O(N)

被一个最小质因数x筛掉的合数y,y>=x*x,被x筛掉的合数至少是x的x倍
反证:若y是x的k倍(k<x)

  1. 若k是质数,那么y就不该被比k还大的质数x筛掉
  2. 若k是合数,k还可以分解成更小的质数,y就应该被更小的质数筛掉
vector<int> primes;    //存找到的质数
bool isPrime[maxNum];    //标记下标是否是质数bool Euler(int n){memset(isPrime,true,n);isPrime[0]=isPrime[1]=false;for(int i=2;i<=n;i++){if(isPrime[i]==true){primes.push_back(i);for(int j=i;j<=n;j++){    //枚举倍数int y=j*i;    //y是i的j倍,j至少是i//若y中有比i更小的质因数,这个质因数在j里面bool flag=true;//枚举已收集的质数,找是否有比i更小的质因数for(auto p:primes){if(j%p==0){flag=false;break;}}if(!flag)continue;    //i不是y的最小质因数else isPrime[y]=false;    //i是y的最小质因数,标记}}}
}

复杂度没有降下来
枚举每个质数的倍数的循环可以合并到外层循环

vector<int> primes;    //存找到的质数,升序
bool isPrime[maxNum];    //标记下标是否是质数bool Euler(int n){memset(isPrime,true,n);isPrime[0]=isPrime[1]=false;for(int i=2;i<=n;i++){if(isPrime[i]==true){primes.push_back(i);}//枚举所有已收集的质数,把i当作prime[j]的倍数for(int j=0;j<primes.size();j++){int x=i*primes[j];if(x>n)break;isPrime[x]=false;    //primes[j]是x的最小质因数if(i%primes[j]==0)  //保证合数只被最小质因数标记//当primes[j]是i的质因数,primes[j+1]*i的//最小质因数<=primes[j]而不是primes[j+1],//不能保证合数只被最小质因数筛,所以退出循环break;}}
}

时间复杂度O(N)

http://www.jsqmd.com/news/583539/

相关文章:

  • 2025最权威的五大AI科研神器推荐
  • 计算机毕业设计:Python汽车销量大数据预测平台 Flask框架 可视化 机器学习 AI 大模型 大数据(建议收藏)✅
  • AI工程范式演进:Prompt → Context → Harness
  • Qwen3-TTS-Tokenizer-12Hz长语音生成效果展示:10分钟连续语音稳定性测试
  • TlbbGmTool:天龙八部单机版GM工具全维度管理指南
  • 药流需要住院吗?药流术后修护行业洞察与实用指南
  • 2025免费AI降重工具实测:7款对比,AIGC内容降AI效果拉满
  • 2025届最火的五大AI学术方案实测分析
  • 离线安装OpenCV的终极方案:conda与pip双模式详解(附清华源配置)
  • 关键词推广和网站优化(SEO)如何结合
  • 前后端分离在线文档管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • Scroll Reverser:macOS滚动方向终极解决方案,彻底告别操作混乱
  • PyTorch 2.8镜像效果实测:120GB内存+10核CPU协同加速大模型微调过程
  • AI Agent 与传统AI区别:从被动响应到主动执行
  • 北京 SEO 优化公司哪家比较专业
  • 【技术干货】从 Kilo 重构 VS Code 扩展,看多智能体并行 AI 编程的新范式
  • OpenClaw低配优化:Qwen3.5-9B在4GB内存设备运行技巧
  • Chrome for Testing 问题导向型故障排除指南
  • 探索A星算法优化:提升路径搜索效率与平滑度
  • 2026届学术党必备的降重复率助手实测分析
  • SEO_如何通过内容SEO获取稳定流量的关键方法
  • 技术赋能B端拓客:号码核验行业的迭代与价值升级
  • 基于深度学习的田间杂草检测系统(YOLOv12/v11/v8/v5模型)(源码+lw+部署文档+讲解等)
  • 深入实战:Python SDK如何优雅解决飞书开放平台集成挑战
  • Openclaw语音控制之离线语音识别 vs 云端 API:性能与隐私对比
  • MCGS6.2昆仑通泰通用版配料系统仿真程序,提升工业自动化效能
  • 【AI编程工具系列:第19篇】开源AI编程工具自建方案:完全离线AI编程环境搭建指南
  • LLM性能评估入门到精通,搞懂推理指标看这篇就够了!
  • 2026届必备的五大降重复率工具横评
  • 外链建设对SEO有什么作用_如何进行外链建设_如何利用数据驱动 SEO 优化决策