反演
在容斥原理一文中,根据定义我们有
N≥(S)=S⊆J∑N=(J)
由于N≥(S)通常是容易计算的,而N=(J)是不容易计算的。容斥原理告诉我们可以这样从N≥“反解”出N=:
N=(S)=J:S⊆J⊆A∑(−1)∣J∣−∣S∣N≥(J)
如果我们把N=和N≥都看作P(A)→N的函数,那么上面两个式子恰好像我们解释出了从一个函数变换到另一个函数的变换公式。一般而言,把上面那个公式看作正向变换,那么下面那个公式就是反向变换,简称为“反演(inversion)”。
注意到,上面两个式子都是线性的。因此,可以用2n×2n的矩阵来表示这两个变换。定义正向变换的矩阵为Z,也即
N≥=ZN=
Z的元素应当是0或1,Z(i,j)=1当且仅当i对应的集合包含于j对应的集合。例如,当坏性质个数为3时(分别记为A,B,C),正向变换写作:
N≥({∅})N≥({A})N≥({B})N≥({C})N≥({A,B})N≥({A,C})N≥({B,C})N≥({A,B,C})=1000000011000000101000001001000011101000110101001011001011111111N=({∅})N=({A})N=({B})N=({C})N=({A,B})N=({A,C})N=({B,C})N=({A,B,C})
“子集”的性质使得Z呈现为上三角矩阵,所以Z可逆。因此反演写作:
N==Z−1N≥
容斥原理已经帮我们求出了Z−1:Z−1(i,j)=(−1)k,其中k为j对应的集合大小与i对应的集合大小的差值。Z−1只会在−1,0,1间取值。
人们把Z称为Zeta矩阵,Z−1称为Mobius矩阵。
关联代数
我们知道,容斥原理中所涉及的“子集的包含关系”实际上是一种特殊的偏序关系。可以看到,Zeta矩阵与Mobius矩阵实际上都是关于该偏序关系定义的。因此我们可以做推广,在一般的偏序集上定义Zeta矩阵和Mobius矩阵。
严格来看,讨论“矩阵”要求偏序集的大小是有限的。但从数学上,当偏序集满足一些特定的性质时,人们可以定义一种类比于矩阵的代数,称为关联代数(incidence algebra)。
对于偏序集(P,≤),一个关联代数I(P)是一族P×P→R的映射,满足:对于任意α∈I(P),∀x,y∈P,α(x,y)=0⟹x≤y。可见,关联代数中的元素可以看作一个“无穷矩阵”。可以定义其运算法则:
- (α1+α2)(x,y):=α1(x,y)+α2(x,y);
- (cα)(x,y):=c⋅α(x,y);
- (αβ)(x,y)=z∈P∑α(x,z)β(z,y);
乘法法则可以改写为(αβ)(x,y)=x≤z≤y∑α(x,z)β(z,y)。证明:如果x≤y,则(αβ)(x,y)=0。同时,对于任意z∈P,不可能同时成立x≤z∧z≤y,所以等式右边也为0;如果x≤y,那么对于任意z,如果z<x或y<z,那么α(x,z)β(z,y)=0;如果z与x不可比较大小或z与y不可比较大小,也有α(x,z)β(z,y)=0。证毕。
定义“单位矩阵”δ(x,y):=1[x=y],于是就可以定义“逆矩阵”α−1满足αα−1=δ。我们希望关联代数中元素的逆满足:左逆等于右逆;“逆”有唯一性。这对于偏序集有要求。人们通常要求偏序集满足“局部有限性”:∀x,y∈P,满足x≤z≤y的z的个数是有限的。下面证明,局部有限的偏序集上:
- 左逆等于右逆:即证对于任意α,β∈I(P),若αβ=δ,则βα=δ。由αβ=δ可知,∀x,y∈P,1[x=y]=x≤z≤y∑α(x,z)β(z,y)。当x=y时,δ(x,x)=x≤z≤x∑β(x,z)α(x,z),可见(βα)(x,x)=δ(x,x)。当x,y不可比较时,δ(x,y)=0,不存在z满足x≤z≤y,因此(βα)(x,y)=δ(x,y) =0。当x<y时,因为偏序集满足局部有限性,所以集合W={z∣x≤z≤y}是有限集,可以令W={z1,⋯,zm},它们按偏序关系从小到大排列。因为αβ=δ,所以δ(x,y)=(αβ)(x,y)= k=1∑mα(z1,zk)β(zk,zm)。定义矩阵A(i,j)=α(zi,zj),B(i,j)=β(zi,zj),我们知道∀1≤i<j≤m,δ(zi,zj)=k=i∑jα(zi,zk)β(zk,zj)=0,也等于k=1∑mα(zi,zk)β(zk,zj)。所以矩阵A,B满足AB=I。根据线性代数中矩阵的左逆等于右逆,得到BA=I。因此∀1≤i<j≤m,δ(zi,zj)=k=1∑mβ(zi,zk)α(zk,zj)=0。所以δ(x,y)=x≤z≤y∑β(x,z)α(x,y)。综上,βα=δ,证毕。
- 逆的唯一性:即证对于任意α,β,γ∈I(P),若αβ=δ且αγ=δ,则β=γ。由αβ=δ可知,∀x,y∈P,1[x=y]=x≤z≤y∑α(x,z)β(z,y);同理1[x=y]=x≤z≤y∑α(x,z)γ(z,y)。当x=y时,δ(x,x)=α(x,x)β(x,x) =α(x,x)γ(x,x),由于α(x,x)=0,故β(x,x)=γ(x,x)。当x,y不可比较时,β(x,y)=γ(x,y)=0。当x<y时,因为偏序集满足局部有限性,集合W={z∣x≤z≤y}是有限集,令W={z1,⋯,zm}按偏序关系排列。定义矩阵A(i,j)=α(zi,zj),B(i,j)=β(zi,zj),C(i,j)=γ(zi,zj)。由αβ=δ和αγ=δ可知AB=I且AC=I。根据线性代数中矩阵逆的唯一性,可知B=C,因此β(x,y)=γ(x,y)。综上,β=γ,证毕。
我们看到,“局部有限性”的条件让我们把关联代数上的证明转化为了普通的矩阵上的证明。在关于“逆”的性质上,关联代数和矩阵在本质上是相同的。
莫比乌斯反演
我们用关联代数仿照容斥原理定义zeta函数ζ:ζ(x,y)=1[x≤y]。定义莫比乌斯函数μ=ζ−1。那么偏序集上的“容斥原理”表述为:给定局部有限的偏序集(P,≤),对于任意两个函数f,g:P→R,如果f=ζg,那么g=μζ。换言之,如果∀x∈P,f(x)=x≤y∑g(y),那么∀x∈P,g(x)=y∈P∑μ(x,y)f(y)。注意到,因为μ是关联代数中的元素,只有x≤y时μ(x,y)才不为0,因此y∈P∑μ(x,y)f(y)=x≤y∑μ(x,y)f(y)。综上所述,我们有:
∀x∈P,f(x)=x≤y∑g(y)⟺∀x∈P,g(x)=x≤y∑μ(x,y)f(y)
这称为莫比乌斯反演(Mobius inversion)。
在容斥原理中,莫比乌斯函数μ有一个简单的表达式。那么,一般偏序集上的莫比乌斯函数是否也有简单的表达式?我们来做计算:因为μζ=δ,因此(μζ)(x,x)=1=x≤z≤x∑μ(x,z)ζ(x,z) =μ(x,x)ζ(x,x)=μ(x,x),所以μ(x,x)=1。对于x<y,(μζ)(x,y)=0=x≤z≤y∑μ(x,z)ζ(z,y)=x≤z≤y∑μ(x,z)。所以得到x≤z<y∑μ(x,z)+μ(x,y)=0,因此μ(x,y)=−x≤z<y∑μ(x,z)。尽管这不是通项,但我们也足够满意了。因为μ是关联代数中的元素,x≤y时μ(x,y)=0。这样我们就给出了莫比乌斯函数的递推表达式:
μ(x,y)=⎩⎨⎧01−x≤z<y∑μ(x,z)\mboxifx≤y;\mboxifx=y;\mboxifx<y.
有的时候,函数f,g满足的关系不是f(x)=x≤y∑g(y)而是f(x)=x≥y∑g(y),那么用ζ函数表示就必须写为f=ζ⊤g,于是g=(ζ⊤)−1f。可以证明(ζ⊤)−1=(ζ−1)⊤=μ⊤,因此g=μ⊤f,即:
g(x)=y∑μ⊤(x,y)f(y)=y∑μ(y,x)f(y)=y≤x∑μ(y,x)f(y)。
偏序集的乘积
设(P1,≤1),(P2,≤2),那么定义偏序集的乘积P1×P2=(P1×P2,≤)(括号内的×指的是笛卡尔积)。其中定义乘积偏序集中的元素(x1,y1)≤(x2,y2)当且仅当(x1≤1x2)∧(y1≤2y2)。
下面证明:μ((x1,y1),(x2,y2))=μ1(x1,x2)⋅μ2(y2,y2)。如果(x1,y1)≤(x2,y2),那么μ=0,此时要么x1≤1x2要么y1≤2y2,因此要么μ1=0要么μ2=0,成立。其余情况直接依据定义代入,使用归纳法:μ1(x1,x2) =−x1≤x<x2∑μ1(x1,x),μ2(y1,y2) =−y1≤y<y2∑μ2(y1,y),而μ((x1,y1),(x2,y2))= −(x1,y1)≤(x,y)<(x2,y2)∑μ((x1,y1),(x,y))。对(x1,y1)到(x2,y2)的链长归纳(定义为对应偏序集上x1到x2的链长与y1到y2的链长之和),那么运用归纳假设就得到上式中μ((x1,y1),(x,y))=μ1(x1,x)⋅μ2(y1,y),因此μ((x1,y1),(x2,y2))=−(x1,y1)≤(x,y)<(x2,y2)∑μ1(x1,x)⋅μ2(y1,y) =−[(x1≤x<x2∑μ1(x1,x))(y1≤y<y2∑μ2(y1,y))+μ1(x1,x2)y1≤y<y2∑μ2(y1,y)+μ2(y1,y2)x1≤x<x2∑μ1(x1,x)] =−[(−μ1(x1,x2)(−μ2(y1,y2))−μ1(x1,x2)μ2(y1,y2)−μ2(y1,y2)μ1(x1,x2)] =μ1(x1,x2)⋅μ2(y1,y2)。
由此我们变得非常容易证明最开始的容斥原理:我们定义一个只有两个元素的偏序集P({0,1},≤),其中0<1。我们对这个偏序集连着乘n次(这是有定义的,我们每次只乘2个偏序集),得到的偏序集记为Pn。于是在Pn中元素可以理解为一个01串,一个串小于等于另一个当且仅当后者为0的地方前者必须是0,后者为1的地方前者可以是0或1——它对应着一个2[n]中集合的包含关系!那么根据莫比乌斯函数在偏序集乘法中的运算法则,对于两个二进制串(集合)x,y,就有μ(x,y)=μ1(x1,y1)⋯μn(xn,yn),而μi(0,0)=1,μi(0,1)=−μi(0,0)=−1,因此μ(x,y)=(−1)k,其中k是x,y中不同的位数的个数,这恰好对应着我们曾经用二项式定理贡献证明的容斥原理N=(S)=J:S⊆J⊆A∑(−1)∣J∣−∣S∣N≥(J)中的系数(−1)∣J∣−∣S∣。
数论莫比乌斯函数
我们曾经看到过自然数上的“整除关系”也是一种偏序。所以我们对于特定的n可以定义一个偏序集(Dn,≤),其中就是所有n的约数构成的集合,其中x≤y当且仅当x∣y。
假如n=pα,其中p是一个素数,那么Dn中的元素只有{1,p,p2,⋯,pα}。其中的任意两个都可以比较大小,因此这其实是一个全序集,它可以看作指数的序列{0,1,2,⋯,α}。在这个集合上的莫比乌斯函数μ(x,y)满足μ(x,x)=1,当x>y时μ(x,y)=0,当x<y时μ(x,y)=−x≤z<y∑μ(x,z)。由于μ(x,y+1)=−x≤z<y+1∑μ(x,z)=−x≤z<y∑μ(x,z)−μ(x,y)=μ(x,y)−μ(x,y)=0,而μ(x,x+1)=−μ(x,x)=−1,因此有
μ(x,y)=⎩⎨⎧1−10\mboxifx=y\mboxifx+1=y\mboxotherwise
于是对于任意的正整数n,它可以写成唯一的质因数分解的形式n=p1α1⋯pkαk。它的所有可能的Dn就是每个piαi中指数任意取值。这相当于每个piαi对应的偏序集的笛卡尔积。所以整个偏序集就是这些小偏序集的乘积,要计算它的莫比乌斯函数也就只需要用小的莫比乌斯函数相乘。对于x<y,有μ(x,y)=μ1(x1,y1)⋯μk(xk,yk)。根据pα中莫比乌斯函数的结果,我们需要考察y/x的质因数分解:y/x=p1β1⋯pkβk。如果βi>1,那么μi(xi,yi)=0,直接得到μ(x,y)=0。因此对于μ(x,y)=0的情况必然要求y/x只是某一些质数的乘积(指数都为1),当βi=0时莫比乌斯函数贡献1(相当于没贡献),β=1贡献−1。综上,μ(x,y)=(−1)k,其中k为y/x质因数分解后不同质数的个数。即:
μ(x,y)=⎩⎨⎧1(−1)k0\mboxifx=y;\mboxify/x\mboxistheproductofk\mboxdistinctprimes;\mboxotherwise.
结果表明,μ(x,y)只与y/x有关,它实际上是一个一元函数。所以,我们也常常用μ(x)来简记μ(1,x),它们的值是相同的。
由此,我们就可以在研究整除性的领域尝试莫比乌斯反演(容斥原理)。
例如,数论中的欧拉函数φ(n)定义为1到n−1中与n互质的数的个数(规定φ(0)=1)。我们有一个重要的关系d∣n∑φ(d)=n。这个结论可以通过真分数的约分来直观地理解:当n取12时,所有的真分数121,⋯,1211约分后写作:
121,61,41,31,125,21,127,32,43,65,1211
按分母归类:
21;31,32;41,43;61,65;121,125,127,1211
由于真分数一定包括了所有与它互质的分子,而真分数的分母又取遍了所有n的约数(分子至少可以取1),所以这就是d∣n∑φ(d)=n这个关系的直接表达(还要加上φ(0)=1)。
那么,d∣n∑φ(d)=n用整除偏序集的语言来表达就写成I(y)=x≤y∑φ(x),其中函数I表示自身到自身的映射,I(x)=x。注意此时是我们刚才提到的不等号方向相反的情况,所以我们要写φ(x)=y≤x∑μ(y,x)I(y)。化简:φ(n)=d∣n∑μ(d,n)d =d∣n∑μ(dn)d
于是得到了欧拉函数的一个计算方法:
φ(n)=d∣n∑μ(dn)⋅d
格(Lattice)
在树上我们有最近公共祖先的概念,在Hasse图上两个节点也有“公共祖先”,用偏序集来表示,x,y的公共祖先u满足x≤u,y≤u。只不过在偏序集里我们不称它为“祖先”而成为“上界”,这是序结构的看法。如果在所有u里满足u0≤u恒成立的u0就是最小上界,记为x\ory。同样的可以定义最大下界x∧y。
如果偏序集里的任意两个元素x,y存在唯一的最小上界和唯一的最小下界,就称这个偏序集为“格”(Lattice)。格是一种特殊的偏序集。我们来研究它的莫比乌斯函数有什么特殊的性质。
Weisner定理
对于一个格P,设0^是其中的最小元素,1^是它的最大元素。那么对于任意的元素a,我们找到所有满足x\ora=1^的元素x。Weisner定理指出,x\ora=1^∑μ(0^,x)=0。我们这样来证明:枚举所有的x,而在后面乘上一个因子,使得这个因子只在x\ora=1^时取1,否则取0。这个因子就是y≥(x\ora)∑μ(y,1^)——如果x\ora=1^,那么y只能取1^,因此它就写成μ(1^,1^)=1;如果x\ora=1^,即x\ora<1^,我们要说明这条链上的所有μ(y,1^)之和为0。这个事实其实和莫比乌斯函数定义中的x≤z≤y∑μ(x,z)=0是对称的,我们在定义莫比乌斯函数的时候是用“左逆”来求得,因此得到了所有与起点关联的函数值之和为0,如果我们用“右逆”再尝试一次就会发现所有与终点关联的函数值之和也是0了。于是这样就证明了恒等式x\ora=1^∑μ(0^,x)=x∑(μ(0^,x)⋅y≥(x\ora)∑μ(y,1^)),交换求和顺序可得y≥a∑(μ(y,1^)x≤y∑μ(0^,x))。而x≤y∑μ(0^,x)=0^≤x≤y∑μ(0^,x),根据莫比乌斯函数的定义它就等于0。这样我们就证明了Weisner定理。
Weisner定理为我们提供一个方便地归纳求解莫比乌斯函数的方法。对这个定理移项可以得到μ(0^,1^)=−x\ora=1^,x=1^∑μ(0^,x),因此我们只要计算出底下的莫比乌斯函数就可以由此推出顶部的莫比乌斯函数。比如,整数的整除关系的偏序集是格,最小上界就是最小公倍数,最大下界就是最小公倍数,那么我们就可以用归纳法重新求解数论莫比乌斯函数的表达式:首先对于素数p,μ(p)=−μ(1)=−1。对于一般的n,质因数分解为n=p1α1⋯pkαk。我们将Weisner定理中的a取为p1,那么x\ora=1^∑μ(0^,x)=0=lcm(x,p1)=n∑μ(x)=0,即μ(n)=−lcm(x,p1)=n,x=n∑μ(x)。如果α1>1,那么x必须取n才能使lcm(x,p1)=n,少了任何一个因子都不行,而x又不能等于n,所以直接得到μ(n)=0;否则α1=1,此时x只能取n/p1,少了别的任何一个因子都不行,因此μ(n)=−μ(n/p1)。这样归纳下去,得到的结论和我们之前根据定义计算得到的数论莫比乌斯函数是一致的。
划分的莫比乌斯函数
考虑“划分”的偏序集:一种划分方案对应着偏序集里的一个元素,而如果划分π1是π2的加细(在原来的基础上分得更细),就定义π1≤π2。简单起见,我们以整数集合[n]的划分为例。我们可以验证这个划分是一个格,合并就是上界,拆散就是下届。每个元素单独划分就是0^,所有元素打包就是1^。
求解μ(0^,1^)
莫比乌斯函数是被偏序关系决定的(Hasse图),我们发现,对于划分我们其实只关心待划分的元素个数,而不在意元素是什么。要计算任意两个划分的莫比乌斯函数μ(π1,π2),其实都可以还原到最简单的情形μ(0^,1^)——假如π2中有多个集合,那么我们可以考虑每个集合内部的划分,这些划分都是μ(x,1^)的形式的,我们把这些莫比乌斯函数计算出来然后按照之前定义的“偏序集的乘法”把他们乘在一起就好了;而对于每个μ(x,1^),我们的划分x其实是若干个集合,在我们的考虑内没有必要更细了,因此每个集合其实就是一个元素,所以其实它就等于μ(0^,[k])。(我们所说的“就是”,其实是通过构建一个同构的新偏序集,并且证明这两个偏序集上的莫比乌斯函数相等)
所以关键只要求出μ(0^,1^)。下面我们证明,μ(0^,1^)=(−1)n−1(n−1)!。
归纳法。当n=1时等于1,满足;当n≥2时,运用Weisner定理,取a={{1,2},{3},{4,},⋯,{n}},即在0^的基础上将1,2合并。那么μ(0^,1^)=−π\ora=1^,π=1^∑μ(0^,π)。如果π将1,2分在了同一个集合,那么为了使它和a合并后形成[n],如果π=[n]就一定不可能,因此1,2不能属于同一个集合;除了含1和含2的集合以外,不能有第三个集合,不然也无法合并成一个集合。综上我们发现,π只能把元素分成两个集合S1,S2,其中1∈S1,2∈S2。那么μ(0^,π)=μ(0^,{S1})⋅μ(0^,{S2}),而由于我们是归纳法,这两个函数都已经得到了:μ(0^,{S1})=(−1)∣S1∣−1(∣S1∣−1)!,μ(0^,{S2})=(−1)∣S2∣−1(∣S2∣−1)!。枚举所有可能的π,这相当于对{3,⋯,n}枚举子集T,得到μ(0^,1^) =−T∑μ(0^,{1,T})μ(0^,{2,TC})=−k=0∑n−2(kn−2)(−1)kk!(−1)n−k−2(n−k−2)! =k=0∑n−2k!(n−2−k)!(n−2)!(−1)n−1k!(n−k−2)!=(n−1)(n−2)!(−1)n−2=(−1)n−1(n−1)!
完全图的连通生成子图计数
来看用到划分的莫比乌斯函数的一个例子。我们很熟悉图的生成树,相应的也有“生成图”的概念。一个连通生成子图是指在原图里挑出一些边,使得这些边使得所有点连通。生成树当然是一个连通生成子图。现在我们保证原图是完全图(任意两个点之间都有边),想统计所有可能的连通生成子图的个数。
要应用划分的莫比乌斯函数的话,我们可以把图的连通性看作一种“划分”,每个连通块在划分中都被划在了同一个集合,不同的连通块就是不同的集合。于是对于划分π,我们定义函数g(π)表示在划分π下(连通块情况)的生成子图的个数,再定义f(π)=π′≤π∑g(π′),表示所有在π的基础上加细的所有连通情况下生成子图的个数之和——这是容易计算的,只要不取连通块之间的边,每个内部的边都可以乱选,所以假如π写作{S1,⋯,St},第i个集合内有∣Si∣个点,因此完全图里有(2∣Si∣)=2∣Si∣(∣Si∣−1)条边,因此f(π)=i=1∏t22∣Si∣(∣Si∣−1)。
那么根据f(π)=π′≤π∑g(π′)莫比乌斯反演(注意又是不等号反过来的那种情况),得到g(π)=π′≤π∑μ(π′,π)f(π′)。而莫比乌斯函数的求法我们已经通过“划分”的“格”得到了。
快速Zeta变换
我们回到最初定义莫比乌斯函数的矩阵,我们把这个矩阵写作了zeta函数ζ(x,y)=1[x≤y]。对于给定的f,计算ζf的复杂度就是暴力做矩阵乘法(矩阵乘向量)的复杂度,为O((2n)2)=O(4n)。
而我们知道ζ函数其实是在枚举子集,而我们所做的计算其实是在考虑每个子集的子集。子集可以用二进制来表示,那子集的子集就可以用三进制来表示,因此应当存在一个O(3n)的做法。这也并不困难,这个问题的优化就在于利用ζ的性质——上三角矩阵。因此对于大小为k的子集(某一行),我们只需要遍历2k个元素。由此可得总的复杂度为O(k=0∑n(kn)2k)=O((1+2)n)=O(3n)。
还有更快的方法。我们对于矩阵ζ的某一行(记作01向量(x1,⋯,xn)),我们是要寻找所有满足yi≥xi的向量y的f(y)并求和。我们可以动态规划来尝试解决这个问题:定义dp(k,x1,⋯,xk,xk+1,⋯,xn)表示对所有前k维≥xi而后n−k维=xi的向量y对应的f(y)求和。那么对于每个k,如果xk=1则dp(k,x1,⋯,xn)=dp(k−1,x1,⋯,xn);如果xk=0,则在这基础上还要加上dp(k−1,x1,⋯,xk−1,1,xk+1,⋯,xn)这一项。初始时对于所有x,k=0时就是f(x)本身;而我们要的答案就是各个x在k=n时的dp值。我们看到状态转移的复杂度是O(1)的,状态数为O(n⋅2n),这就是时间复杂度了。这个方法就被成为“快速Zeta变换”。
快速莫比乌斯变换
快速Zeta变换完成的工作就是对所有二进制串x求出了x≤y∑f(y),这里ζ函数被隐含在了对遍历的限制条件x≤y中。对应的,快速莫比乌斯变换就是要对所有x求出x≤y∑μ(x,y)f(y)。
我们采用完全相同的动态规划方法:定义dp(k,x1,⋯,xk,xk+1,⋯,xn)表示对所有前k维≥xi而后n−k维=xi的向量y对应的μ(x,y)f(y)求和。那么对于每个k,如果xk=1则dp(k,x1,⋯,xn)=dp(k−1,x1,⋯,xn);如果xk=0,则还要加上一项,但不能像Zeta变换一样加dp(k−1,x1,⋯,xk−1,1,xk+1,⋯,xn)这一项,因为在这里x变化了,而我们想要的μ(x,y)中的x是原来的x。所以想要用这个状态,对于每个y都要必须除掉μ((x1,⋯,xk−1,1,xk+1,⋯,xn),y),乘上μ((x1,⋯,xn),y)。对于子集的偏序集,我们导出过μ(x,y)=(−1)k,其中k是x,y中不同位的个数。于是我们直接得到这两个莫比乌斯函数的比值为−1——也就是说此时的状态转移与Zeta变换相比,把“加上多出来的一项”改为“减去”就好了,其他与快速Zeta变换完全一致。初始化时对于所有x,k=0时也还是μ(x,x)f(x)=f(x)本身。这称为“快速莫比乌斯变换”。
快速集合卷积
为了更好地看到“集合卷积”的意义,我们来看一个“q-着色”问题:用q种颜色给图着色,要求同一条边两端颜色必须不同,求方案数。
着色问题其实是要求我们把图分成q个独立集,每个独立集内的点染相同颜色,就得到了一个可行的方法。也就是我们要统计不同的独立集的选法的总数。如果定义一个“集合上的卷积”,就可以更清晰地描述“q个独立集”这件事——
集合卷积(f∗g)(Z)定义为X⊆Z∑f(X)⋅g(Z∖X)。于是对于图上的点集S,我们定义一个函数f(S)当且仅当S是独立集时返回1,否则返回0。所以一个“2-着色”的解就是(f∗f)(V),即对于所有把点分成两部分的划分,当且仅当它们都分别是独立集时产生贡献1。相应的,q-着色问题的解就是(Sq)(V),做q次卷积。
因此问题是,如何快速地计算集合卷积?我们有一个奇妙的方法,这个方法和用快速傅里叶变换计算多项式卷积有着精神上的相似性。或者说,“快速集合卷积”和“多项式卷积”都是某个更根本的东西的投影。在快速多项式卷积中,最关键的是我们把要做卷积的函数“变换”成了另一个函数,在这种变化下卷积被转化为了简单的乘法,而再通过逆变换我们由得到了这个函数的原始形态。由于“变换”的复杂度优于“卷积”的复杂度,因此我们得到了更高效的算法。快速集合卷积也是相似的,在这里“快速傅里叶变换”被我们的“快速Zeta变换”,而它的逆变换就是“快速莫比乌斯变换”。下面我们来证明这一点:
在证明之前,我们需要对我们要证明的对象进行一些细节上的修正:第一点是,我们需要修改集合卷积的定义,去掉“两个集合没有交集”这一条限制,定义“覆盖卷积”∗c为(f∗cg)(Z)=X∪Y=Z∑f(X)g(Y)。为了能够用覆盖卷积来表示集合卷积,我们修改函数f,g的定义,定义fi(X)=1[∣X∣=i]⋅f(X),也就是在原本函数上附加上一个限制大小的条件。这样我们就可以把原本的集合卷积写作X∪Y=Z,X∩Y=∅∑f(X)⋅g(Y)写作i=0∑n(X∪Y=Z∑fi(X)gn−i(Y))=i=0∑n(fi∗cgn−i)(Z),也即f∗g=i=0∑n(fi∗cgn−i)。第二点是,要能够满足与傅里叶变换类似的性质,我们需要把ζ函数ζ(x,y)=1[x≤y]的定义修改为ζ(x,y)=1[x≥y]。
这样我们就可以来证明“快速集合卷积”ζ(f∗cg)(Z)=ζf(Z)⋅ζg(Z)了。(其中(Z)就代表当前考虑结果向量的某一行。)直接通过定义来验证即可:ζ(f∗cg)(Z)=Y⊆Z∑(f∗cg)(Y),根据覆盖卷积的定义,=Y⊆Z∑A∪B=Y∑f(A)g(B),这等价于(A∪B)⊆Z∑f(A)f(B),先枚举A,在固定A的前提下枚举B,则等价于A⊆Z∑(f(A)⋅(B⊆Z∑g(B))),两者相互独立,因此直接写作(A⊆Z∑f(A))(B⊆Z∑g(B)),而这就是与ζ函数相乘的定义,因此就是ζf(Z)⋅ζg(Z)。
这样我们就得到了一个快速解决q-着色问题的算法:首先我们要预处理函数f(S),S的取值有2n个,对于每个取值我们只需要遍历每条边验证即可,并预处理限制了大小的函数fi,因此总复杂度不超过O(2n⋅poly(n))。我们总共做O(q)次集合卷积,每次集合卷积需要O(n)转化为覆盖卷积,求解每个覆盖卷积需要进行两次快速Zeta变换,相乘后再用快速莫比乌斯变换转化为原来的函数。以上的每一个步骤都是不超过O(2n⋅poly(n))的,因此最终复杂度就是O(2n⋅poly(n))。