素數線性篩

2022-10-10 23:03:13 字數 1498 閱讀 1233

1.素數線性篩核心

結論:每乙個數都用它的最大素因子將這個合數篩掉。 (27用9篩 15用5篩)

理解:合數一定有因子,既然是幾個數,就一定有最大的乙個。最大因子是唯一的,所以合數只會被它自己唯一的最大因子篩掉一次。  

2.如何通過乙個數篩去以該數為最大因子的合數

結論1:設a是b的最大因子,則b必然等於a乘以乙個比a小的素數。(注:對於任意a,b不唯一,比如以15為最大因子的有30和45) 

理解1:首先,這個數要比a小,若是比a大的數,則最大因子就是不是a了

其次,這個數必須是素數,若其為合數, 設其為c(b = a * c),因為由於c是合數,那麼c又可以分解為若干素數相乘,c=c1*c2*c3...*an,那麼c1*a也是b的因子,因而最大因子不是a了。

那麼,比a小地素數還是有很多,是否需要乙個乙個去乘呢? 答案否定的。

結論2:設b=a*c,其中c是素數且c小於等於a的最小素因子,那麼b的最大因數就是a。(乘上的數要小於等於a的最小素因數)

理解2:設a可以表示為素數成績,即a=a1*a2*a3*...*1,其中a1為最小素因子(若a本身為素數則a1=a),

設另一素數為c,得到的合數b=a*c,假設c大於a的最小素因子a1,那麼b=a1*a2*a3...*an*c,由於c大於a1,那麼 c*a2*a3*...*an 大於 a1*a2*a3*...*an(即a),那麼b的最大素數就不是a了。

example:

假設a為9,那麼a的最小素因子為3,小於等於3的素數有2,3,因此以9為最大素因子的合數有 9*2=18, 9*3=27

假設a為15,那麼a的最小素因子為3,小於等於3的素數有2,3,因此以15為最大素因子的合數有 15*2=30, 15*3=45

假設a為21,那麼a的最小素因子為3,小於等於3的素數有2,3,因此用21可以篩去21*2=42, 21*3=63(雖然63=9*7,但63是用21篩去的而不是9,因為9不是63的最大因子而21才是)

3.結論

最後我們就可以得出結論:對於每乙個數a,乘上小於等於a的最小素因數的素數,就得到以a為最大因數的合數。設有乙個數n,只要將所有以比n小的數為最大因數的合數篩去,那麼比n小的數里剩下的就只有素數了。

/*

素數線性篩

*/#include

#include

const

int maxn = 1000

;bool flag[maxn+1

];int prime[maxn + 1

];int

prinum;

intmain()

for (int j = 0; j < prinum && prime[j] * i <= maxn; ++j)}}

int kase = 0

;

for (int i = 2; i < maxn; ++i)}}

for (int i = 0; i < prinum; ++i)

}return0;

}

view code

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

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

素數線性篩

ps 證明 神牛部落格。include include using namespace std const int n 100100 int v n p n n,m,tot int main 首先,先明確乙個條件,任何合數都能表示成一系列素數的積。不管 i 是否是素數,都會執行到 關鍵處1 如果 i...

線性篩素數

如題,給定乙個範圍n,你需要處理m個某數字是否為質數的詢問 每個數字均在範圍1 n內 輸入格式 第一行包含兩個正整數n m,分別表示查詢的範圍和查詢的個數。接下來m行每行包含乙個不小於1且不大於n的整數,即詢問該數是否為質數。輸出格式 輸出包含m行,每行為yes或no,即依次為每乙個詢問的結果。in...