莫比乌斯反演—详解

莫比乌斯反演

介绍

1、莫比乌斯反演是组合数学中很重要的内容,可以用于解决很多组合数学的问题。
2、莫比乌斯反演是数论中的重要内容,在许多情况下能够简化运算。
3、是个很神奇的东西。

引入

考虑以下求和函数

fn=d|ngd

那么根据定义我们可以知道

f1 = g1
f2 = g1 + g2
f3 = g1 + g3
f4 = g1 + g2 + g4
f5 = g1 + g5
f6 = g1 + g2 + g3 + g6
f7 = g1 + g7
f8 = g1 + g2 + g4 + g8
f9 = g1 + g3 + g9
f10 = g1 + g2 + g5 + g10
f11 = g1 + g11
f12 = g1 + g2 + g3 + g4 + g6 + g12

……
现在反过来,用 f 表示 g

g1 = f1
g2 = f2 - f1
g3 = f3 - f1
g4 = f4 - f2
g5 = f5 - f1
g6 = f6 - f3 - f2 + f1
g7 = f7 - f1
g8 = f8 - f4
g9 = f9 - f3
g10 = f10 - f5 - f2 + f1
g11 = f11 - f1
g12 = f12 - f6 - f4 + f2

……
根据上面的部分,我们发现了类似于这样的这样的式子:

gn = d|nfd * ?

我们还可以发现 ? 的值对于一个定值 d ,我们可以发现 n 的不同,会导致 ? 的值不同,
但我们发现 ? 的值与 nd 有关系,所以我们可以把 ? 看成某个当自变量为 nd 的函数的函数值,我们设这个函数为 mu(i)
则原式子可以写成:

gn = d|nfd * mu(nd)

内容

μd 为莫比乌斯函数,定义如下:

1、当 d = 1 μ(d) =1
2、若 d = P1 * P2 * P3 * …… * Pk ,其中 Pi (1<=i<=k)为互异的素数,则 μ(d) = (1)k
3、其余情况, μ(d) =0

莫比乌斯反演的内容如下:

如果满足

fn = d|ngd

则存在

gn = d|nfd * μ(nd)

μ 函数的性质

现在给出莫比乌斯函数 μ 的两个性质。

性质1、 μ 为积性函数。
积性函数的定义为,如果 a b 两数互质,就会满足 f(ab) = f(a) * f(b) ,那我们就说这个函数为积性函数。
这个证明没什么难的,对 a b 的值按照 μ 函数定义分类讨论一下就可以证出了。

性质2、对于任意正整数 n ,有

(1)若 n =1, d|nμ(d) =1
(2)若 n >1, d|nμ(d) =0

证明如下:

<1>当 n =1时, d|nμ(d) = μ(1) =1,得证。
<2>当 n >1时,设 d = Pt11 * Pt22 * Pt33 * Pt44 * ….. * Ptkk

ti >1时, μ(d) =0,所以我们只讨论 ti =0或1 的情况。
假设 d 含有 n e 个互不相同质因数,且质因数的指数为1,这样的 d μ 值为 (1)e 这样的 d Cek 个。

d|nμ(d) = ke=0 Cek (1)e = ke=0 Cek (1)e * 1(ke)

根据牛顿二项式定理 (a + b)n = ni=0 Cin * aib(ni)
可知

ke=0 Cek * (1)e * 1(ke) = ( - 1 + 1)k =0,即 d|nμ(d) =0,得证。

证明

有了 μ 函数的性质,我们就可以证出莫比乌斯反演的正确性了。

d|nfd * μ(nd)

= d|nμ(d) * f(nd)

= d|nμ(d) * i|nd g(i)

交换主体,原式等价于

i|n g(i) * d|ni μ(d)

根据 μ 函数性质2可知

(1)当 i=n 时, ni =1,所以 d|ni μ(d) = 1 ,因此 g(i) 的系数为1。

(2)当 i<n 时, ni >1,所以 d|ni μ(d) = 0 ,因此 g(i) 的系数为0。

综上所述

i|n f(i) * d|ni μ(d) = g(i1) * 0 + g(i2) * 0 +……+ g(n) *1= g(n)

gn = i|n f(i) * d|ni μ(d) = d|nfd * μ(nd) ,得证。

μ 的求值

关于 μ 的求值可以用线性筛法求素数求得。

如果不会线性筛法可以看我写的博客,链接如下:
http://blog.csdn.net/xianhaoming/article/details/50954056

程序如下(Pascal)

for i:=1 to n do
begin
    if bz[i]=false then
    begin
        inc(o);
        s[o]:=i;  
        mu[i]:=true; //素数的mu值为(-1)^1=-1
    end;
    for j:=1 to o do
    begin 
        bz[i*s[j]]:=true;
        if (i mod s[j]=0) or (i*s[j]>n) then 
        begin
            mu[i*s[j]]=0; //如果i mod s[j]=0 说明i*s[j]含有至少两个相同的素因子,所以mu的值为0.
            break;
        end;  
        mu[i*s[j]]:=mu[i]*mu[s[j]]; //根据mu是一个积性函数可得。(i和s[j]互质)
    end;
end; //每个合数和质数都会被搜到且仅被搜到一次,故时间复杂度为O(n)

莫比乌斯反演的变形及证明

用类似的方法,我们还可以证出以下变形
如果有以下求值函数

f(i) = nid=1 g(id)

则满足

g(i) = nid=1 f(id) * μ(d)

证明和原形差不了多少

nid=1 f(id) * μ(d)

= nid=1 μ(d) * f(id)

= nid=1 μ(d) * ndir=1 g(rdi)

设T=r*d,则原式为

niT=1 g(Ti) * d|T μ(d)

根据 μ 函数性质2可知

(1)当 T =1时, d|T μ(d) =1,因此 g(Ti) 的系数为1。

(2)当 T >1时, d|T μ(d) =0,因此 g(Ti) 的系数为0。

综上所述

niT=1 g(Ti) * d|T μ(d) = g(i1) * 1+ g(i2) * 0+……+ g(ini) * 0= g(i)

g(i) = nid=1 f(id) * μ(d) ,得证。

莫比乌斯反演的应用

对于类似于莫比乌斯反演的求和函数

fn = d|ngd

一般我们可以用 O1 时间求得 fi ,但 gi 可能要用 On2 的时间去求,乃至更多。
这时我们就可以用莫比乌斯反演(或变形)得

gn = d|nfd * μ(nd)

这样用 On 的时间就可以求出 gi ,而不是 On2 乃至更多,大大降低了时间复杂度。

你可能感兴趣的:(莫比乌斯反演,数学,各种算法介绍,数据结构及定理)