• sss


    Preface

    前排提示:本文数学公式较多,加载$LaTeX$需要一定时间,可能会导致浏览器暂时卡顿,请耐心等待数学公式正常显示.

    上一篇:『组合数学总结1:基础组合数学和组合原理』

    (mathrm{Update}):生成函数内容已经结束,由于生成函数和多项式算法的关系更大,所以本文暂时停更,先更新多项式算法.

    生成函数

    形式幂级数

    对于形如:

    (A(x)=sum_{i=0}^{infty}a_ix^i)

    这样的多项式我们称之为形式幂级数.

    形式幂级数是一个抽象的数学概念,我们从来不指定$x$的值,因为其没有确切意义,也不关心求和的收敛与发散问题,只关心形式幂级数的系数,也就是$a_i$的值.

    普通型生成函数

    定义

    对于一个数列${f_i}(,我们定义它的普通型生成函数()mathrm{Ordinary Generating Function}(,简称)mathrm$)为一个形式幂级数:

    (F(x)=sum_{i=0}^ infty f_ix^i)

    其中$f_n$又称为$x^n$在$F(x)$中的系数,取系数的符号记作:(f_n=[x^n]F(x)).

    四则运算

    生成函数可以进行四则运算和微积分,我们需要了解运算法则.

    首先,生成函数的加减法运算与多项式的加法运算相同:

    (left( sum_{i=0}^infty f_ix^i ight)pm left( sum_{i=0}^infty g_ix^i ight)=sum_{i=0}^infty (f_ipm g_i)x^i)

    于是我们可以得知生成函数具有线性性,也就是说如下两条运算法则成立:

    $$c imes left( sum_infty f_ixi ight)=sum_infty cf_ixi alpha left( sum_infty f_ixi ight)+etaleft( sum_infty g_ixi ight)=sum_infty (alpha f_i+eta g_i)xi $$

    其实,生成函数的乘法运算和多项式的乘法运算的定义也是一样的,我们可以考虑$f_n xn$与$g_m xm$乘积的系数回累加到$x^{n+m}$上,所以可以这样定义乘法:

    (left( sum_{i=0}^infty f_ix^i ight) imes left( sum_{i=0}^infty g_ix^i ight)=sum_{i=0}^inftyleft(sum_{j=0}^if_j imes g_{i-j} ight)x^i)

    我们也称${h_i}={sum_^i f_j imes g_}(为数列){f_i}(和){g_i}$的卷积

    平行位移

    我们可以对一个生成函数乘上$x$的若干次幂,达到系数平行位移的效果.

    $$xmleft( sum_infty f_ixi ight)=sum_infty f_xi x{-m}left( sum_infty f_ixi ight)= sum_infty f_{i+m}xi$$

    微积分

    生成函数的微积分就是多项式的微积分:

    $$frac{mathrm}{mathrmx}left( sum_infty f_ixi ight)=sum_infty (i+1)f_{i+1}xi intleft( sum_infty f_ixi ight)mathrmx=sum_inftyfrac{f_}xi+mathrm$$

    不定积分会带一个常数$mathrm(,这是常识了,一般我们就看)int F(0)mathrmx$是不是我们所期望的数字,再来决定$mathrm$就可以了,通常来说是$0$.

    常见数列的普通型生成函数

    由于在形式幂级数中我们不在乎$x$的取值,所以我们一般都可以把形式幂级数表示成跟简单的形式,然后再用于生成函数的有关计算.

    就比如说,我们要求数列${f_i}={1,1,1,cdots}$的生成函数:

    (F(x)=sum_{i=0}^infty x^i=frac{1-x^{n}}{1-x})

    让$n ightarrow infty$就好,这里用到了等比数列求和公式. 此时,如果我们令$xin (-1,1)$,那么就有:

    (F(x)=sum_{i=0}^infty x^i =frac{1}{1-x})

    利用平移技巧,我们可以得知: (sum_{i=m}^infty x^i=frac{x^m}{1-x})

    利用整体换元,我们还可以知道:

    (sum_{i=0}^infty c^i x^i=frac{1}{1-cx})

    令$c=-1$,还可以得到数列${f_i}={1,-1,1,-1,cdots}$的生成函数:

    (F(x)=sum_{i=0}^n(-1)^ix^i=frac{1}{1+x})

    下面我们来看几个复杂一点的生成函数:

    $1.$ ({f_i}={inom{k-1}{0},inom{k}{1},inom{k+1}{2},cdots})(F(x)=frac{1}{(1-x)^k})

    证明:

    (F(x)=frac{1}{(1-x)^k}=left( sum_{i=0}^infty x^i ight)^k)

    可以考虑

    ([x^n]F(x)=sum_{sum_{i=1}^kt_i=n}1)

    用隔板法就可以求出$[x^n]F(x)=inom{n+k-1}$,故得证.

    令$k=2$,还可以得知${f_i}={1,2,3,cdots}$的生成函数$F(x)=frac{1}{(1-x)^2}$.

    $2.$ ({f_i}={inom{n}{0},inom{n}{1},inom{n}{2},cdots})(F(x)=(1+x)^n)

    证明:直接用广义二项式定理展开右边就好.

    $3.$ ({f_i}={0,1,frac{1}{2},frac{1}{3},cdots})(F(x)=ln frac{1}{1-x})

    证明:

    (frac{mathrm{d}}{mathrm{d}x}F(x)=frac{mathrm{d}}{mathrm{d}x}sum_{i=0}^infty f_i x^i=sum_{i=0}^infty x^i=frac{1}{1-x})

    两边同时求一个不定积分:

    (F(x)=int frac{mathrm{d}}{mathrm{d}x}F(x) mathrm{d}x=int frac{1}{1-x}mathrm{d}x=lnfrac{1}{1-x}+mathrm{C})

    因为$F(0)=0$,所以可以得出$mathrm=0$.

    $4.$ ({f_i}={-0,1,-frac{1}{2},frac{1}{3},cdots})(F(x)=ln (1+x))

    证明:

    (frac{mathrm{d}}{mathrm{d}x}F(x)=frac{mathrm{d}}{mathrm{d}x}sum_{i=0}^infty f_i x^i=sum_{i=0}^infty (-1)^ix^i=frac{1}{1+x})

    两边同时求一个不定积分:

    (F(x)=int frac{mathrm{d}}{mathrm{d}x}F(x) mathrm{d}x=int frac{1}{1+x}mathrm{d}x=ln(1+x)+mathrm{C})

    因为$F(0)=0$,所以可以得出$mathrm=0$.

    总结

    下表给出常见数列的普通型生成函数和常见的生成函数变换技巧.

    (mathrm{Sequence}) (mathrm{Ordinary Generating Function})
    (langle1,1,1,cdots angle) (F(x)=frac{1}{1-x})
    (langle1,2,3,cdots angle) (F(x)=frac{1}{(1-x)^2})
    (langle1,-1,1,cdots angle) (F(x)=frac{1}{1+x})
    (leftlangleinom{k-1}{0},inom{k}{1},inom{k+1}{2},cdots ight angle) (F(x)=frac{1}{(1-x)^k})
    (leftlangleinom{n}{0},inom{n}{1},inom{n}{2},cdots ight angle) (F(x)=(1+x)^n)
    (langle c^0,c^1,c^2,cdots angle) (F(x)=frac{1}{1-cx})
    (langle0,0,1,1,cdots angle) (F(x)=frac{x^2}{1-x})
    (langle1,0,1,0,1,cdots angle) (F(x)=frac{1}{1-x^2})
    (leftlangle0,1,frac{1}{2},frac{1}{3},cdots ight angle) (F(x)=ln frac{1}{1-x})
    (leftlangle-0,1,-frac{1}{2},frac{1}{3},cdots ight angle) (F(x)=ln frac{1}{1+x})

    指数型生成函数

    定义

    对于一个数列${f_i}(,我们定义它的指数型生成函数()mathrm{Exponential Generating Function}(,简称)mathrm$)为一个形式幂级数:

    (hat{F}(x)=sum_{i=0}^ infty f_ifrac{x^i}{i!})

    也就是说,我们使用符号$hat(x)$表示函数的时候,就默认是指数型生成函数,而$F(x)$默认是普通型生成函数.

    相信大家都已经注意到了指数型生成函数与普通型生成函数的区别,我们在级数求和的每一项处都除掉了$i!$,其实意义就是除掉的组合对象的标号。

    为什么要除掉标号?就比如说$F(x)(代表全排列的普通型生成函数时,就很难写出其收敛形式,不便于运算. 而如果用)hat(x)(表示全排列的指数型生成函数,那么很容易得出)hat(x)=frac{1}{1-x}$. 在定义指数型生成函数的运算之后,我们就可以方便的用收敛形式进行运算,得到结果输出时,再把标号乘上去即可. 这里也就解释了为什么指数型生成函数都是用于计算带标号组合对象的.

    四则运算

    指数型生成函数也可以进行四则运算,其定义如下:

    (left( sum_{i=0}^infty f_ifrac{x^i}{i!} ight)pm left( sum_{i=0}^infty g_ifrac{x^i}{i!} ight)=sum_{i=0}^infty (f_ipm g_i)frac{x^i}{i!})

    $$c imes left( sum_infty f_ifrac{xi}{i!} ight)=sum_infty cf_ifrac{xi}{i!} $$

    两个指数型生成函数的卷积我们需要特别注意一下,因为指数型生成函数对应的都是有标号组合对象,所以卷积需要通过二项式系数卷积的形式来重新分配标号. 巧合的是,卷积的结果仍为指数型生成函数.

    (left(sum_{i=0}^infty f_ifrac{x^i}{i!} ight) imes left(sum_{i=0}^infty g_ifrac{x^i}{i!} ight)=sum_{i=0}^infty left(sum_{j=0}^i {ichoose j}f_jg_{i-j} ight)frac{x^i}{i!})

    微积分

    根据指数型生成函数的定义式,我们很快可以写出指数型生成函数进行微积分的结果:

    $$frac{mathrm}{mathrmx}left( sum_infty f_ifrac{xi}{i!} ight)=sum_infty f_{i+1}frac{xi}{i!} intleft( sum_infty f_ifrac{xi}{i!} ight)mathrmx=sum_infty f_frac{xi}{i!}+mathrm$$

    容易发现,微积分对应了数列左移$/$右移后的指数型生成函数,不过这时候组合意义就消失了.

    洛必达法则和泰勒多项式

    在指数型生成函数的收敛形式求解中,我们可能要使用更多的高数知识,这里列出最重要的两个供大家回顾.

    $1.$ 洛必达法则

    若函数$f$和$g$满足以下条件:

    (lim _{x ightarrow x_0} f(x)=lim _{x ightarrow x_0}g(x)=0, lim _{x ightarrow x_0}frac{f'(x)}{g'(x)}=A)

    且在$x$在某去心领域$overset{circ}{mathrm}(x_0)$两函数均可导,(g'(x) ot = 0),则有:

    (lim _{x ightarrow x_0}frac{f(x)}{g(x)}=lim _{x ightarrow x_0}frac{f'(x)}{g'(x)}=A)

    $2.$ 泰勒多项式

    对于函数$f$,设它在点$x_0$存在直到$n$阶的导数,则我们由这些导数构造一个$n$次多项式:

    (mathrm{T}_n(x)=f(x_0)+frac{f'(x_0)}{1!}(x-x_0)+frac{f''(x_0)}{2!}(x-x_0)^2+cdots + frac{f^{(n)}(x_0)}{n!}(x-x_0)^n)

    称为$f$在$x_0$处(带有佩亚诺余项型)的泰勒多项式,$mathrm_n(x)$的各项系数称为泰勒系数.

    泰勒公式:

    (f(x)=mathrm{T}_n(x)+mathcal{O}((x-x_0)^n))

    其中泰勒多项式$mathrm_n(x)$为所有$n$次及更低次多项式中在$x_0$点附近对原函数的最佳近似,在$x ightarrow x_0$时,$mathcal((x-x_0)^n)(为比)(x-x_0)^n$更高阶的无穷小.

    $x_0=0$时的泰勒公式也称为麦克劳林公式: (f(x)=f(0)+frac{f'(0)}{1!}x+frac{f''(0)}{2!}x^2+cdots + frac{f^{(n)}(0)}{n!}x^n+mathcal{O}(x^n))

    常见的泰勒公式例子:

    原函数 泰勒展开
    (e^x) $1+frac{1!}+frac{x2}{2!}+cdots +frac{xn}{n!}+cdots$
    (sin (x)) (x-frac{x^3}{3!}+frac{x^5}{5!}+cdots+(-1)^nfrac{x^{2n+1}}{(2n+1)!}+cdots)
    (cos (x)) $1-frac{x2}{2!}+frac{x4}{4!}-cdots+(-1)nfrac{x{2n}}{(2n)!}+cdots$
    (ln (1+x)) (x-frac{x^2}{2}+frac{x^3}{3}-cdots+(-1)^{n+1}frac{x^n}{n}+cdots)
    (frac{1}{1+x}) $1-x+x2-x3+cdots+(-1)n xn+cdots$
    ((1+x)^a) $1+ax+frac{a^{underline 2}}{2!}x2+cdots+frac{a{underline }}{n!}x^n+cdots$

    常见数列的指数型生成函数

    首先是排列数的指数型生成函数,({f_i}={0!,1!,2!,cdots})(hat{F}(x)=frac{1}{1-x}),这个就是直接把标号除掉了.

    然后我们可以考虑其他常见数列的指数型生成函数:

    $1.$ ({f_i}={1,1,1,cdots})(hat F(x)=e^x)

    证明:将$e^x$在原点泰勒展开即可.

    $2.$ ({f_i}={1,c,c^2,cdots})(hat F(x)=e^{cx})

    证明:把$1.$式中的$x$代入$cx$即可.

    $3.$ ({f_i}={overbrace{0,0,cdots,0}^{k-1 mathrm{times}},k^{underline{k}},(k+1)^{underline{k}},cdots})(hat F(x)=e^x x^k).

    证明:

    (hat F(x)=sum_{i=k}^infty i^{underline k}frac{x^i}{i!}=sum_{i=k}^infty frac{x^i}{(i-k)!}=e^xx^k)

    $4.$ 环排列的指数型生成函数:(hat F(x)=ln frac{1}{1-x}).

    证明:

    $n$个数组成环排列的方案数为$(n-1)!(,代入)mathrm(的定义式后可以化简为){f_i}={0,1,frac{1}{2},frac{1}{3},cdots}(的)mathrm(. 也可以看作全排列的)mathrm$右移一位,只要积分一下即可,结果是一样的.

    总结

    下表给出常见数列的指数型生成函数和常见的生成函数变换技巧.

    (mathrm{Sequence}) (mathrm{Exponential Generating Function})
    (langle0!,1!,2!,cdots angle) (hat F(x)=frac{1}{1-x})
    (langle1,1,1,cdots angle) (hat F(x)=e^x)
    (langle1,c,c^2,cdots angle) (hat F(x)=e^{cx})
    (leftlangleoverbrace{0,0,cdots,0}^{k-1 mathrm{times}},k^{underline{k}},(k+1)^{underline{k}},cdots ight angle) (hat F(x)=e^x x^k)
    (leftlangle 0,0!,1!,2!,cdots ight angle) (hat F(x)=ln frac{1}{1-x})
    (leftlangle 1!,2!,3!,4!,cdots ight angle) (hat F(x)=frac{1}{(1-x)^2})

    生成函数的运用

    生成函数的直接运用其实就是解析数列,有时候可以求通项,当然还有计数什么的,不过这个就要根据具体题目而论了.

    斐波那契数列

    斐波那契数列${f_i}$的定义是这样的:

    (f_i=egin{cases}0,&i=0\1,&i=1\ f_{i-1}+f_{i-2},&igeq2end{cases})

    常系数线性递推数列的特征方程解法.

    设其普通型生成函数为$F(x)$,可以根据平行位移的技巧写出等式:

    (F(x)=x+xF(x)+x^2F(x))

    可以把$F(x)$看作主元解方程,得到$F(x)=frac{1-x-x^2}$,这就是斐波那契数列的生成函数.

    根据常识,常系数线性递推方程的解是等比数列,现在我们要求通项,也就是说要把生成函数转化成等比数列生成函数的样子.

    斐波那契数列的解一定是两个等比数列的复合,我们不妨设这两个等比数列的生成函数为$A(x)=frac{alpha}{1-varphi_1 x}$,(B(x)=frac{eta}{1-varphi_2x}).

    首先应该有$(1-varphi_1x)(1-varphi_2x)=1-x-x^2$,那么解得$varphi_1=frac{sqrt 5+1}{2}(,)varphi_2=frac{sqrt 5 -1}{2}$.

    然后就有$alpha (1-varphi_2x)+eta(1-varphi_1x)=x$,展开联立方程组:

    $$eginalpha + eta=0 varphi_1eta+varphi_2alpha=-1 end$$

    解得$alpha=frac{1}{sqrt 5}(,)eta=-frac{1}{sqrt 5}$.

    $$F(x)=A(x)+B(x)=frac{alpha}{1-varphi_1 x}+frac{eta}{1-varphi_2x} =frac{1}{sqrt 5}left( frac{1}{1-varphi_1x}-frac{1}{1-varphi_2x} ight)=frac{1}{sqrt 5}left( sum_infty (varphi_1i-varphi_2i) xi ight) Rightarrow [xn]F(x)=frac{ varphi_1n-varphi_2^n}{sqrt 5}=frac{1}{sqrt 5}left(frac{sqrt 5+1}{2} ight)^n-frac{1}{sqrt 5}left(frac{sqrt 5-1}{2} ight)^n$$

    卡特兰数列

    卡特兰数列${c_i}$的定义是这样的:

    (c_i=egin{cases}1,&i=0\ sum_{j=0}^{i-1}c_jc_{i-j-1},&igeq1end{cases})

    设其普通型生成函数为$C(x)$,我们同样可以尝试列出方程.

    考虑到其定义式有点像自己和自己的卷积,我们可以看看$C^2(x)$长什么样:

    (C^2(x)=sum_{i=0}^{infty}left(sum_{j=0}^i c_ic_{j-i} ight)x^i=sum_{i=0}^infty c_{i+1}x^i)

    那么就可以列出方程了:

    (C(x)=1+xC^2(x))

    解得:

    (C(x)=frac{1pmsqrt{1-4x}}{2x})

    这玩意的生成函数有两个,不可能!! 我们肯定要尝试代入特殊值舍掉其中之一. 由于$x ot= 0$时不确定级数是否收敛,我们也无法验证答案是否正确,那么肯定是要尝试代入$x=0$的.

    考虑到$x$作为分母不能等$0$,那么我们就让$x ightarrow0$试试看. 显然有:

    (lim_{x ightarrow 0}frac{1+sqrt{1-4x}}{2x}=infty)

    所以取正号肯定是不可能的了,不确定的话可以把负号代入试试看,需要用洛必达法则求一下极限:

    $$lim_{x ightarrow 0}frac{1-sqrt{1-4x}}{2x}=lim_{x ightarrow 0}frac{-frac{1}{2}(1-4x)^{-frac{1}{2}} imes(-4)}{2} =lim_{x ightarrow 0}frac{1}{sqrt {1-4x}}=1=c_0$$

    求通项公式的话,可以把$sqrt{1-4x}$ 广义二项式定理展开一下:

    $$[xn]sqrt{1-4x}=[xn]sum_^infty{frac{1}{2}choose i}(-4x)^i=(-4)^n{frac{1}{2}choose n} =(-2)nfrac{1(1-2)(1-4)cdots(3-2n)}{n!} =(-1)2nfrac{1 imes 3 imes cdots imes (2n-3)}{n!}=frac{{2nchoose n}}{1-2n}$$

    然后代回生成函数:

    $$C(x)=frac{1+sum_inftyfrac{{2nchoose n}}{2i-1}xi}{2x} =sum_infty frac{1}{2(2i+1)}{2i+2choose i+1}xi=sum_inftyfrac{{2ichoose i}}{i+1}xi$$

    Bell数列

    $mathrm$数列第$n$项的定义是把$1sim n$的正整数分配到若干个集合中的方案数,因此可以看作是第二类斯特林数的和.

    可以考虑写出$mathrm$数列的递推式:

    (w_n=[n=0]+sum_{i=1}^n{n-1choose i-1}w_{n-i})

    可以看出,等式最右边的一项是${1}(和){w_i}$二项卷积$n-1$次项的系数,等式的左边是$n$次项系数,可以用积分平移一下,列出关于生成函数的方程:

    (hat W(x)=1+int e^xhat W(x) mathrm{d}x)

    两边同时求导,得到一个微分方程:

    (frac{mathrm{d}hat W(x)}{mathrm{d}x}=e^xhat W(x)Rightarrow frac{hat W'(x)}{hat W(x)}=e^x)

    等式左右两侧同时求不定积分:

    (int frac{hat W'(x)}{hat W(x)}mathrm{d}x=ln hat W(x)=int e^x mathrm{d}x=e^x+mathrm{C})

    那么我们就可以得到初等函数解了:(hat W(x)=e^{e^x+mathrm{C}}).

    由于$hat W(0)=w_0=1$,可以确定常数$mathrm=-1$,那么$hat W(x)=e^{e^x-1}$.

    错位排列

    在考虑错位排列的生成函数之前,我们需要先考虑一下指数型生成函数的组合意义.

    不妨看这个例子:全排列的指数型生成函数$hat F(x)=frac{1}{1-x}(,环排列的指数型生成函数是)hat G=ln frac{1}{1-x}(,有)hat F=e^{hat G(x)}$,这是巧合吗?

    我们可以看看$e^x$这个函数的$mathrm$展开:

    (e^{hat G(x)}=sum_{i=0}^infty frac{hat G^i(x)}{i!})

    我们知道,每一个排列都可以被分解为确定个数的置换环. 对于${1,2,cdots ,n}(的自然数,构造一个置换环的方案数恰为)[xn]hat G(x) imes n!(. 由于自然数有标号,所以){1,2,cdots ,n}$的自然数构造$i$个置换环的方案数恰为$[xn]hat G^i(x) imes n!(,当然这里的乘法拼接就是)mathrm$的二项卷积了.

    所以$e^{hat G(x)}$的组合意义就是枚举排列的置换环个数$i$,并用对应方案数的生成函数进行二项卷积,除掉$i!$后的累加和. 为什么除掉$i!(,是因为置换环之间是没有标号的. 这不正好就是全排列的)mathrm$吗?

    无独有偶,我们可以把$ex-1$看作把自然数放到一个集合中方案数的$mathrm$,那么$e{e^x-1}(就是把自然数放到若干集合中方案数的)mathrm(,恰好符合)mathrm$数的定义.

    因此,我们可以归纳出$exp$函数在生成函数运算上的组合意义:设有标号组合对象$A$的指数型生成函数为$hat A(x)(,)[xn]hat A(x) imes n!$表示组合$n$个元素的方案数,那么$hat B(x)=e{hat A(x)}$就是把元素划分为若干无标号不交并,每一个子集内当作组合对象$A$来处理,所对应的$mathrm$.

    那么这样的话错位排列的生成函数就很好考虑了:错位排列等价于不存在置换环大小为$1$的排列,因此其也可以划分为若干置换环,只不过大小不能为$1$. 根据上面的讨论,我们把$ln frac{1}{1-x}$减掉$x$,也就是减掉大小为$1$置换环的方案数对应的系数,那么再$mathrm(一下就是错排的方案数)mathrm$了.

    (hat D(x)=e^{ln frac{1}{1-x}-x}=frac{e^{-x}}{1-x})

    你要是愿意的话,可以$mathrm$展开验证一下前几项,结果与我们熟知的错排数列完全相同.

    简单无向连通图计数

    首先$n$个点的有标号简单无向图的方案数是$2^{{nchoose 2}}(,那么设)hat F(x)$为有标号简单无向图的生成函数:

    (hat F(x)=sum_{i=0}^infty 2^{{nchoose 2}}frac{x^i}{i!})

    假设有标号简单无向连通图的$mathrm(就是)hat G(x)(,那么显然有)hat F(x)=e^{hat G(x)}(,然后可以得到)hat G(x)=ln hat F(x)$.

    Epilogue

    正在施工...

  • 相关阅读:
    PHP多进程(四) 内部多进程
    STL map and multimap
    Understanding Function Objects
    Working with Bit Flags Using STL
    STL Algorithms
    STL set and multiset
    Understanding Smart Pointers
    More Effective C++ 学习笔记(1)
    Adaptive Container: stack and queue
    第一个 Python 程序
  • 原文地址:https://www.cnblogs.com/Parsnip/p/12585011.html
Copyright © 2020-2023  润新知