「算法笔记」莫比乌斯反演

简介

  莫比乌斯反演是数论中的重要内容。对于一些函数 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 ) 均为积性函数,则以下函数也为积性函数:

h(x)h(x)h(x)h(x)=f(xp)=fp(x)=f(x)g(x)=d|xf(d)g(xd) h ( x ) = f ( x p ) h ( x ) = f p ( x ) h ( x ) = f ( x ) g ( x ) h ( x ) = ∑ d | x f ( d ) g ( x d )

例子

 k d(n)=d|n1σ(n)=d|ndσk(n)=d|ndkφ(n)=i=1n[gcd(i,n)=1]μ(n)=1(1)k0n=1c1,2,,k=1(n=i=1kpici)ci>1 约 数 个 数 函 数 d ( n ) = ∑ d | n 1 约数和函数 σ ( n ) = ∑ d | n d 约数  k  次幂函数 σ k ( n ) = ∑ d | n d k 欧拉函数 φ ( n ) = ∑ i = 1 n [ gcd ( i , n ) = 1 ] 莫比乌斯函数 μ ( n ) = { 1 n = 1 ( − 1 ) k c 1 , 2 , ⋯ , k = 1 ( n = ∏ i = 1 k p i c i ) 0 c i > 1


Dirichlet 卷积

定义

  定义两个数论函数 f,g f , g Dirichlet Dirichlet 卷积为

(fg)(n)=d|nf(d)g(nd) ( f ∗ g ) ( n ) = ∑ d | n f ( d ) g ( n d )

性质

   Dirichlet Dirichlet 卷积满足交换律和结合律。
  其中 ϵ ϵ Dirichlet Dirichlet 卷积的单位元(任何函数卷 ϵ ϵ 都为其本身)

例子

ϵ=μ1d=11σ=d1φ=μIDϵ(n)=d|nμ(d)d(n)=d|n1ϵ(n)=d|ndφ(n)=d|nμ(d)nd ϵ = μ ∗ 1 ⇔ ϵ ( n ) = ∑ d | n μ ( d ) d = 1 ∗ 1 ⇔ d ( n ) = ∑ d | n 1 σ = d ∗ 1 ⇔ ϵ ( n ) = ∑ d | n d φ = μ ∗ ID ⇔ φ ( n ) = ∑ d | n μ ( d ) ⋅ n d


莫比乌斯函数

定义

   μ μ 为莫比乌斯函数

性质

  莫比乌斯函数不但是积性函数,还有如下性质:

μ(n)=10(1)kn=1n k  n  μ ( n ) = { 1 n = 1 0 n  含有平方因子 ( − 1 ) k k  为  n  的本质不同质因子个数

证明

ϵ(n)={10n=1n1 ϵ ( n ) = { 1 n = 1 0 n ≠ 1

  其中 ϵ(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];
        }
    }
}

拓展

  证明

φ1=IDID  f(x)=x φ ∗ 1 = ID (ID 函数即  f ( x ) = x )

  将 n n 分解质因数: n=i=1kpici n = ∏ i = 1 k p i c i
  首先,因为 φ φ 是积性函数,故只要证明当 n=pc n ′ = p c φ1=d|nφ(nd)=ID φ ∗ 1 = ∑ d | n ′ φ ( n ′ d ) = ID 成立即可。
  因为 p p 是质数,于是 d=p0,p1,p2,,pc d = p 0 , p 1 , p 2 , ⋯ , p c
  易知如下过程:

φ1=d|nφ(nd)=i=0cφ(pi)=1+p0(p1)+p1(p1)++pc1(p1)=pc=ID φ ∗ 1 = ∑ d | n φ ( n d ) = ∑ i = 0 c φ ( p i ) = 1 + p 0 ⋅ ( p − 1 ) + p 1 ⋅ ( p − 1 ) + ⋯ + p c − 1 ⋅ ( p − 1 ) = p c = ID


莫比乌斯反演

公式

  设 f(n),g(n) f ( n ) , g ( n ) 为两个数论函数。
  如果有

f(n)=d|ng(d) f ( n ) = ∑ d | n g ( d )

  那么有

g(n)=d|nμ(d)f(nd) g ( n ) = ∑ d | n μ ( d ) f ( n d )

证明

  • 暴力计算

d|nμ(d)f(nd)=d|nμ(d)k|ndg(k)=k|ng(k)d|nkμ(d)=g(n) ∑ d | n μ ( d ) f ( n d ) = ∑ d | n μ ( d ) ∑ k | n d g ( k ) = ∑ k | n g ( k ) ∑ d | n k μ ( d ) = 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=g1 f = g ∗ 1 ,证明 g=fμ g = f ∗ μ
  易知如下转化: fμ=g1μfμ=g f ∗ μ = g ∗ 1 ∗ μ ⇒ f ∗ μ = g (其中 1μ=ϵ 1 ∗ μ = ϵ


问题形式

  • i=1nj=1m[gcd(i,j)=k] ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = k ] :「HAOI 2011」Problem b
  • i=1nlcm(i,n) ∑ i = 1 n lcm ( i , n ) :「SPOJ 5971」LCMSUM
  • i=1nj=1mlcm(i,j) ∑ i = 1 n ∑ j = 1 m lcm ( i , j ) :「BZOJ 2154」Crash的数字表格

本文部分内容引用于 algocode 算法博客,特别鸣谢!

你可能感兴趣的:(莫比乌斯反演)