用生成函数推导数列的通项公式(重制版)
用生成函数推导数列的通项公式(重制版)
约定:
- \([p(x)]=\begin{cases}1 ,p(x)\text{为真}\\0,p(x)\text{为假} \end{cases}\)
- \(f^n(x)\)表示\((f(x))^n\)
- \(f^{(n)}(x)\)表示\(f(x)\)的\(n\)阶导数,一阶和二阶导数用\(f'(x)\)和\(f''(x)\)表示
- \([x^n]f(x)\)表示\(f(x)\)的第\(n\)项系数
- \(\binom{n}{m}\)表示从\(n\)个数中选出\(m\)个数的方案数
- \(n!\)表示\(n\)的阶乘
普通生成函数的定义与运算
定义:
为以x为未定元的一个形式幂级数。
在形式幂级数中,我们不关心x的取值和级数是否收敛,把x作为形式,只关心系数。形式幂级数可以看成一个无限项的多项式,它的运算和多项式是类似的。
生成函数可以被表示成形式幂级数的形式。
定义:
为数列\(\langle a_0,a_1\dots a_n\rangle\)的普通生成函数(Ordinary Generating Function,OGF)
当我们处理生成函数的时候,会出现两种形式。一是以系数\(\langle a_i\rangle\)表示的系数形式,这种形式利于用多项式算法处理. 二是以\(x\)表示的形式,如\(1+x+x^2+\dots\)可以表示为\(\frac{1}{1-x}\)
下面列出了一些形式幂级数的常用运算。在OI中,我们需要用一些多项式算法来实现这些运算,读者务必掌握这些多项式运算的求法多项式操作学习笔记中可以找到,下文中也会给出具体链接。
线性运算
直接\(O(n)\)模拟即可
系数平移
将\(\langle a_n\rangle\)向右平移\(m\)位,也就是在数列前面添加\(m\)个0,我们直接用\(x^m\)来乘
同理,向左移就是减去前\(m\)项,再除以\(x^m\)
乘法与乘法逆元
这就是普通卷积。实现见多项式乘法
若\(A(x)B(x)=1\)时称\(A(x),B(x)\)互为乘法逆元.
实现见多项式求逆
形式导数与积分
对于\(A(x)=\sum_{n \geq 0} a_nx^n\),定义
为形式导数.容易验证基本求导法则对形式幂级数也成立
直接\(O(n)\)模拟即可
这样我们就把我们发现这样系数有点错位,不妨再左移一位乘上\(x\)
微分把\(n\)乘到了系数里,积分把\(n\)除到了系数里
对数函数与指数函数
和多项式一样,形式幂级数的\(\ln,\exp\)运算是用泰勒展开定义的。
指数生成函数的定义与运算
有时我们发现数列\(\langle a_n\rangle\)的生成函数没有很好的性质,但数列\(\langle \frac{a_n}{n!}\rangle\)的生成函数性质很好.那么我们不妨定义一种新的生成函数来解决这个问题
定义:
为数列\(\langle a_0,a_1\dots a_n\rangle\)的指数生成函数(Exponential Generating Function,EGF)
有些资料上也把指数生成函数写成\(\hat{A}(x)\)。
EGF的运算和OGF是相似的,我们只要把\(\frac{1}{i!}\)看成系数的一部分,再按照OGF的运算法则做即可.因此这里不再给出式子.但是,阶乘的引入让某些EGF运算有美妙的性质
乘法(二项卷积)
设\(F(x),G(x)\)为数列\(\langle f_i\rangle,\langle g_i\rangle\),那么有
数列\(\langle h_n\rangle\)称为\(\langle f_n\rangle\)和\(\langle g_n\rangle\)的二项卷积(Binomial Convolution).也就是说,\(\langle f_n\rangle\)和\(\langle g_n\rangle\)的二项卷积等价于\(\langle \frac{f_n}{n!}\rangle\)和\(\langle \frac{g_n}{n!}\rangle\)的普通卷积
导数与积分
设\(A(x)=\sum_{n\geq 0}\frac{a_n}{n!}x^n\)
那么
\(A'(x)\)对应的数列为\(\langle a_1,a_2\dots\rangle\).也就是说,指数生成函数上的求导相当于普通生成函数的左移。同理,积分就相当于右移.
生成函数与数列
由通项公式求生成函数
数列 | 通项公式 | 生成函数 | 封闭形式 |
---|---|---|---|
\(\langle0,0,\dots 1,0,0 \dots \rangle\) | \(a_n=[n=m]\) | \(\sum_{n\geq 0}[n=m]x^n\) | \(x^m\) |
\(\langle1,1,\dots 1,1,1 \dots\rangle\) | \(a_n=1\) | \(\sum_{n\geq 0}x^n\) | \(\frac{1}{1-x}\) |
\(\langle1,0,0\dots 1,0,0\dots 1\dots \rangle\) | \(a_n=[n\bmod m=0]\) | \(\sum_{n\geq 0}[n\bmod m=0]x^n\) | \(\frac{1}{1-x^m}\) |
\(\langle1,2,3,4,5,6 \dots \rangle\) | \(a_n=n\) | \(\sum_{n\geq 0}n x^n\) | \(\frac{1}{(1-x)^2}\) |
\(\langle1,m,\binom{m+1}{2},\binom{m+2}{3} \dots \rangle\) | \(a_n=\binom{m+n-1}{m-1}\) | \(\sum_{n\geq 0}\binom{m+n-1}{m-1} x^n\) | \(\frac{1}{(1-x)^m}\) |
\(\langle1,m,m^2,m^3 \dots \rangle\) | \(a_n=m^n\) | \(\sum_{n\geq 0}m^nx^n\) | \(\frac{1}{1-mx}\) |
(3),(6)式可用\(\frac{1}{1-x}\)的泰勒展开式证明,把\(x\)代入即可。
(5)式用广义二项式定理即可.
由生成函数求通项公式
如果我们知道一个数列\(\langle a_n\rangle\)的递推公式,如何求它的通项公式?
- 把\(a_n\)用其他项表示成一个方程,该方程应该对所有\(n \in \mathbb{N}\)都成立,注意初始值,并规定\(a_{-n}=0(n>0)\).
- 乘上\(x^n\),对方程两边求和,左边就是\(\sum_{n \geq 0}a_nx^n=A(x)\),并把右边整理成关于\(A(x)\)和\(x\)的式子
- 解出\(A(x)\),此时应该是封闭形式
- 将封闭形式展开成幂级数形式,第\(n\)项系数即为答案
难点在第4步,一般可以套用上表中简单数列的生成函数组合而成。如果出现分式,考虑分解成\(\frac{a}{1-\rho x}\)的形式。如果有\(\ln,\exp\)等函数,考虑对其泰勒展开。如果出现根式,考虑用广义二项式定理。如果出现单独的\(x\)变量,可以考虑拉格朗日反演.
练习1: 推导斐波那契数列的通项公式。这里我们定义斐波那契数列为\(f_0=0,f_1=1,f_n=f_{n-1}+f_{n-2}(n \geq 2)\)
由于只能有一个方程,还要考虑初始值,我们需要把通项公式改写成对\(n \in \mathbb{N}\)都成立的形式.注意我们约定数列的负下标为0
乘上\(x^n\)并求和
根据生成函数中系数平移的定义
解得
于是我们就得到了\(F(x)\)的封闭形式。现在要把封闭形式展开成级数形式。我们可以利用我们熟悉的\(\frac{1}{1-ax}\)来把分子展开。不妨设\((1-\rho_1x)(1-\rho_2x)=1-x-x^2\). 得到\(\rho_1\rho_2=-1,\rho_1+\rho_2=-1\).也就是说,\(\rho_1,\rho_2\)为方程\(x^2-x-1=0\)的根。解得\(\rho_1=\frac{1-\sqrt{5}}{2},\rho_2=\frac{\sqrt{5}+1}{2}\).回代,将上面的系数凑成\(x\),得到
根据生成函数加法的定义,\(f_n=-\frac{1}{\sqrt{5}}(\frac{1-\sqrt{5}}{2})^n+\frac{1}{\sqrt{5}}(\frac{\sqrt{5}+1}{2})^n\)
实际上,出现的方程\(x^2-x-1=0\)就是特征根法求数列通项中的特征根方程,而分母将系数凑成\(x\)的过程就相当于特征根法中将初始值代入解出系数。
练习2:求卡特兰数的通项公式。卡特兰数\(c_n\)定义为\(n\)个点的无标号无根树数量.
观察得到\(c_n\)的递推式\(c_n=[n=0]+\sum_{i=0}^{n-1}c_ic_{n-i-1}\),设它的OGF为\(C(x)\),两边乘上\(x^n\)并求和
后面就是\(F(x)\cdot F(x)\)的第\(n-1\)项系数
通过求根公式解得
正负号应该怎么取呢?一个数列\(f\)的生成函数\(F(x)\)一定满足\(F(0)=f_0\),或者\(\lim_{x \to 0}F(x)=f_0\).
容易看出,当\(x \to 0\)时,\(\frac{1+\sqrt{1-4x}}{2x} \to +\infty\).不符合条件
而当\(x\to 0\)时\(\lim_{x \to 0}\frac{1-\sqrt{1-4x}}{2x}=\lim_{x \to 0} \frac{-\frac{1}{2\sqrt{1-4x}}\cdot (-4)}{2}=1=f_0\)
接着我们要展开\(\frac{1-\sqrt{1-4x}}{2x}\). 根据广义二项式定理有
这就得到了通项公式\(c_n=\frac{\binom{2n}{n}}{n+1}\).我们发现展开二项式的过程很繁琐,之后我们会介绍一种更简洁的推导
拉格朗日反演
复合与复合逆
定义: 形式幂级数\(F(w)=\sum_{n \geq 0}f_nw^n\)和\(G(x)=\sum_{n \geq 1}g_nx^n\)的复合为:
由于\(G(x)\)没有常数项,因此即使\(F(x)\)有无限多个非零项,这两个函数的复合仍然可以定义。
定义: 设\(F(w)=\sum_{n \geq 1}f_nw^n\)和\(G(x)=\sum_{n \geq 1}g_nx^n\),如果\(F(G(x))=x\),那么称\(F(w),G(x)\)互为复合逆(反函数)。容易得到\(F(G(x))=G(F(x))\)
拉格朗日反演定理
定理:若\(f(w)\)是\(g(x)\)的复合逆,那么
还有一个推论:
它可以帮助我们求多项式的某一项系数,可以用来展开生成函数得到通项。
练习:用拉格朗日反演推导卡特兰数的通项公式。
我们前面已经推导过:
令\(F(x)=C(x)-1\),我们要求的是\([x^n]F(x) (n \geq 1)\). 注意到 \(F(x)=x(F(x)+1)^2\),即\(x=\frac{F(x)}{F(x)+1}\). 设\(G(x)=\frac{x}{(x+1)^2}\),那么\(G(F(x))=F(G(x)=x\). 显然\(F,G\)常数项为0,根据拉格朗日反演。
(中间用到二项式定理,最后一步是把组合数展开成阶乘)
练习:用拉格朗日反演证明,\(n\)个节点的带标号有根树数量为\(n^{n-1}\)。
设\(t_n\)为\(n\)个节点的带标号有根树数量。容易得到递推式:
\(m\)是枚举根的子树数量,\(k_1,k_2\dots k_m\)是子树大小,后面的是\(\frac{n!}{k_1!k_2!\dots k_m!}\)把\(n\)个点分到各子树的方案,再乘上每个子树内部的方案。由于子树没有顺序,还要除以\(\frac{1}{m!}\)
设\(T(x)\)为\(t_n\)的EGF,由卷积的定义得到:
实际上通过EGF乘法的组合意义可以直接得到上式,这里从定义开始推是为了方便理解。那么\(T(x)=x \mathrm{e}^{T(x)}\)
注意到\(x=\frac{T(x)}{\mathrm{e}^{T(x)}}\),不妨设\(G(x)=\frac{x}{\mathrm{e}^x}\),则\(T,G\)互为复合逆
由泰勒展开得\([x^m]e^{nx}=[x^m]\frac{(nx)^m}{m!}=\frac{n^m}{m!}\)
由于是EGF,\(t_n=n![x^n]T(x)=n!\cdot \frac{1}{n}\cdot \frac{n^{n-1}}{(n-1)!}=n^{n-1}\)
(BZOJ3684)
给定整数\(n\)和集合\(S(1 \notin S)\),求有\(n\)个节点且每个非叶子节点的儿子数量\(\in S\)的无标号有根树的数量。节点的孩子有顺序.\(n,|S|\leq 10^5\)
设这些树的OGF为\(T(x)\),根据定义,一棵树可以是单个叶子节点,或者是非叶子节点拼上\(i\)个子树组成的序列。
构造函数\(g(w)=w-\sum_{i \in S}w^i\),容易发现\(g(T(x))=x\)。用拉格朗日反演求出\(T\)的\(n\)次项系数。
\(\frac{1}{n}[w^{n-1}](\frac{w}{g(w)})^n=\frac{1}{n}[w^{n-1}]((\frac{g(w)}{w})^n)^{-1}\)
除以\(w\)相当于系数向左平移,然后多项式快速幂再求逆即可。
关于生成函数的组合意义,会有一篇文章专门讲,待填坑