‹ 返回工坊合集
数学游戏工坊 · 素数篇 | 九章格数学 PhiloMath

筛中寻质

埃拉托斯特尼筛法:从 2 起排数阵,一圈一划,让合数逐个落下,让素数浮出来。
当前范围 N
100
素数个数 π(N)
25
需要筛的次数
4
划去 / 闪现提醒
74 / 39

筛法演示 · 一步一步看合数怎么被抖落

数阵从 2 起排:第一行 2–10(1 的位置留空),第二行 11–20,第三行 21–30……每一轮先圈出该轮质数,再逐个划去它的倍数;遇到「是本轮质数的倍数、却已被更早的质数划去」的数,它会闪现三次提醒您这个数被重复划到了。相邻两轮的划线用不同颜色区分。
① 选择范围(只提供整十)
② 演示控制
选择范围后点「开始演示」。
1 的位置留空 圈出的质数(每轮领头) 被划去的合数(线色=第几次筛) 已划去又遇到 → 闪现三次 收尾圈出:剩下的全是素数
筛完了!共筛 4 次

亲手筛 · 轮到您当筛工

两步走:① 点出此刻最小的「既没被划去、也没被圈出」的数——它就是本轮的质数;② 点出它的所有倍数(从 2p 起)把它划去。点错了会闪红提醒;点到「已被更早质数划去」的数,它会闪现三次,然后告诉您这是谁划的。
选择范围(只提供整十)
第 0 次筛 本轮到点倍数:— 失误 0 次
选好范围,点「开始亲手筛」。
您筛完了!共筛 4 次

历史 · 筛子的主人

一个量过地球周长的人,也留下了一把筛子。

埃拉托斯特尼(Eratosthenes,约公元前 276 — 前 194)生于昔兰尼(今利比亚境内),约公元前 245 年前后到亚历山大,后来做了亚历山大图书馆的馆长,还做过托勒密三世之子的老师。他一生横跨数学、天文、地理、年代学与诗学;晚年失明,据说绝食而终。

他最有名的功业是量地球:夏至正午,赛伊尼(今阿斯旺)的深井井底不见日影,而同一时刻亚历山大的日影偏离铅垂约 1/50 圆周(约 7°12′)。既然两地近乎在同一子午线上,地球周长就约是两地距离的 50 倍——他给出的结果是 250 000 斯塔德。此外他还测过黄赤交角、编过星表,并主张每四年置一闰日。

筛法的希腊语名字是 κόσκινον Ἐρατοσθένους——「埃拉托斯特尼的筛子」。他的原著已经失传,这把筛子是由尼科马霍斯(Nicomachus,约公元 60–120)在《算术引论》里记载下来的。

它是怎么做的?先把 1 到 N 按顺序写下来;第一步划掉 1(它既不是质数也不是合数);此后第一个没被划掉的数是 2,把它留下,然后把从它往后每一个第 2 个数都划掉;再下一个没被划掉的数是 3,留下它,划掉此后每一个第 3 个数……有些数会被划掉不止一次(例如 6、12),因为它们同时是 2 和 3 的倍数。当第一个没被划掉的数超过 √N 时就可以收手了——此时留下的数,全都是不超过 N 的质数。

比筛法更早的一条结论,是质数有无穷多个:欧几里得《几何原本》第九卷命题 20 用反证法说明——若质数只有 p₁…pₙ 这有限个,那么 p₁p₂…pₙ + 1 除以其中任何一个都余 1,它既不能被这些质数整除,就必然含有新的质因子,矛盾。所以「筛」永远筛不完,质数也永远筛不尽。

需要说明的是,质数理论源自古希腊;《九章算术》长于算法与应用(方田、粟米、衰分、商功、均输、盈不足、方程、勾股),并没有质数专题——这也是数学在不同文明里各走一路的例证。

这把两千多年前的「手工筛」,直到电子计算机出现之前,一直是找质数的主要办法;在计算机时代,它演化出位筛、分段筛、线性筛,至今仍是数论与密码学里筛掉大批合数的第一道工序。

埃拉托斯特尼小传要点

年代事件
约前 276生于昔兰尼(今利比亚)
约前 245赴亚历山大,后任亚历山大图书馆馆长
约前 240以日影法测出地球周长约 250 000 斯塔德
—测黄赤交角、编星表、主张四年一闰
约前 194卒于亚历山大
后世筛法经尼科马霍斯《算术引论》记载而传世
参考:MacTutor History of Mathematics(Eratosthenes 条目);Britannica(Eratosthenes);Thomas Heath,《A History of Greek Mathematics》Vol.2;欧几里得《几何原本》第九卷命题 20。

算法 · 为什么这样筛一定对

五步规则 + 一个关键不等式 + 复杂度,最后是真实跑出来的数据表。
筛法五步

① 写下 2 到 N 的全部整数(本工坊把 1 的位置留空:1 既不是质数也不是合数)。
② 取最小的未被划去的数 p,它就是下一个质数,圈出来。
③ 划去 p 的所有倍数:2p、3p、4p……(p 自己留下)。
④ 重复 ②③,直到某个未划去的数 p 满足 p² > N。
⑤ 剩下的数全部是质数——筛完。

为什么筛到 √N 就够了

设 n ≤ N 是合数,则 n = a·b 且 1 < a ≤ b < n,于是 a ≤ √n ≤ √N。把 a 再分解成质数之积,就得到 a 的某个质因子 q ≤ √N,且 q 整除 n。也就是说:任何合数都有一个不超过 √N 的质因子,它一定会在某一轮里被划掉。反之,若某个数在全部「≤ √N 的质数」轮次结束后仍未被划去,它就不可能是合数——只能是质数。

所以 N = 100 只需筛 2、3、5、7 四次(因为 11² = 121 > 100);N = 200 需要筛 2、3、5、7、11、13 六次(17² = 289 > 200)。这正是页面上「筛的次数」的来历。

复杂度与四种常见优化

朴素筛的划去次数是 Σp ≤ √N N/p ≈ N·ln ln N,即 O(N log log N)(Mertens 定理),几乎只比「读一遍数」贵一点,是极快的经典算法。常见优化:

① 从 p² 起划:2p、3p、…、(p−1)p 已经被更小的质数划过了,没必要重复。

② 只存奇数或用位筛(每个数只占 1 位),内存省到 1/64。

③ 分段筛:不一次开 N 个格子,按段处理,大 N 也能跑。

④ 线性筛(欧拉筛):保证每个合数只被它的最小质因子标记一次,做到 O(N)。

请注意:本工坊的演示页故意从 2p 起划(不做第 ① 条优化),这样才会出现「已经划掉的数又被划到」的现象——那正是您在页面上看到的闪现三次的提醒。第 ① 条优化之后,这种重复几乎就没有了(只剩 p² 与更小质数倍数重叠的少数情形)。

数据表(本页引擎现算,N = 10 到 200 整十)
Nπ(N) 质数个数筛的次数划去(首次)闪现提醒总步骤

注:「划去(首次)」是把每个合数第一次划掉的次数;「闪现提醒」是后续轮次再遇到它时的次数。两者相加就是全部划去动作。总步骤 = 圈出质数 + 划去 + 闪现 + 每轮收束 + 收尾。

从筛法到今天

要用 RSA 这类公钥密码,就得先找到很大的质数(几百位)。做法是:先随机取一个大奇数,用小质数筛把能一眼除尽的候选全排掉(这一步正是埃拉托斯特尼筛法的思路),再用 Miller–Rabin 等素性检验确认。也就是说,两千多年前的这把筛子,今天依然在密码学的第一道工序上工作。

质数到底有多密?质数定理说 π(x) 约等于 x / ln x(高斯、勒让德早年猜想,1896 年由 Hadamard 与 de la Vallée Poussin 证明)。它不是精确公式:π(1000) = 168,而 1000 / ln 1000 ≈ 145——「约」字很要紧,这也正是数论后来两百年的主战场。