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

数论专题-质数筛

本篇博客是【数论专题】系列的第 \(1\) 篇,希望大家多多支持。

埃氏筛

埃氏筛,全称埃拉托斯特尼筛法。

埃氏筛的核心思想是:如果一个数 \(p\) 是质数,那么 \(p\) 的倍数的不是质数,即将所有质数的倍数都标记为合数,不需要标记合数的倍数

埃氏筛时间复杂度 \(o(n \log \log n)\),但常数较大。

bool is_prime[N];//is_prime[i] 用来标记 i 是不是质数 
void sieve_primes(int n)
{for(int i = 1;i <= n;i ++) is_prime[i] = true;//初始化 is_prime[1] = false;//1 不是质数 for(int i = 2;i <= n;i ++){if(is_prime[i] == false) continue;//因为只标记质数的倍数,所以遇到合数要跳过 for(int j = i * 2;j <= n;j += i)is_prime[j] = false;//标记 }
}

欧拉筛

欧拉筛,也称线性筛,是一种比埃氏筛更优秀的筛法。

欧拉筛的核心思想是:对于每个合数,只会被它的最小质因数给筛掉,从而避免重复标记。

欧拉筛需要多维护一个数组 \(prime\)\(prime_i\) 表示第 \(i\) 个质数。

欧拉筛需要用当前遍历到的 \(i\) 和当前筛出的质数 \(prime_j\) 标记合数,因为 \(i\times prime_j\) 一定是合数,先进行标记,然后,最重要的优化来了:如果 \(i\bmod\ prime_j = 0\),说明 \(i\) 的最小质因数为 \(prime_j\),此时应该停止标记。

欧拉筛的时间复杂度为 \(O(n)\)

bool is_prime[N];//is_prime[i] 用来标记 i 是不是质数 
int prime[N], tot;//tot 表示当前质数的个数,prime[i] 表示第 i 个质数 
void sieve_primes(int n)
{for(int i = 1;i <= n;i ++) is_prime[i] = true;//初始化 is_prime[1] = false;//1 不是质数 for(int i = 2;i <= n;i ++){if(is_prime[i] == true) prime[++ tot] = i;//如果第 i 个数是质数,把它加入 prime 数组 for(int j = 1;j <= tot && prime[j] * i <= n;j ++){is_prime[prime[j] * i] = false;//标记 if(i % prime[j] == 0) break;//当 prime[j] 是 i 的最小质因数是,停止标记 }}
}
http://www.sczhlp.com/news/13049/

相关文章:

  • ESP32-S3 控制 外部中断
  • 反射容斥
  • IDEA打开application.properties出现乱码
  • GNU/Linux GPIO学习
  • Template-system 研发成功|远程组件用宿主 React 的完整思路纪要
  • Odoo18滑块验证码系统:从设计到实现的完整技术解析
  • C++练习题链接
  • 面试题
  • 网络层
  • 物理层和数据链路层
  • 456
  • 记忆图片
  • MCU如何进行DDR读写测试?
  • 伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 04 - Rainbow
  • 不同主机间通信及网络基础
  • 视频讲解:多层感知机MLP与卷积神经网络CNN在服装图像识别中的应用
  • 单片机异常复位
  • 专题:2025母婴行业洞察报告|附60+份报告PDF汇总下载
  • cad.net 选择集搞坏CAD的问题
  • AGC011 题解
  • colab unsloth 安装出现错误【可行】
  • 视频讲解:ARIMA-LSTM注意力融合模型跨行业股价预测应用
  • 32_1 结构体的学习与练习
  • pytorch+torchvision+python版本对应关系 版本对照表
  • Siderophile:检测Rust代码库中的不安全代码
  • 增量可满足性问题解决方案验证方法
  • 云平台运维工具 —— 阿里云原生工具 - 详解
  • 麒麟系统中离线安装java环境
  • P2822 [NOIP 2016 提高组] 组合数问题
  • 行列式 / 矩阵树定理 笔记