篩法我們肯定都不陌生,用來求一定序列內素數個數的方法麻,但在學習完埃氏篩法後(如果沒學過可以去學一下再看),我們發現它似乎做了很多多餘的操作,乙個數會被他的質所有篩
一遍,但我們本質上篩一遍就夠了,所以我們有沒有什麼方法去優化它呢?尤拉篩隨之而出,尤拉篩的特點便是乙個數隻會被它的最小質因子篩一遍,其它質因子不會篩它,這便大大提高了時
間效率**如下
(懶的不想寫便把這個部落格裡的**搬了一下)
for( int i=2;i<=n;i++ )
}
death為我們的標記陣列
尤拉篩相比埃氏篩的優點便在與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*比他最小質因子小的質數,則是在更新以該質數為最小質因子的合數。
我們來做一點小練習
利用線性篩求莫比烏斯函式
mu[1]=1;
for (int i=2;i<=10000000;i++)
}
介紹到這裡啦,完結撒花! 尤拉篩 尤拉函式 莫比烏斯函式
通過已知素數及當前自然數篩掉後面的合數。同時讓每乙個合數只被篩去一次,摒棄重複的篩除操作。兩個陣列 乙個vis,乙個prime。迴圈從2開始,直到所給的上限n處 或者直接maxn 無論當前數是否是質數,都要進行後續合數的處理!篩除時要利用已有的素數。素數規模 趨近於xln x displaystyl...
線性篩素數 尤拉函式 莫比烏斯函式
常用的兩種素數篩法見部落格 http 這裡詳講線性篩,演算法複雜度o n 這個演算法的核心思想是 每乙個合數可以被唯一地表示成它的乙個最小質因子和另外乙個數的乘積。證明略。先上 const int n 1000000 int phi n prime n mu n bool vis n void in...
線性篩素數 尤拉函式 莫比烏斯函式
判斷素數 對於n,分別列舉1 sqrt n 最樸素的素數篩 埃拉託斯特尼篩法 sieve of eratosthenes 1 int primes maxn ent 0 2 bool isprime maxn 3void getprime 414 15 複雜度 nlglgn 尤拉篩 每個合數只會被乙...