判斷素數:對於n,分別列舉1-sqrt(n)。
最樸素的素數篩——埃拉託斯特尼篩法(sieve of eratosthenes)
1複雜度:nlglgnint primes[maxn],ent=0;2
bool
isprime[maxn];
3void
getprime()414
}15 }
尤拉篩:每個合數只會被乙個素數篩去,所以複雜度線性。
原理:每個比 i 大的合數,必可以拆分為乙個比 i 小的質數和另乙個合數之積
1積性函式:f(ab)=f(a)f(b).ab不要求互素為完全積性函式。int primes[maxn],tot=0;2
bool
isprime[maxn];34
void
getprime()517
}18 ————————————————
·尤拉函式
·莫比烏斯函式
尤拉函式(積性函式)
尤拉函式 ϕ(n) 是小於或等於n的正整數中與n互質的數的數目。
定義式:ϕ(n)=n(1−1/p1)(1−1/p2)…(1−1/pk),p1…pk是n的k個不同的質因數。
一些性質:
ϕ(n*p)=ϕ(n)*p. p為素數 (照定義式一寫可證)
ϕ(p)=p-1.
可得**
1莫比烏斯函式莫比烏斯函式μ(d)的定義如下int tot=0;2
intphi[maxn],prime[maxn];
3bool
isprime[maxn];
4void
getphi()else phi[i*prime[j]]=phi[i]*(prime[j]-1);//*16
}17}18 }
(1)若d=1,那麼μ(d)=1
(2)若d=p1p2…pk(p1…pk均為互異質數),那麼μ(d)=(−1)^k
(3)其他情況下,μ(d)=0
假設當前從μ(i),μ(p)轉移到μ(i·p),
1、如果p是在ip中第一次出現的話(也就是p不整除i),則μ(i·p)=−μ(i)
2、如果p不是在ip中第一次出現的話(也就是p整除i),則μ(i·p)=0
1莫比烏斯反演f(n),f(n) 是定義在非負整數集合上的兩個函式,並且滿足條件int tot=0;2
intmu[maxn],prime[maxn];
3bool
isprime[maxn];
4void
getmiu()else miu[i*prime[j]]=-1*mu[i];16}
17}18 }
則似乎有乙個絕妙的性質:
線性篩素數 尤拉函式 莫比烏斯函式
常用的兩種素數篩法見部落格 http 這裡詳講線性篩,演算法複雜度o n 這個演算法的核心思想是 每乙個合數可以被唯一地表示成它的乙個最小質因子和另外乙個數的乘積。證明略。先上 const int n 1000000 int phi n prime n mu n bool vis n void in...
尤拉篩 尤拉函式 莫比烏斯函式
通過已知素數及當前自然數篩掉後面的合數。同時讓每乙個合數只被篩去一次,摒棄重複的篩除操作。兩個陣列 乙個vis,乙個prime。迴圈從2開始,直到所給的上限n處 或者直接maxn 無論當前數是否是質數,都要進行後續合數的處理!篩除時要利用已有的素數。素數規模 趨近於xln x displaystyl...
尤拉篩(線性篩)求莫比烏斯函式
篩法我們肯定都不陌生,用來求一定序列內素數個數的方法麻,但在學習完埃氏篩法後 如果沒學過可以去學一下再看 我們發現它似乎做了很多多餘的操作,乙個數會被他的質所有篩 一遍,但我們本質上篩一遍就夠了,所以我們有沒有什麼方法去優化它呢?尤拉篩隨之而出,尤拉篩的特點便是乙個數隻會被它的最小質因子篩一遍,其它...