ACM演算法 線性篩

2021-10-08 22:55:30 字數 513 閱讀 7415

應用:判斷是否為素數

第乙個想法:普通優化,對數字加根號遍歷。不夠優秀

第二個想法:如果我們知道乙個數是素數,那麼我們可以將這個素數的倍數篩去。我們從2開始,每次迴圈到乙個數,先判斷它是否被篩過,如果沒有,那麼它肯定是素數,就用它去篩它的倍數,否則就跳過。

上述的篩法稱為:

複雜度大約為nln(n) 這個演算法時間主要浪費在乙個數字會被重複篩去。

比如 6 = 2 * 3。它被2篩了一次, 被3又篩了一次。

為了解決這個問題,便出現了乙個快速的線性篩法,也稱為尤拉篩法。尤拉篩法沒有冗餘,不會重複篩除乙個數,所以「幾乎」是線性的,複雜度為o(n)。

尤拉篩法的核心思想:每個合數只會被自己的最小的質因數篩去。

比如:12只會被2篩去 21只會被3篩去。

演算法 線性篩質數

輸出從0 00到1000000 1000000 100000 0的所有質數。首先0 00和1 11不是質數,從2 22開始逐個判斷是否為質數。如果t tt為質數,那麼對於任意正整數k kk,k t k times t k t不是質數,因此可以將k t k times t k t篩去。如果t tt已經...

尤拉篩法 線性篩

尋找素數是我們剛學迴圈的時候就會遇到的乙個問題,但我們第一時間想到的便是暴力查詢.判斷乙個素數的複雜的就是o n 通過迴圈中值判斷到根號n可以優化一些,不過複雜度也達不到預期.但在數論中,有更完美的方法,埃氏篩法o nlog logn 尤拉篩法o n 思想 從2開始,將每個素數的倍數都標記成合數,用...

尤拉篩法(線性篩素數)

以下內容 include include using namespace std intmain printf d n cnt return0 其中注釋為 關鍵!的句子的解釋大概如下 首先,任何合數都能表示成多個素數的積。所以,任何的合數肯定有乙個最小質因子。我們通過這個最小質因子就可以判斷什麼時候...