~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~算法
本人今天才知道,線性篩有兩種啊!spa
一種是歐拉篩,還有一種埃氏篩。效率
平時老師都說線性篩。也不知道爲啥?總結
今天咱們來說一講這兩種神奇的判斷素數的算法。時間
作法:作法其實很簡單,首先將2到n範圍內的整數寫下來,其中2是最小的素數。將表中全部的2的倍數劃去,表中剩下的最小的數字就是3,他不能被更小的數整除,因此3是素數。再將表中全部的3的倍數劃去……以此類推,若是表中剩餘的最小的數是m,那麼m就是素數。而後將表中全部m的倍數劃去,像這樣反覆操做,就能依次枚舉n之內的素數,這樣的時間複雜度是O(nloglogn)。數字
例題:枚舉
給定兩個正整數a、b(a<b<=1012、b-a<=106),請問[a,b])內有多少個素數?
代碼:略。
歐拉篩:
首先,咱們知道當一個數爲素數的時候,它的倍數確定不是素數。因此咱們能夠從2開始經過乘積篩掉全部的合數。
將全部合數標記,保證不被重複篩除,時間複雜度爲O(n)。
這個,我猜應該是老師們常常說的線性篩(統稱)吧!
效率不錯。
例題:
同上(埃氏篩)。
其實這些篩,都是線性篩素數。