线性筛法 (Linear Sieve) 模板详解

线性筛法 (Linear Sieve) 模板详解
靖线性筛法 (Linear Sieve) 模板详解
1. 简介
线性筛法(也称欧拉筛法)是一种高效的素数筛选算法,它不仅可以在线性时间内筛出素数,还能同时得到每个数的最小质因子。
主要特点:
- 线性时间复杂度 O(n)
- 可以获得最小质因子
- 避免重复筛选
- 可以扩展求解积性函数
2. 实现原理
2.1 基本概念
素数:
- 只能被1和自身整除的大于1的整数
- 2是最小的素数
最小质因子:
- 一个合数的最小素数因子
- 对素数来说,最小质因子是其自身
2.2 核心策略
筛选过程:
- 用已知的素数去筛选更大的数
- 每个合数只被其最小质因子筛掉一次
优化方法:
- 维护最小质因子数组
- 按照特定顺序筛选,避免重复
3. 模板代码
1 | std::vector<int> minp, primes; |
4. 函数说明
4.1 参数说明
1 | void sieve(int n) |
n
: 要筛选的范围上限minp
: 存储每个数的最小质因子primes
: 存储筛选出的所有素数
4.2 返回值
- 函数无返回值
- 通过全局变量 minp 和 primes 返回结果
5. 时间复杂度分析
时间复杂度:O(n)
- 每个合数只被其最小质因子筛掉一次
- 内层循环的总执行次数是线性的
空间复杂度:O(n)
- minp 数组需要 O(n) 空间
- primes 数组需要 O(n/ln(n)) 空间
6. 应用场景
- 生成素数表
- 判断素数
- 质因数分解
- 求解积性函数
- 数论相关问题
7. 使用示例
7.1 生成素数表
1 | sieve(100); |
7.2 判断素数
1 | sieve(n); |
7.3 质因数分解
1 | vector<pair<int, int>> factorize(int x) { |
8. 注意事项
内存限制
- 注意数组大小不要超过内存限制
- 对于大范围可以分段筛选
初始化
- 使用前需要调用 sieve 函数
- 确保范围 n 足够大
特殊情况
- 注意处理 n = 1 的情况
- 考虑数组访问边界
9. 总结
线性筛法是一个高效的素数筛选算法,它不仅可以在线性时间内找出所有素数,还能得到每个数的最小质因子。这个算法在很多数论问题中都有重要应用,特别是在需要进行大量质因数分解的场景下。通过合理的实现和优化,可以在实际应用中获得很好的性能。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果