尤拉篩
篩法我們肯定都不陌生,用來求一定序列內素數個數的方法麻,但在學習完埃氏篩法後(如果沒學過可以去學一下再看),我們發現它似乎做了很多多餘的操作,一個數會被他的質所有篩一遍,但我們本質上篩一遍就夠了,所以我們有沒有什麼方法取優化它呢?尤拉篩隨之而出,尤拉曬的特點便是一個數只會被它的最小質因子篩一遍,其它質因子不會篩它,這便大大提高了時間效率
程式碼如下
(懶的不想寫便把這個部落格裡的程式碼搬了一下)
for( int i=2;i<=n;i++ ) {
if( !death[i] )
primelist[++tail] = i;//record this new prime
for( int k=1;k<=tail;k++ ) {
if( primelist[k]*i > n ) break;
death[primelist[k]*i] = 1;
if( i%primelist[k] == 0 ) break;//!!!
}
}
death為我們的標記陣列(我覺的可以用map來寫,省)
尤拉篩相比埃氏篩的優點便在與if( i%primelist[k] == 0 ) break;這一句
當primelist[k]>primelistk1
時,因為primelist[k1]是i的最小質因子,所以它也是primelist[k]i的最小質因子
所以primelist[k]i會由primelist[k1]某個i更新出來,所以當primelist[k]>primelist[k1]時我們break;
將拒絕重複計算,而i比他最小質因子小的質數,則是在更新以該質數為最小質因子的合數。