莫比乌斯反演是数论中的重要内容。对于一些函数 f(n) f ( n ) ,如果很难直接求出它的值,而容易求出其倍数和或约数和 g(n) g ( n ) ,那么可以通过莫比乌斯反演简化运算,求得 f(n) f ( n ) 的值。
开始学习莫比乌斯反演前,我们需要一些前置知识:积性函数、Dirichlet 卷积、莫比乌斯函数。
若 gcd(x,y)=1 gcd ( x , y ) = 1 且 f(xy)=f(x)f(y) f ( x y ) = f ( x ) f ( y ) ,则 f(n) f ( n ) 为积性函数。
若 f(x) f ( x ) 和 g(x) g ( x ) 均为积性函数,则以下函数也为积性函数:
定义两个数论函数 f,g f , g 的 Dirichlet Dirichlet 卷积为
Dirichlet Dirichlet 卷积满足交换律和结合律。
其中 ϵ ϵ 为 Dirichlet Dirichlet 卷积的单位元(任何函数卷 ϵ ϵ 都为其本身)
μ μ 为莫比乌斯函数
莫比乌斯函数不但是积性函数,还有如下性质:
其中 ϵ(n)=∑d|nμ(d) ϵ ( n ) = ∑ d | n μ ( d ) 即 ϵ=μ∗1 ϵ = μ ∗ 1
设 n=∏i=1kpici,n′=∏i=1kpi n = ∏ i = 1 k p i c i , n ′ = ∏ i = 1 k p i
那么 ∑d|nμ(d)=∑d|n′μ(d)=∑i=0kCik⋅(−1)k ∑ d | n μ ( d ) = ∑ d | n ′ μ ( d ) = ∑ i = 0 k C k i ⋅ ( − 1 ) k
根据二项式定理,易知该式子的值在 k=0 k = 0 即 n=1 n = 1 时值为 1 1 否则为 0 0 ,这也同时证明了 ∑d|nμ(d)=[n=1] ∑ d | n μ ( d ) = [ n = 1 ]
由于 μ μ 函数为积性函数,因此可以线性筛莫比乌斯函数(线性筛基本可以求所有的积性函数,尽管方法不尽相同)。
代码:
void getMu() {
mu[1]=1;
for(int i=2;i<=n;++i) {
if(!flg[i]) p[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*p[j]<=n;++j) {
flg[i*p[j]]=1;
if(i%p[j]==0) {
mu[i*p[j]]=0;
break;
}
mu[i*p[j]]=-mu[i];
}
}
}
证明
将 n n 分解质因数: n=∏i=1kpici n = ∏ i = 1 k p i c i
首先,因为 φ φ 是积性函数,故只要证明当 n′=pc n ′ = p c 时 φ∗1=∑d|n′φ(n′d)=ID φ ∗ 1 = ∑ d | n ′ φ ( n ′ d ) = ID 成立即可。
因为 p p 是质数,于是 d=p0,p1,p2,⋯,pc d = p 0 , p 1 , p 2 , ⋯ , p c
易知如下过程:
设 f(n),g(n) f ( n ) , g ( n ) 为两个数论函数。
如果有
那么有
用 ∑d|ng(d) ∑ d | n g ( d ) 来替换 f(nd) f ( n d ) ,再变换求和顺序。最后一步转为的依据: ∑d|nμ(d)=[n=1] ∑ d | n μ ( d ) = [ n = 1 ] ,因此在 nk=1 n k = 1 时第二个和式的值才为 1 1 。此时 n=k n = k ,故原式等价于 ∑k|n[n=k]⋅g(k)=g(n) ∑ k | n [ n = k ] ⋅ g ( k ) = g ( n )
原问题为:已知 f=g∗1 f = g ∗ 1 ,证明 g=f∗μ g = f ∗ μ
易知如下转化: f∗μ=g∗1∗μ⇒f∗μ=g f ∗ μ = g ∗ 1 ∗ μ ⇒ f ∗ μ = g (其中 1∗μ=ϵ 1 ∗ μ = ϵ )
本文部分内容引用于 algocode 算法博客,特别鸣谢!