MathLabs

算术与数论

筛法

估计一个区间内的整数在去除小质数的倍数后还剩下多少个的技术。

直观逐个质数筛去其倍数

设想一个从2到100的数字网格。划去除2本身之外的所有2的倍数。再划去除3本身之外的所有3的倍数。再划去除5本身之外的所有5的倍数。对每个存活的数持续这样做,最后未被划掉的正好就是质数。这个古老的过滤过程——"筛"——不仅仅是列出质数的方法;筛法把同样的想法变成精确的计数工具,即使逐个列举在计算上完全不可行,也能估计一个区间内有多少整数能在给定过滤下存活。

带 n 条柱的黎曼和组件,用作筛法运行计数 $S(A,\mathcal{P},z)$ 随应用更多质数过滤器而缩小方式的视觉类比;这并非真实的筛法计算,因为该组件的预设内容是数值积分演示,而非因子过滤器。
1..601..60 上的埃拉托斯特尼筛法:拖动 nn 筛去素数 ≤n\le n 的倍数(红色),留下的绿色格子即为素数。

中学埃拉托斯特尼筛法

定义: 埃拉托斯特尼筛法

要列出所有不超过 NN 的质数:写下 2,3,…,N2,3,\ldots,N;反复取最小未标记数 pp,宣布其为质数,并将 pp 的所有倍数(从 p2p^2 开始)标记为合数;当 p2>Np^2 > N 时停止。

P(z)=∏p<zpP(z) = \prod_{p < z} p

为什么在 p2>Np^2>N 处停止?任何合数 n≤Nn\le N 都有一个 ≤N\le\sqrt N 的质因数(否则其最小的两个质因数相乘就会超过 NN),因此一旦直到 N\sqrt N 的所有质数都完成标记,剩下未被标记的数确实没有能暴露它的因数——它必是质数。所有质数 p<zp<z 上的乘积 P(z)=∏p<zpP(z) = \prod_{p < z} p,正是筛法所滤除的"小"质数集合;筛法理论称之为筛的水平。

逐步筛选 [2, 30]
应用的过滤器新标记的合数剩余未标记的个数
p = 2(从4开始)4,6,8,...,30(14个)29 − 14 = 15
p = 3(从9开始)9,15,21,27(新增4个)15 − 4 = 11
p = 5(从25开始)25(新增1个)11 − 1 = 10
停止:7² = 49 > 30—10个质数:2,3,5,7,11,13,17,19,23,29

大学两个定理:为什么筛法有效,以及如何用它计数

整数 n≥2n \ge 2 是质数当且仅当它不能被任何满足 p≤np \le \sqrt n 的质数整除。

为什么成立?

这个等价关系正是使筛法能够提前停止的原因:一旦直到 N\sqrt N 的所有质数都划去了它们的倍数,就再没有任何证据能证明剩下的数是合数,因此再检验(或划去)更大质数的倍数被证明是白费功夫。

证明

(⇐\Leftarrow)设 nn 没有 ≤n\le\sqrt n 的质因数。若 nn 是合数,记 n=abn=ab,1<a≤b<n1<a\le b<n。则 a≤na\le\sqrt n(否则 a>na>\sqrt n 且 b≥a>nb\ge a>\sqrt n 将迫使 ab>nab>n,矛盾),而 aa 的最小质因数 pp 满足 p≤a≤np\le a\le\sqrt n,故 pp 是 nn 的一个 ≤n\le\sqrt n 的质因数——与假设矛盾。因此 nn 不存在这样的分解,故 nn 是质数。

(⇒\Rightarrow)若 nn 是质数,其正因数只有 11 和 nn;没有任何质数 p<np<n 整除它,特别地满足 p≤np\le\sqrt n 的质数也不整除。

两者合起来说明这两个条件等价,这正是筛法中使用的终止判据:处理完直到 N\sqrt N 的所有质数后,[2,N][2,N] 中仍未被标记的每个数都满足右边条件,因而都是质数。

设 A={1,2,…,x}A=\{1,2,\ldots,x\},P\mathcal P 为质数 p<zp<z 的集合,则与 P(z)=∏p<zpP(z)=\prod_{p<z}p 互素的 a∈Aa \in A 个数为 S(A,P,z)=∑d∣P(z)μ(d)⌊xd⌋\displaystyle S(A,\mathcal P,z)=\sum_{d \mid P(z)} \mu(d)\Big\lfloor \dfrac{x}{d} \Big\rfloor(μ\mu 为莫比乌斯函数);取 z=x+1z=\sqrt x+1 得 π(x)−π(x)+1=S(A,P,x)=∑d∣P(x)μ(d) ⌊x/d⌋\pi(x)-\pi(\sqrt{x})+1 = S(A,\mathcal{P},\sqrt{x}) = \sum_{d \mid P(\sqrt{x})} \mu(d)\, \lfloor x/d \rfloor。

为什么成立?

这是"划去倍数"这一操作精确的定量版本:它不再在网格上物理标记,而是直接用容斥原理,根据哪些小质数整除它们来计数幸存者。它是所有用于攻克孪生质数与有界间隔的现代筛法(布伦筛、塞尔伯格筛、大筛法、GPY筛法)的鼻祖——归根结底,它们都是更巧妙地控制这个精确公式所产生的误差项的方法。

证明

任意整数 a∈Aa\in A 与 P(z)P(z) 互素当且仅当它不被任何满足 p<zp<z 的质数整除。对每个因子 d∣P(z)d\mid P(z)(这些质数某子集的无平方乘积),A={1,…,x}A=\{1,\ldots,x\} 中 dd 的倍数个数恰为 ⌊x/d⌋\lfloor x/d\rfloor。

对事件"p∣ap\mid a"(p<zp<z)用容斥原理:被 P\mathcal P 中至少一个质数整除的 a∈Aa\in A 个数为 ∑p<z⌊x/p⌋−∑p<q⌊x/(pq)⌋+∑p<q<r⌊x/(pqr)⌋−⋯\sum_{p<z}\lfloor x/p\rfloor - \sum_{p<q}\lfloor x/(pq)\rfloor + \sum_{p<q<r}\lfloor x/(pqr)\rfloor - \cdots,符号随相乘的质数个数交替。每个这样的交替符号恰好就是对应无平方 d∣P(z)d\mid P(z) 的莫比乌斯函数 μ(d)\mu(d):μ(1)=1\mu(1)=1,dd 为 kk 个不同质数之积时 μ(d)=(−1)k\mu(d)=(-1)^k。

因此被 P\mathcal P 中至少一个质数整除的个数为 −∑d∣P(z), d>1μ(d)⌊x/d⌋-\sum_{d\mid P(z),\,d>1}\mu(d)\lfloor x/d\rfloor。用 ∣A∣=⌊x⌋=x|A|=\lfloor x\rfloor=x(d=1d=1 项,μ(1)⌊x/1⌋=x\mu(1)\lfloor x/1\rfloor=x)减去它,即得与 P(z)P(z) 互素的个数:S(A,P,z)=x−∑d∣P(z),d>1μ(d)⌊x/d⌋=∑d∣P(z)μ(d)⌊x/d⌋S(A,\mathcal P,z)=x-\sum_{d\mid P(z),d>1}\mu(d)\lfloor x/d\rfloor=\sum_{d\mid P(z)}\mu(d)\lfloor x/d\rfloor。

最后,取 z=x+1z=\sqrt x+1,使 P\mathcal P 恰为 ≤x\le\sqrt x 的质数:任何与它们全部互素的 a∈[2,x]a\in[2,x] 要么是 11,要么是 >x>\sqrt x 的质数(由上面的定理,因为它没有 ≤x\le\sqrt x 的质因数),故 S(A,P,x+1)=1+(π(x)−π(x))S(A,\mathcal P,\sqrt x+1)=1+\big(\pi(x)-\pi(\sqrt x)\big),即得所述恒等式。

π(x)−π(x)+1=S(A,P,x)=∑d∣P(x)μ(d) ⌊x/d⌋\pi(x)-\pi(\sqrt{x})+1 = S(A,\mathcal{P},\sqrt{x}) = \sum_{d \mid P(\sqrt{x})} \mu(d)\, \lfloor x/d \rfloor

大学实际应用与典型例题

筛法同时驱动着实际计算与纯粹数学的深刻突破。在软件中,分段埃拉托斯特尼筛是大规模枚举质数的标准算法,而快速的小质数筛则是在RSA密钥生成中运行昂贵的素性检验(如米勒-拉宾检验)之前通用的第一道过滤——在微秒内筛掉约80%的随机奇数候选。在纯粹数学中,精细化的筛法(布伦筛、塞尔伯格筛、GPY筛、梅纳德-陶筛)则是所有关于质数间隔现代突破背后的引擎。

例题: 用勒让德公式计算30以内的质数个数

取 x=30x=30、z=6z=6(因 30≈5.48\sqrt{30}\approx 5.48,筛法质数为 2,3,52,3,5)应用勒让德公式,从头计算 π(30)\pi(30)。

解答

这里 P(6)=2⋅3⋅5=30P(6)=2\cdot3\cdot5=30,其 23=82^3=8 个无平方因子为 1,2,3,5,6,10,15,301,2,3,5,6,10,15,30。

逐个计算 μ(d)⌊30/d⌋\mu(d)\lfloor30/d\rfloor:+⌊30/1⌋=30+\lfloor30/1\rfloor=30;−⌊30/2⌋−⌊30/3⌋−⌊30/5⌋=−15−10−6=−31-\lfloor30/2\rfloor-\lfloor30/3\rfloor-\lfloor30/5\rfloor=-15-10-6=-31;+⌊30/6⌋+⌊30/10⌋+⌊30/15⌋=+5+3+2=+10+\lfloor30/6\rfloor+\lfloor30/10\rfloor+\lfloor30/15\rfloor=+5+3+2=+10;−⌊30/30⌋=−1-\lfloor30/30\rfloor=-1。

相加得 S(A,P,6)=30−31+10−1=8S(A,\mathcal P,6)=30-31+10-1=8。由勒让德恒等式 π(30)−π(30)+1=8\pi(30)-\pi(\sqrt{30})+1=8,且 π(30)=π(5)=3\pi(\sqrt{30})=\pi(5)=3(质数 2,3,52,3,5),故 π(30)=8+3−1=10\pi(30)=8+3-1=10——与上表所列的 1010 个质数一致。

例题: 小质数预筛在RSA密钥生成中能节省多少工作?

在对随机奇数候选运行昂贵的米勒-拉宾检验之前,RSA库会先检查它是否能被 3,5,7,11,133,5,7,11,13 整除。有多大比例的随机奇数能通过这5个质数的预筛?

解答

由中国剩余定理,模不同质数 3,5,7,11,133,5,7,11,13(以及已固定为奇数的 22)的剩余类在一个完整周期 2⋅3⋅5⋅7⋅11⋅13=30,0302\cdot3\cdot5\cdot7\cdot11\cdot13=30{,}030 上相互独立。

随机奇数不被 pp 整除的概率为 1−1/p1-1/p,因此通过全部五个过滤器的比例为 (1−1/3)(1−1/5)(1−1/7)(1−1/11)(1−1/13)=23⋅45⋅67⋅1011⋅1213=576015015=3841001≈38.4%(1-1/3)(1-1/5)(1-1/7)(1-1/11)(1-1/13)=\frac23\cdot\frac45\cdot\frac67\cdot\frac{10}{11}\cdot\frac{12}{13}=\frac{5760}{15015}=\frac{384}{1001}\approx38.4\%。

因此只需五次微小的余数检查——几个CPU周期——就能在调用昂贵的模幂检验之前筛掉超过 61%61\% 的奇合数候选;实际密码库会将这一预筛扩展到前几百个质数,几乎零成本地筛掉约80–90%的合数。

用埃拉托斯特尼筛法筛选 [2, 200] 时,需要划去其倍数的最大质数是哪一个?

莫比乌斯函数 μ(30) 的值是多少?

筛法理论中的"奇偶性障碍"是什么?

随机奇数中不能被3或5整除的比例是多少?

参考文献

  1. Alina Carmen Cojocaru, M. Ram Murty (2005). An Introduction to Sieve Methods and Their Applications
  2. Yitang Zhang (2014). Bounded gaps between primes · DOI:10.4007/annals.2014.179.3.7
  3. James Maynard (2015). Small gaps between primes · DOI:10.4007/annals.2015.181.1.7