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

版权声明:本博客文章为作者原创,转载请附原文链接! https://blog.csdn.net/hydingsy/article/details/81947546

简介

  莫比乌斯反演是数论中的重要内容。对于一些函数 f ( n ) ,如果很难直接求出它的值,而容易求出其倍数和或约数和 g ( n ) ,那么可以通过莫比乌斯反演简化运算,求得 f ( n ) 的值。
  开始学习莫比乌斯反演前,我们需要一些前置知识:积性函数Dirichlet 卷积莫比乌斯函数


积性函数

定义

  若 gcd ( x , y ) = 1 f ( x y ) = f ( x ) f ( y ) ,则 f ( n ) 为积性函数。

性质

  若 f ( x ) g ( x ) 均为积性函数,则以下函数也为积性函数:

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 )

例子

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 Dirichlet 卷积为

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

性质

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

例子

ϵ = μ 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 ) = { 1 n = 1 0 n  含有平方因子 ( 1 ) k k  为  n  的本质不同质因子个数

证明

ϵ ( n ) = { 1 n = 1 0 n 1

  其中 ϵ ( n ) = d | n μ ( d ) ϵ = μ 1
  设 n = i = 1 k p i c i , n = i = 1 k p i
  那么 d | n μ ( d ) = d | n μ ( d ) = i = 0 k C k i ( 1 ) k
  根据二项式定理,易知该式子的值在 k = 0 n = 1 时值为 1 否则为 0 ,这也同时证明了 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 = ID (ID 函数即  f ( x ) = x

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

φ 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 ) = d | n g ( d )

  那么有

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

证明

  • 暴力计算

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 | n g ( d ) 来替换 f ( n d ) ,再变换求和顺序。最后一步转为的依据: d | n μ ( d ) = [ n = 1 ] ,因此在 n k = 1 时第二个和式的值才为 1 。此时 n = k ,故原式等价于 k | n [ n = k ] g ( k ) = g ( n )

  • 运用卷积

  原问题为:已知 f = g 1 ,证明 g = f μ
  易知如下转化: f μ = g 1 μ f μ = g (其中 1 μ = ϵ


问题形式

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

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

猜你喜欢

转载自blog.csdn.net/hydingsy/article/details/81947546