核心概述

埃拉托斯特尼筛(Sieve of Eratosthenes):在区间 [2..n] 线性空间内筛出全部质数,经典复杂度 O(n log log n),可配合位集降内存;超大区间可用分段筛。

原文引述

Description: Classic sieve to mark all primes up to n. Supports bitset memory optimization and segmented variant for large ranges. Time: O(n log log n); Memory: O(n) bits with bitset

展开阐述

  • 函数/接口(据实现)

    • sieve(n) → primes, isPrime:返回质数列表 primes 及布尔数组/位集 isPrime。
    • 可选:segmentedSieve(L, R) → 返回区间 [L, R] 内的质数(需预筛到 √R)。
    • 注:最小质因子 spf/线性筛属085-数论-快速筛的范畴。
  • 核心算法(标记合数)

    • 初始化:isPrime[0]=isPrime[1]=false,2..n 初设为 true;primes 为空。
    • 对 i from 2..⌊√n⌋:
      • 若 isPrime[i] 为 true,则从 j=i·i 开始步长 i 标记合数:for j=i*i; j≤n; j+=i: isPrime[j]=false。
    • 扫描 2..n,将 isPrime[i]==true 的 i 加入 primes。
    • 位集优化:用 bitset/压缩奇数(仅存奇数位)可将内存近乎减半。
  • 分段筛(大范围)

    • 先普通筛得到小质数表 P(到 √R)。
    • 在目标块 [L,R] 建局部标记数组,初值均为 true;对每个 p∈P:
      • 从 s = ceil(L/p)*p 开始,按步长 p 标记到 R(若 s==p 且 p≥L,则从 s+p 开始以避免将 p 自身标为合数)。
    • 块内未标记者即为质数;按块滚动可覆盖超大范围。
  • 输出语义

    • primes:升序的全部质数。
    • isPrime[i]:表示 i 是否为质数(若采用奇数压缩,仅对映射索引有效)。
  • 复杂度

    • 经典筛 O(n log log n);空间 O(n)(位集为 O(n) 位)。
    • 分段筛时间近似相当,空间降为 O(块大小)。
  • 使用与注意

    • 循环上界使用 ii ≤ n,需用 64 位防止 ii 溢出;或写 j=(long long)i*i。
    • 标记起点从 i*i 而非 2i,可避免重复标记(因 i<j 的较小质因子已处理)。
    • 分段筛需处理 L=1 的边界(1 非质数);以及 L==0/负值的规整。
    • 若需求分解/φ/μ 等,请参见085-数论-快速筛(维护 spf/phi/mu)与084-数论-因数分解

关联节点