🧑‍🏫 阿易老师 出品

质数筛 · 学筛法

埃氏筛 | 欧拉筛 | 质因数分解 | n! 阶乘分解(勒让德公式)——一步一步看"筛子"怎么把质数捞出来!

📖 埃拉托斯特尼筛法

质数的倍数一定不是质数!所以从 2 开始,把每个质数的倍数都标记成合数,最后没被标记的数就都是质数。

数字格 绿色 = 筛出来的质数,灰色 = 合数
质数 合数 正在看
控制台
速度
erato.cppC++
📖 欧拉筛(线性筛)

埃氏筛有个小缺点:一个合数可能被标记好多次,比如 12 会被 2 和 3 各标记一次。欧拉筛规定:每个合数只被它的最小质因数筛掉一次,每个格子右上角的小标签就是"被谁筛掉的"!

数字格 右上角小标签 = 用哪个质数筛掉的它
质数 合数(被筛掉)
控制台
速度
euler.cppC++
📖 质因数分解(唯一分解定理)

任何合数都能唯一分解成质因数的乘积,比如 90 = 2 × 3 × 3 × 5。方法:先用埃氏筛筛出质数表,再从小到大试除,一边除一边记次数。

分解过程
当前 n(被不断除小)
90
90 = 2^0 × 3^0 × 5^0
质数表 黄色 = 正在试除
控制台
速度
分解结果
90 = 2^1 × 3^2 × 5^1
factor.cppC++
📖 n! 的质因数分解(勒让德公式)

n! 里质数 p 一共出现多少次?数一数:1~n 里 p 的倍数有 n/p 个,每个至少贡献 1 个 p;p² 的倍数再多贡献 1 个,有 n/p² 个……所以 p 的个数 = n/p + n/p² + n/p³ + …(加到哪一项变成 0 为止)。这就是勒让德公式!

质数表 黄色 = 正在统计的质数
勒让德公式算一算 每步高亮的是当前累加的项
笨办法:把 1~n 每个数都分解一遍再统计(对比一下)
控制台
速度
n! 分解结果
13! = 2^10 × 3^5 × 5^2 × 7^1 × 11^1 × 13^1
factorial.cppC++