莫比乌斯反演
介绍
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
表示
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 * ?
我们还可以发现
但我们发现
则原式子可以写成:
gn = ∑d|nfd * mu(nd)
内容
μd 为莫比乌斯函数,定义如下:
1、当
d
=
2、若
d
=
3、其余情况,
μ(d)
=0
莫比乌斯反演的内容如下:
如果满足
fn = ∑d|ngd
则存在
gn = ∑d|nfd * μ(nd)
μ 函数的性质
现在给出莫比乌斯函数 μ 的两个性质。
性质1、
μ
为积性函数。
积性函数的定义为,如果
a
,
这个证明没什么难的,对
a
和
性质2、对于任意正整数 n ,有
(1)若
(2)若
n
>1,
证明如下:
<1>当
n
=1时,
<2>当
n
>1时,设
当
ti
>1时,
μ(d)
=0,所以我们只讨论
ti
=0或1 的情况。
假设
d
含有
则
∑d|nμ(d) = ∑ke=0 Cek (−1)e = ∑ke=0 Cek (−1)e * 1(k−e)
根据牛顿二项式定理
(a
+
b)n
=
∑ni=0
Cin
*
aib(n−i)
可知
∑ke=0
Cek
*
(−1)e
*
1(k−e)
=
(
-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) = ∑⌊ni⌋d=1 g(i∗d)
则满足
g(i) = ∑⌊ni⌋d=1 f(i∗d) * μ(d)
证明和原形差不了多少
∑⌊ni⌋d=1 f(i∗d) * μ(d)
= ∑⌊ni⌋d=1 μ(d) * f(i∗d)
= ∑⌊ni⌋d=1 μ(d) * ∑⌊nd∗i⌋r=1 g(r∗d∗i)
设T=r*d,则原式为
∑⌊ni⌋T=1 g(T∗i) * ∑d|T μ(d)
根据 μ 函数的性质2可知
(1)当
T
=1时,∑d|T
μ(d)
=1,因此
g(T∗i)
的系数为1。
(2)当
T
>1时,∑d|T
μ(d)
=0,因此
g(T∗i)
的系数为0。
综上所述
∑⌊ni⌋T=1 g(T∗i) * ∑d|T μ(d) = g(i∗1) * 1+ g(i∗2) * 0+……+ g(i∗⌊ni⌋) * 0= g(i)
即
g(i) = ∑⌊ni⌋d=1 f(i∗d) * μ(d) ,得证。
莫比乌斯反演的应用
对于类似于莫比乌斯反演的求和函数
fn = ∑d|ngd
一般我们可以用
O1
时间求得
fi
,但
gi
可能要用
On2
的时间去求,乃至更多。
这时我们就可以用莫比乌斯反演(或变形)得
gn = ∑d|nfd * μ(nd)
这样用 On 的时间就可以求出 gi ,而不是 On2 乃至更多,大大降低了时间复杂度。