莫比烏斯反演---基礎
前置芝士:
1.數論函數
:指定義域為正整數、陪域為復數的函數,每個算術函數都可視為復數的序列。
---來自百度百科
2.積性函數:
若f(x)為一個數論函數,且對於每一個互質的a,b滿足
\[f(a*b)=f(a)*f(b) \]
則f(x)為積性函數.
--完全積性函數:若f(x)為一個數論函數,且對於每一對a,b滿足
\[f(a*b)=f(a)*f(b) \]
則f(x)為完全積性函數.
例:積性函數有:
\[\\\sigma_{k}(n)(表示n的所有約數的k次冪的和) \\ \varphi(n)也為不超過n且與n互質的數的個數. \\ \mu(n) = \begin{cases} 1&n=1 \\ (-1)^k&n為k個不同質數的積\\ 0&else \end{cases} \]
完全積性函數有:
\[冪函數 n^k\\ 單位函數\epsilon(n)=\begin{cases} 1&n=1\\ 0&n>1 \end{cases} \]
把積性函數與狄利克雷卷積(下面要學)聯系起來,可以得到
若f,g為積性函數,則f*g也為積性函數.
\[(f*g)(a\times b)=\sum\limits_{d|ab}f(d)g(\frac{ab}{d})\\ 令d=d_1\times d_2\\ =\sum\limits_{d_1d_2|ab}f(d_1d_2)g(\frac{ab}{d_1d_2})\\ =\sum\limits_{d_1|a}f(d_1)g(\frac{a}{d_1})\times \sum\limits_{d_2|d}f(d_2)g(\frac{b}{d_2})\\ =(f*g)(a)\times (f*g)(b) \]
線性篩(實際上是利用線性篩求積性函數的值)
唯一分解定理:任何一個大於1的自然數 N,如果N不為質數,那么N可以唯一分解成有限個質數的乘積
那么有
\[\mathbf{f}(n)=\prod\limits_{i=1}^t\mathbf{f}(p_i^{k_i}) \]
於是我們就有另一種方法表示積性函數,即給出它在素數冪處的取值
當我們在線性篩的時候可以求出每個數的最小質因數\(p_1\),它的次數\(k_1\),那么
\[\mathbf{f}(n)=\mathbf{f}(p_1^{k_1})\mathbf{f}(\frac{n}{p_1^{k_1}}) \]
由上面的結論可知:
\[\sigma_0(n)=\prod\limits_{i=1}^t(k_i+1)\\ \phi(n)=\prod\limits_{i=1}^tp_i^{k_i-1}(p_i-1)=n\prod\limits_{i=1}^t(1-\frac{1}{p_i}) \]
(下面的那個是不是有點熟悉?就是課本上歐拉函數的求法)
3.函數之間的加法和數乘
\[(f+g)(n)=f(n)+g(n) \\加法\\(x\times f)(n)=x\times f(n),x\epsilon C\\ (c為常數) 數乘 \]
4.狄利克雷卷積(Dirichlet)
Dirichlet是個人,而且是一個很有名的人,今天我們不講這個人,我們講講他的狄利克雷卷積
狄利克雷乘積(Dirichlet product)亦稱狄利克雷卷積、卷積,是數論函數的重要運算之一。設f(n)、g(n)是兩個數論函數,它們的Dirichlet(狄利克雷)乘積也是一個數論函數,簡記為h(n)=f(n)*g(n)。---來自百度百科
\[(f*g)=\sum\limits_{ij=n}f(i)g(j)\\或\\(f*g)=\sum\limits_{d|n}f(d)f(\frac{n}{d}) \]
運算性質:滿足交換律,結合律,分配律;
交換律 即
\[(f*g)=(f*g)\\ \]
\[--------------\\ 證明:\\(f*g)(n)=\sum\limits_{ij=n}f(i)g(j)=\sum\limits_{ji=n}f(j)g(i)=(g*f)(n) \]
結合律:
\[(f*g)*h=f*(g*h) \]
\[證明:\\ [((f*g)*h)](n)=\sum\limits_{pq=n}[\sum\limits_{ij=p}f(i)g(j)]h(q)\\ =\sum\limits_{i|n}f(i)(\sum\limits_{jq=\frac{n}{i}}g(j)h(q))\\ =\sum\limits_{i|n}f(i)(g*h)(\frac{n}{i})\\ =(f*(g*h))(n) \]
分配律:
\[f*(g+h)=f*g+f*h \]
\[證明:\\ f*(g+h)=[f*(g+h)](n)\\ =\sum\limits_{d|n}f(d)\times[g(\frac{n}{d})+h(\frac{n}{d})]\\ =\sum\limits_{d|n}[f(d)g(\frac{n}{d})+f(d)h(\frac{n}{d})]\\ =f*g+f*h \]
單位元
在狄利克雷卷積中存在一種像單位矩陣一樣的"數",任何一個函數*這個"數"都會是其本身,我們把這個"數"叫做單位元,即前文所提到的單位函數
\[\epsilon(n)=\begin{cases}1&n=1\\ 0&n>1\\ \end{cases} \]
則有
\[(f*\epsilon)(n)=\sum\limits_{d|n,d\neq n}f(d)\epsilon(\frac{n}{d})+f(n)\epsilon(1)\\ =\sum\limits_{d|n,d\neq n}f(d)\times0+1\\] =f(n) \]
所以任何一個數論函數與單位元的卷積為數論函數本身(后文有重要運用)
逆元
其實逆元的概念和倒數差不多,即:
方程
的解稱為
關於模
的逆,當
(即
,
互質)時,方程有唯一解,否則無解。
那么逆元可以用來干什么呢,比如說對於
,並沒有
,但是直接除又會爆精度,這時我們就可以用到逆元,假設用
代表 
的逆元,那么
。 ____引用自forever_dreams的博客
上面的是數的逆元,狄利克雷卷積也有逆元:
定義:
\[對每個\mathbf{f}(1) \neq 0的函數\mathbf f ,都存在一個函數\mathbf{g}使得\mathbf{f}*\mathbf{g}=\epsilon \]
則如何求一個函數的逆?
定義
\[\mathbf{g}(n)=\frac{1}{\mathbf{f}(1)}\left([n=1]-\sum\limits_{ij=n,i\neq 1}\mathbf{f}(i)\mathbf{g}(j)\right) \]
則
\[\mathbf{f}*\mathbf{g}(n)\\ =\sum\limits_{ij=n}\mathbf{f}(i)\mathbf{g}(j)\\ =\mathbf{f}(1)\mathbf{g}(n)+\sum\limits_{ij=n,i\neq 1}\mathbf{f}(i)\mathbf{g}(j)\\=[n=1]=\epsilon(i) \]
把積性函數和逆元聯系起來得到 積性函數的逆元一定也是積性函數.
留與讀者自證之/笑哭.(注,積性函數一定滿足 f ( 1 ) = 1 )
莫比烏斯反演
\[我們定義1的逆是 \mu.\\ 這樣的話,如果g=f*1,就有f=f*1*\mu=g*\mu,\\ 換句話說,如果 \mathbf g(n)=\sum_{d\mid n}\mathbf f(d) \\就有 \mathbf f(n)=\sum_{d\mid n}\mu\left(\frac nd\right)\mathbf g(d) \]
\[引理 \\\mu*1=\epsilon\\ 即 \sum\limits_{d|n}\mu(d)=\epsilon(n)\\其中的"1"是一個返回值為1的常數函數 \]
證明:
\[設n有k個不同的質因子 \\n=p_1\times p_2\times ...\times p_k\\ 記一個函數q(s)為序列\mathbf{s}中所有元素的乘積\\ \mathbf{s}=\{{x_1,x_2...x_k}\};s序列長度為K \\令一個\mathbf{f}(s)的約數d=\mathbf{f}(j) \\j\subseteq s,\ \ \ \ j序列長度為J\\ \therefore \sum\limits_{d|n}\mu(d)=\sum\limits_{\mathbf{J}=0}^k\mu(f(j))\times (從K中取J個值(組合數))\\ 令i=J,則原式=\sum\limits_{i=0}^k\mu(d)^i(k中取i的組合)\\ 根據二項式定理,奇數項與偶數項和為0. 所以\sum\limits_{d|n}\mu(n) = \begin{cases} 1&n=1 \\ 0&n>1\\ \end{cases}=\epsilon(n) \]
求解μ
\[如何求\mu\ ?由於1是積性的,所以1的逆\mu也是積性的,則 \]
\[\mu(p^k)\begin{cases}1,&k=0\\-1,&k=1\\0,&k>1\end{cases} \]
\[\mu(x)=\begin{cases} 1,&x=1\\ (-1)^n, &x=\prod\limits_{i=1}^np_i\\ 0,&其余情況 \end{cases} \]
\[求\mu的函數 \]
void get_mu(int n)
{
mu[1] = 1;
for(int i = 2;i <= n; i++)
{
if(!vis[i])
{
pri[++cnt] = i;
mu[i] = -1;
}
for(int j = 1; j <= cnt && pri[j] * i <= n; j++)
{
vis[pri[j] * i] = 1;
if(i % pri[j] == 0) break;
else mu[i * pri[j]] = -mu[i];
}
}
}
這樣就證明了上述結論。
當然還有另一個方向的莫比烏斯反演(這個大概更常用)
\[\mathbf{g}(n)=\sum\limits_{n|d}\mathbf{f}(d)\iff \mathbf{f}(n)=\sum\limits_{n|d}\mu(\frac{d}{n})\mathbf{g}(d) \]
\[對此只需要定義 (\mathbf f\oplus\mathbf g)(x)=\sum_{x\mid y}\mathbf f(y/x)\mathbf g(y)=\sum\limits_{x|Y}f(y/x)g(y) ,並容易證明 (\mathbf f\ast\mathbf g)\oplus\mathbf h=\mathbf f\oplus(\mathbf g\oplus\mathbf h)。\\於是 \mathbf f=(\mu\ast\mathbf1)\oplus\mathbf f=\mu\oplus(\mathbf1\oplus\mathbf f)=\mu\oplus\mathbf g \]
莫比烏斯反演是一個很重要的數論知識,在做數論題的時候很有幫助,為了提高對於莫比烏斯反演的理解和掌握
建議去看看以下幾道題
YY的GCD
約數個數和
如果你看完了一遍,對於知識點還是沒有理解的話,建議重新看一遍,或者去以下的博客那里看一看,
本人就是從那里學習的
鈴懸的小知識