線性(尤拉)篩法篩素數表

2021-09-10 14:44:09 字數 1161 閱讀 7281

乙個合數可以表示成乙個素數和乙個其他數的乘積,即假設有合數a,那麼一定存在這樣的a = b * c,其中b和c

有乙個為素數,由此得到以下的方法,從2—maxn迴圈一遍,每次篩掉 i 與素數表每一項的乘積,最終剩下的就是素數。

#include

#include

using namespace std;

const

int maxn =

100;

bool isprime[maxn+1]

;int primetable[maxn+1]

, ptr;

void

mktable()

}int

main()

雖然上述方法可以達到篩出素數的目的,但是舉乙個簡單例子,12 = 2 * 6, 12 = 3 * 4,對於 i = 4, 12會被篩掉一次,對於 i = 6,12也會被篩掉一次,也就是說上面的方法存在重複判斷,對於maxn比較大的時候效率比較低。

線性篩法的原理可以解釋成這個樣子:

對於乙個合數a,一定存在這樣的表示 a = b * c;其中b或c為質數,不妨假設c為質數,則b存在兩張可能,質數或者合數,若b為合數,存在x, y(假設x為質數,y任意)使得 b = x * y; 那麼 a = (x * y) * c,即 a = x * (y * c)。顯然質數x比質數c要小,也就是乙個合數與乙個質數的乘積可以表示為乙個更大的合數與乙個更小的質數的乘積。當 i = 4時,4%2 = 0,也就是比2大的質數與4相乘都可以化成2 * 某個數

線性篩法比普通篩法多了乙個判斷

if

(i%primetable[j]==0

)break

;

完整**:

#include

#include

using namespace std;

const

int maxn =

100;

bool isprime[maxn+1]

;int primetable[maxn+1]

, ptr;

void

mktable()

}}intmain()

素數線性篩法(尤拉篩)

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

模板 線性篩素數 尤拉篩法

o n 處理出n以內所有素數 使用 合數 最大因數 除1和本身外 最小質因數 的原理來篩,每個數隻會被篩一次 對於每個數i,令它是某數的最大因數,然後從小到大地找 i的素數j,則i j是合數 直到找到某個j使得 i j 0 因為再往後的話,j i的某個因子,我們能交換j 和i的這個因子,所以i不是i...

線性篩素數(尤拉篩)

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