Eratosthenes篩選法與尤拉篩選法

2021-07-04 14:20:41 字數 903 閱讀 4712

eratosthenes篩選法與尤拉篩選法

由於乙個合數總是可以分解成若干個質數的乘積,那麼如果把質數的倍數都去掉,那麼剩下的就是質數了.eratosthenes篩選法的思想特別簡單:對於不超過n的每個非負整數p,刪除2p,3p,4p,...,當處理完所有數之後,還沒有被刪除的就是素數.如果用vis[i]表示i已經被刪除,則篩選法的**可以寫成:

void isprime(int n)///篩選1-n的素數

儘管**已經相當高效了,但仍然可以進行改進.首先,在"對於不超過n的每個非負數p"中,p可以限定為素數--只需在第二重迴圈前加乙個判斷if(!vis[i])即可.另外,內層迴圈也不必從i * 2開始--它已經在i = 2時被篩選了.改進後**如下:

void isprime(int n)///篩選1-n的素數

}}

eratosthenes篩選法雖然效率高,但是eratosthenes篩選法做了許多無用功,乙個數會被篩到好幾次,最後的時間複雜度是o(nloglogn),對於普通素數演算法而言已經非常高效了,但尤拉篩選法的時間複雜度僅僅為o(n).

尤拉篩選法的思想就是不做無用功,原本eratosthenes篩法的第一重迴圈是用來找素數,然後把素數的倍數標記,而尤拉篩法換了乙個角度,第一位是找素數沒有問題,但是標記的時候用的是所有數.尤拉篩選法在資料小的時候不如eratosthenes篩選法快,反而是資料變大以後,兩者差距變得越來越明顯,尤拉篩選法明顯快於eratosthenes篩選法.尤拉篩選法**如下:

const int max = 100002;

int prime[max];

bool vis[max];

void prepare()

}}

利用Eratosthenes篩選法計算質數

演算法第1步就是寫下從3至某個上限之間的所有奇數。在演算法的剩餘部分,遍歷整個列表並剔除所有不是質數的奇數。在3之後把每逢第3個數 3的倍數 剔除。完成這一步之後,輪到5,將所有5的倍數剔除。這樣依次類推 反覆進行,最後列表中未被剔除的數均為質數。這裡可能讀者會有問題了,為什麼輪到4 6 8 10等...

單鏈表實現Eratosthenes篩選法

對於任意正整數n,eratosthenes篩法可表示如下 第1步,找出小於等於 n的全部素數 p1 p2 p3 pm。第2步,在1 n中分別劃去p1 p2 pm全部倍數 除了他們自己本身 第2步完成後剩下的整數除1外就是不超過n的全部素數。簡而言之,篩選原理如下 對於乙個正整數a n,如果素數p1 ...

求質數之Eratosthenes篩選法(C 版)

eratosthenes計算小於100000的素數質數 時間複雜度是o nloglogn 演算法原理 乙個合數總是可以分解成若干個質數的乘積,那麼如果把質數 最初只知道2是質數 的倍數都去掉,那麼剩下的就是質數了。二 步驟 1 先把1刪除 1既不是質數也不是合數 2 讀取佇列中當前最小的數2,然後把...