埃氏筛法适用于批量生成指定范围内全部质数,而非单点素性判断;其核心是初始化、筛至√n、从i²开始标记;优化包括跳过偶数和用加法代替乘法。

埃氏筛法本身不是“秒级提取单个高质素质数”的工具,而是一次性批量生成指定范围内全部质数的高效算法。它不适用于实时查某个大数是否为质数,但能在毫秒级完成百万量级范围内的质数预筛——这才是它真正的实战价值。
明确适用边界:筛法 ≠ 单点判断
如果你的目标是“对随机输入的 10 位数快速判素”,埃氏筛不适用,应改用 Miller-Rabin 等概率或确定性素性测试。
但如果你的任务是:
✓ 找出 1~10⁶ 内所有质数(用于后续查表)
✓ 统计某区间内质数个数(如蓝桥杯填空题)
✓ 为欧拉函数、约数和等数论问题预处理质因数
——那埃氏筛就是最直接、最稳、最容易手写不出错的选择。
核心循环逻辑:三步不可省略
以 C++/Python 通用思路为例,关键不在“多快”,而在“不漏、不重、不越界”:
- 初始化布尔数组 is_prime[0..n]:下标即数字,初始 is_prime[0]=is_prime[1]=false,其余全 true
- 外层循环 i 从 2 到 √n:只需筛到 √n,因为大于 √n 的合数必已被更小的质因子筛过(如 91=7×13,7
- 内层标记从 i² 开始:i×2, i×3…i×(i−1) 已被更小质数(如 2、3…i−1)筛过;i² 是第一个可能未被筛过的 i 倍数。例如 i=5 时,10、15 已被 2 和 3 标记,25 是首个需由 5 处理的数
实战提速关键:两个真实有效的优化
不是加多线程,也不是换语言,而是两处朴素但效果显著的改动:
- 跳过偶数(除 2 外):初始化时 is_prime[i] = (i==2) || (i%2==1),外层循环从 i=3 开始,步长为 2。内存减半,速度接近翻倍
-
内层循环用加法代替乘法:不写
for(j = i*i; j ,而用 <code>j = i*i; while(j ——避免每次计算 i*j,CPU 更友好,尤其在大 n 下差异明显
10⁷ 范围实测参考(主流笔记本)
使用优化后 C++ 实现:
• 预筛 1~10⁷:约 18–22ms(含内存分配与遍历输出)
• 存储全部质数(共 664579 个)仅需一个 vector
• 后续任意查询 x ∈ [2,10⁷] 是否为质数:O(1) 查表,无延迟
这正是“海量高质素质数”的真正含义:不是单个“高质”,而是整个集合的高质量、高密度、高可用性——筛完即得,查即响应。











