通俗易懂的埃氏篩時間復雜度分析


前言

網上查閱了資料,發現對於埃氏篩時間復雜度的分析都很高深,大多運用了 Mertens Theorem https://en.wikipedia.org/wiki/Mertens'_theorems
然而本人水平太菜啦,根本看不懂。經過我一下午的摸索,自己 yy 出了一個較為通俗易懂的做法,如果您發現有紕漏,煩請在評論區中指出,謝謝!

埃氏篩是什么?

埃拉托斯特尼篩法,簡稱埃氏篩,是一種在 \(O(N\ln\ln N)\) 時間復雜度中篩出 \(1\sim N\) 之間所有素數的算法。
其算法過程就是,從 \(2\)\(N\) 枚舉每個數,如果當前數未被剔除,則其為素數,並將它的倍數全部剔除掉。循環結束之后,所有沒被這種操作剔除的數都是素數。代碼如下:

bool vis[N];
void Eratosthenes() {
    memset(vis, false, sizeof(vis));
    for (int i = 2; i <= N; i++) {
        if (vis[i]) continue; // 合數就下一個
        for (int j = i; j <= N / i; j++) vis[i * j] = true;
    }
}

注意到這里有個小優化,每次倍數是從 \(i\) 開始枚舉,因為小於 \(i\) 的倍數其實在之前的掃描中已經被標記過了。
這個算法時間復雜度為什么是 \(O(N\ln\ln N)\) 呢?正文開始:

埃氏篩時間復雜度分析

約定:為了方便表述,規定本文之后出現的所有 \(p\) 都是素數
我們的目標是求出:

\[\sum_{p\le \sqrt N} \left(\frac Np -p\right) \]

上面的和式分為兩部分,\(\sum\limits_{p\le \sqrt N} \dfrac{N}{p}\)\(\sum\limits_{p\le \sqrt N}p\)

前置引理

我們之后所有的推導都基於素數定理,其表述如下:設 \(\pi (x)\) 表示不大於 \(x\) 的數中有多少個素數,則 \(\pi(x) \sim \dfrac{x}{\ln x}\)
則我們知道 \(x\) 為素數的概率為 \(\pi(x) - \pi(x-1) \approx \dfrac 1{\ln x}\)(這里實際上是期望,但由於只有一個數 \(x\),因此期望等於概率),這樣,只要乘上概率,我們就能將對 \(p\) 的求和轉化為連續的 \(x\) 的求和了!

有了這個引理,我們開始推導!

先算第一部分

\[\sum_{p\le \sqrt N} \frac Np =\sum_{x=2}^{\sqrt N} \frac{N}{x\ln x}=N\sum_{x=2}^{\sqrt{N}} \frac{1}{x\ln x} \]

接下來就要求這個含有 \(x\) 的和式,根據套路,我們可以使用積分近似

\[\sum_{x=2}^{\sqrt N} \frac1{x\ln x} \approx \int_{2}^ \sqrt N \frac{1}{x\ln x} \mathrm{d}x \]

這是個經典的換元法解決的積分式。不妨設 \(u = \ln x\),兩邊求導得 \(\mathrm{d} u = \dfrac 1x \mathrm{d} x\),發現這一項正好出現在積分式中,直接代入:

\[\int \frac 1{x\ln x} \mathrm{d} x=\int \frac 1u \mathrm{d}u= \ln u + \C=\ln\ln x+ \C \]

於是,將這個定積分代回到之前的式子中,第一部分的近似值為 \(O(N\ln\ln \sqrt N) =O(N\ln\ln N)\)

再算第二部分

經過我的嘗試,我使用算兩次方法來解決這個問題。

第一種計算方式與第一部分的相同:

\[\sum_{p\le \sqrt N} p = \sum_{x=2}^{\sqrt{N}} \frac x {\ln x} \]

第二種計算方式是將每個 \(p\) 拆分成 \(\sum_x [1\le x\le p]\) 的形式,計算貢獻(類似阿貝爾變換):

\[\begin{aligned} \sum_{p\le \sqrt N}p &= \sum_{x=0}^{\sqrt N}\left(\pi(\sqrt N) - \pi(x)\right)= (\sqrt N + 1)\times \pi (\sqrt N) - \sum_{x=2}^{\sqrt{N}}\pi(x) \\&= (\sqrt N + 1)\times \frac {2\sqrt N}{\ln N} -\sum_{x=2}^{\sqrt N} \frac x{\ln x} \end{aligned} \]

兩種計算方法聯立,可以解得第二部分的近似值 \(O(\dfrac N {\ln N})\)

\[\sum_{x = 2}^{\sqrt N} \frac x {\ln x} \approx \frac{N}{\ln N} \]

合並兩部分

所以埃氏篩法的總復雜度為第一部分減去第二部分:

\[O(N\ln\ln N-\frac N{\ln N}) = O(N\ln\ln N) \]

得證!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM