神奇的線性篩法

2021-07-12 06:54:58 字數 638 閱讀 4872

所謂線性篩法,顧名思義它是線性的篩素數的方法,所以是o(

n)的

int getprime(int lim)

}}

這是普通篩法

int getprime(int lim)

}}

這是線性篩法

某神犇已經測過,我直接上結果

可以發現,普通篩法將每個質數的倍數都篩掉,每個合數都被篩了它的質因子次

that』s too slow!!

我們再看線性篩法

篩的時候,把當前到的這乙個數(不論質數合數)乘上篩出來的每個質數篩一遍

關鍵是這一句

if (!(i%prime[j])) break;
這樣的情況,意思是pr

ime[

j]這乙個質數在pr

ime[

j]×i

中指數已經大於等於2了。

並且,這個合數的任何倍數以後一定會被pr

ime[

j]篩到

所以後面的都不必篩了。

這樣,每個合數都只被它的最小的質因子篩過一遍,所以是線性的複雜度。

線性篩法(尤拉篩法)

嗯在剛剛 沒錯就是在幾分鐘之前 我學會了線性篩法 實在是乙個很好的篩法 正常的篩法,都會對乙個數篩多次 但是尤拉篩法不會 尤拉篩法是用它的最大因數去篩 別跟我說最小質因數,那個很難讓人理解 雖然最小質因數和最大因數是一樣的 我們假設乙個數k,它是t的最大因數 容易知道t是不唯一的 那我們要乘以乙個質...

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...

線性篩法(尤拉篩)

從前有乙個素數篩法叫埃拉託斯特尼篩法,它的思想很簡單,把1 n以內素數的整數倍的數字劃掉,留下的就全是素數,但是它的複雜度是o nlglgn 對於大量不友好資料會跪,於是線性曬登場了。include using namespace std int prime 1100000 primesize,ph...