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

2021-10-05 03:09:40 字數 778 閱讀 2984

任何合數都能表示成一系列素數的積。

線性素數篩的主要思想是每個合數必有乙個最小素因子,每個合數僅被它的最小素因子篩去正好一次,所以為線性時間。

比如說 12 只能被 2 篩掉,12 = 2 * 6,不能被3篩掉,12 = 3 * 4

**中體現在:

if

(i%prime[j]==0

)break

;

prime陣列中的素數是遞增的,當 i 能整除 prime[j],因為

i*prime[j+1] = prime[j] * k * prime[j+1]

所以 i*prime[j+1] 這個合數肯定被 prime[j] 乘以某個數篩掉,接下去的素數同理。因此不用篩下去了。

在滿足i%prime[j]==0這個條件之前以及第一次滿足該條件,prime[j]必定是prime[j]*i的最小因子。

#include

#include

using

namespace std;

const

int maxn=

3000001

;int prime[maxn]

;//儲存素數

bool vis[maxn]

;//初始化

intmain()

}for

(int i=

0;i) cout<<<

' ';

return0;

}

素數線性篩法(尤拉篩)

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

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

乙個合數可以表示成乙個素數和乙個其他數的乘積,即假設有合數a,那麼一定存在這樣的a b c,其中b和c 有乙個為素數,由此得到以下的方法,從2 maxn迴圈一遍,每次篩掉 i 與素數表每一項的乘積,最終剩下的就是素數。include include using namespace std const...

模板 線性篩素數 尤拉篩法

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