首页 > 技术文章 > 埃拉托斯特尼筛法的时间复杂度的非正式证明

blogofddw 2021-03-25 22:29 原文

很多人都知道埃氏筛法的时间复杂度是\(O(n \lg\lg n)\),但同样有很多人不知道这个结果是怎么来的。我有一种非常非常不严谨,然而相当简单的方法,可以得到正确的结果。可惜不知道它是否仅仅是歪打正着。。。


定义\(\pi(n)\)为前\(n\)个自然数中素数的数量。关于\(\pi\)函数,数论中有个著名结果:

\[\lim_{n\to \infty}\frac{\pi(n)}{\frac{n}{\ln n}}=1 \]

所以我们在这里就非正式地令\(\pi(n)=\frac{n}{\ln n}\)了。
所以由微积分基本定理,左开右闭区间\((a,b]\)中的素数数量大概就是:

\[\begin{align} \pi(b)-\pi(a)&=\int_{a}^{b}\frac{\mathrm{d} }{\mathrm{d} x} \left ( \frac{x}{\ln x} \right )\mathrm{d} x \notag\\ &=\int_{a}^{b}\frac{\ln x - 1}{\ln^2 x} \mathrm{d} x \notag \end{align} \]

用素数\(x\)筛去\(x\)的倍数的消耗大约是\(\frac{n}{x}\)
假设素数是完全随机出现的,则整数\(x\)是素数的概率为:

\[\begin{align} P(x\text{ is prime})&=\pi(x)-\pi(x-1)\notag\\ &=\int_{x-1}^{x}\frac{\ln t - 1}{\ln^2 t} \mathrm{d} t \notag \end{align} \]

筛去\(x\)的期望代价是:

\[\begin{align} P(x\text{ is prime})\cdot \frac{n}{x}&=\frac{n}{x}\left(\pi(x)-\pi(x-1)\right)\notag\\ &=n\int_{x-1}^{x}\frac{\ln t - 1}{x\ln^2 t} \mathrm{d} t \notag\\ &\approx n\int_{x-1}^{x}\frac{\ln t - 1}{t\ln^2 t} \mathrm{d} t \notag\\ &= n\int_{x-1}^{x}\frac{\ln t - 1}{\ln^2 t} \mathrm{d} (\ln t) \notag \end{align} \]

所以筛去所有数的总代价为:

\[\begin{align} &\:\;\;\;\;\sum_{x=2}^{n}n\int_{x-1}^{x}\frac{\ln t - 1}{\ln^2 t} \mathrm{d} (\ln t)\notag\\ &=n\int_{1}^{n}\frac{\ln t - 1}{\ln^2 t} \mathrm{d} (\ln t)\notag\\ &=n\int_{e}^{\ln n}\frac{t - 1}{t^2} \mathrm{d} t\notag\\ &=n\left (\ln t+\frac{1}{t}\right )\Bigg|^{\ln n}_e\notag\\ &=O(n\lg \lg n)\notag \end{align} \]


\(Q.E.D.\)

推荐阅读