莫比烏斯反演
(PS:在評論區中衆多dalao的催促下,我認真的寫了三天三夜寫完了這篇杜教篩,保證是精品!)html
前言
(這大概是我第一次寫學習筆記吧OvO)
可能每個剛開始接觸莫比烏斯反演的OIer,起初都會厭惡這個神奇的東西。(我也同樣233)每個人厭惡的緣由有許多,多是這個煩人的式子,也可能僅僅只是由於不理解\(\mu\)函數而感到不爽。固然,莫比烏斯反演有一個小小的預備知識:整除分塊
那麼咱們先從莫比烏斯反演中最基礎的莫比烏斯函數\(\mu\)開始提及:函數
莫比烏斯函數
- 首先,咱們能夠先明確一點,莫比烏斯函數並非什麼很高大上的東西,它其實只是一個由容斥係數所構成的函數。\(\mu(d)\)的定義是:
- 當\(d=1\)時,\(\mu(d)=1\);
- 當\(d=\Pi_{i=1}^{k}p_i\)且\(p_i\)爲互異素數時,\(\mu(d)=(-1)^k\)。(說直白點,就是\(d\)分解質因數後,沒有冪次大於平方的質因子,此時函數值根據分解的個數決定);
- 只要當\(d\)含有任何質因子的冪次大於等於2,則函數值爲0.
- 對於任意正整數\(n\),\(\sum_{d|n}\mu(d)=[n=1]\)。(\([n=1]\)表示只有當\(n=1\)成立時,返回值爲\(1\);不然,值爲\(0\);(這個就是用\(\mu\)是容斥係數的性質能夠證實)(PS:這一條性質是莫比烏斯反演中最經常使用的)
- 對於任意正整數\(n\),\(\sum_{d|n}\frac{\mu(d)}{d}=\frac{\phi(n)}{n}\)。(這個性質很奇妙,它把歐拉函數和莫比烏斯函數結合起來,或許我以後寫杜教篩的學習筆記時會去證實吧)
- 程序實現並不難,咱們能夠在線性篩素數的程序上略做修改,即可以篩出\(\mu\)函數。
- 那我仍是給一段線篩的代碼吧
void get_mu(int n)
{
mu[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i]){prim[++cnt]=i;mu[i]=-1;}
for(int j=1;j<=cnt&&prim[j]*i<=n;j++)
{
vis[prim[j]*i]=1;
if(i%prim[j]==0)break;
else mu[i*prim[j]]=-mu[i];
}
}
}
莫比烏斯反演
- 解決完莫比烏斯函數的問題後,咱們便迎來了重頭戲莫比烏斯反演
- 定理:F(n)和f(n)是定義在非負整數集合上的兩個函數,而且知足條件:
\[F(n)=\sum_{d|n}f(d)\]
那麼存在一個結論:
\[f(n)=\sum_{d|n}\mu(d)F(\lfloor\frac{n}{d}\rfloor)\]
這個定理就稱做莫比烏斯反演定理。
- 莫比烏斯反演的證實主要有兩種方式,其中一種就是經過定義來證實;另一種,我則是會在杜教篩中提到(利用狄利克雷卷積)。那麼我先來講一說第一種證實方法:
\[\sum_{d|n}\mu(d)F(\lfloor\frac{n}{d}\rfloor)=\sum_{d|n}\mu(d)\sum_{i|\lfloor\frac{n}{d}\rfloor}f(i)\]
\[=\sum_{i|n}f(i)\sum_{d|\lfloor\frac{n}{i}\rfloor}\mu(d)=f(n)\]
(PS:若是不知道最後一步怎麼來的,能夠再去看性質一,至於和式的變換,就本身腦補一下吧)
- 固然,莫比烏斯反演有另外的一種形式,當\(F(n)\)和\(f(n)\)知足:
\[F(n)=\sum_{n|d}f(d)\]
能夠推出:
\[f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)\]
- 感受這個式子,可能在莫比烏斯反演中更加好用。
那麼,莫比烏斯反演的基本內容就說完了。知道了這些內容,就已經能夠解決一些有關的問題了。我作了一些關於莫比烏斯反演的題,具體題解能夠看看我博客中的內容。學習
題目
(未完,待更新)spa