C語言素數篩法

2022-05-22 20:09:07 字數 490 閱讀 2840

埃氏篩法(樸素篩法及其優化)與尤拉篩(線性篩法)略解

2018.08.09 oi學習oi演算法數論

在之前我們學過的最樸素的篩法就是埃氏篩法(埃拉託斯特尼篩法),它的複雜度是 \theta (n \log_2(n))θ(nlog2​(n))。其實這個樸素的篩法可以進行常數上的優化。還有一種更炫酷的篩法:尤拉篩,即線性篩法,時間複雜度為 \theta (n)θ(n)。

樸素篩法(埃氏篩法)

之前我們很早就接觸的篩法是這樣的:

for (int i=2;i<=n;i++)

for (int j=2;j<=n/i;j++) vis[i*j]=false;

另一種寫法是:

for (int i=2;i<=n;i++)

for (int j=i+i;j<=n;j+=i) vis[j]=false;

不得不說這個演算法的確特別直觀:把所有合數都篩掉。維基百科上還有個很形象的圖(不得不說維基百科真是個好地方):

來自

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

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

篩法求素數 線性篩法求素數

2021年更新版 篩法求素數 線性篩法求素數 要理解篩法求素數首先要知道乙個定理,整數唯一分解定理 任意大於等於2的正整數都有且只有一種方式寫出其質因子的乘積表示式。a p1p2p3p4 pn pi是素數且pi pj eg 2 2 4 22 12 223 36 2233 也就是說任意乙個合數都能分成...

Eratosthenes篩法(素數篩)

最一般的素數篩思想很簡單,對於不超過maxx的每個非負整數p,刪除2p,3p,4p,然後剩下的就是素數,複雜度o nlogn 因為對內層迴圈n 2 n 3 n n 小於 1 1 2 1 3 1 n ln n 1 其中 為尤拉常數 0.577218 應當注意,1不是素數哦 這樣已經不慢,但由於所有非素...