素數判斷及篩法

2021-09-11 06:17:08 字數 1323 閱讀 3413

素數(prime number)又稱質數,有無限個。

素數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。

問法1:給定乙個數n,判斷n是不是素數

一、暴力列舉

列舉2~n-1分別當做除數,判斷是否能整除,如果某個數能把n整除,那麼就說明n不是素數,如果所有都不能整除,那麼n就是素數。

注:n=1或n=2時需要特判

詳見**:

bool

work

(int n)

return

true

;}

然而這樣會很慢…

二、優化過的暴力演算法

由於n至少會有乙個約數在sqrt(n)中,所以我們可以直接列舉從2~sqrt(n),這樣便會快不少。

詳見**:

bool

work

(int n)

return

true

;}

以上所說的演算法只是用來判斷單個素數的,但是若是要求1~n之間的素數該怎麼辦呢?

還是暴力?

不!要用到乙個名叫「篩法」的東東

三、埃氏篩法

由於我們知道,2的任何倍數都不可能是素數,3的任何倍數不可能是素數,5的任何倍數不可能是素數…

所以我們可以把素數的倍數全部篩掉。

詳見**:

/*

vis用來判斷有沒有被篩掉,

prime用來儲存素數

cnt代表素數總數

*/for

(int i=

2;i<=n;i++

)}

但是以12為例

12是2的倍數,被篩

12是3的倍數,被篩++

所以事實證明會有一些數被篩好多次

那要怎麼做到每個數隻篩一次的線性複雜度呢?

四、線性篩

線性篩,又稱尤拉篩

尤拉篩法的基本思想 :在埃氏篩法的基礎上,讓每個合數只被它的最小質因子篩選一次,以達到不重複的目的。

/*

vis用來判斷有沒有被篩掉,

prime用來儲存素數

cnt代表素數總數

*/for

(int i=

2;i<=n;i++

)}

以上就是素數判斷及篩法的總結,謝謝**

參考文獻資料:

最後打個小廣告:

hulean.tk

素數判斷及篩法

單個素數判斷 素數判斷 小資料 int prime int n miller rabin 大素數判定 單個數字n複雜度15 log n int mr 30 此陣列為測試用的a,這12個可測所有的long long int lli miller rabin lli n if x 1 return fa...

數論 多種素數判斷法及素數篩法

水了一篇啊.眾所周知,大於等於 2 的僅含有 1 和自身這兩個因子的正整數被稱作素數 故只要判斷在 2,n 1 範圍內是否存在其它因子,就可以判斷 n 是否為素數了 無腦判斷法直接從 2 for到 n 1 稍微優化下可以縮減到 2,frac n 2 但這個方法時間複雜度為 o n 可以發現,如果某個...

素數判斷(篩法)

最簡單寫法 int isprime int n for int i 2 i n i return1 初步優化 乙個數的因數是成對出現的,其中乙個因數在開方後的前面乙個在開方後的後面,所以只需判斷它前面的數就可以了,如果前面都沒有,那麼它後面更不會有.這樣就可以減少迴圈次數.int isprime i...