尤拉篩法(線性篩素數)

2021-10-24 18:48:41 字數 1071 閱讀 4432

以下內容**

#include

#include

using

namespace std;

intmain()

}printf

("%d\n"

,cnt)

;return0;

}

其中注釋為 「//關鍵!!!!」 的句子的解釋大概如下

首先,任何合數都能表示成多個素數的積。所以,任何的合數肯定有乙個最小質因子。我們通過這個最小質因子就可以判斷什麼時候不用繼續篩下去了。

​ 當i是prime[j]的整數倍時(i % prime[j] == 0),iprime[j+1]肯定被篩過,跳出迴圈。

​ 因為i可以看做prime[j]某個數, iprime[j+1]就可以看做 prime[j]某個數prime[j+1] 。而 prime[j] 必定小於 prime[j+1],

所以 iprime[j+1] 必定已經被 prime[j]某個數 篩掉,就不用再做了

這裡是關鍵,如果i是乙個合數(這當然是允許的)而且i mod prime[j] = 0。那麼跳出,因為iprime[ (- over -)j ]一定已經被篩去了,被乙個素因子比i小的數

其中 i * prime[ j + k ] (k >= 1) 已經被篩去,不用再做的解釋實際上是錯的,實際上不是已經被篩去,而是將被後面的數篩去。但整體思路中讓每個數都被其最小質因數篩的解釋是對的。

讓我們來看乙個栗子:假設2, 3, 4, 5, 6, … 12

請問12在什麼時候被篩去的呢? 按上述解釋以及程式計算,在i == 4時,質數表中已有2, 3,可以4 * 3 == 12. 後續 i == 6時, 質數表2, 3, 5,也可以 6 * 2 == 12 篩去12.

跟著程式算一次便知,i = = 4時只篩去了8,為何不篩去12,因為12的最小質因數為2,由4 mod 2 == 0也可以看出4不是最小質因數,與2配對的因數6將在後面篩去12,這樣才是用最小質因數去篩。

而線性的證明,只需由上述例子中看出每個被篩去的數都是唯一的由 最小質因數(其實也就是最小正因數,易證)配對的因數(相應的最大因數)篩去,每個數隻被篩去一次,故為o(n)。

尤拉篩法 線性篩

尋找素數是我們剛學迴圈的時候就會遇到的乙個問題,但我們第一時間想到的便是暴力查詢.判斷乙個素數的複雜的就是o n 通過迴圈中值判斷到根號n可以優化一些,不過複雜度也達不到預期.但在數論中,有更完美的方法,埃氏篩法o nlog logn 尤拉篩法o n 思想 從2開始,將每個素數的倍數都標記成合數,用...

線性篩素數(尤拉篩)

尤拉篩是o n 複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。埃篩的基本思想是 素數的倍數一定是合數。尤拉篩基本思想是 任何數與素數的乘積一定是合數 演算法概述 遍歷 2,n 的所有數i,內層迴圈遍歷已經找到的素數prime j 將i prime j 標記為合數...

素數線性篩法(尤拉篩)

之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...