生成函数引入
“生成函数是数列与函数之间的桥梁.”我们通过生成函数,将数列问题转化为函数的问题,并借助函数的处理办法来求数列的一些性质.
具体地,对一个数列\(\{f_n\}\),我们称函数\(F(x)=\sum_{i=0}^{\infty}f_ix^i\)为它的生成函数.
常见的生成函数
我们想用生成函数,首先要把数列转化成生成函数.我们考虑数列\(f_n=p^n\),则其生成函数\(F(x)=\sum_{i=0}^{\infty}p^ix^i\).值得注意的是,生成函数中,我们重点研究每一项的系数,但并不研究\(x\)的值是多少,以及\(f(x)\)的值是多少,我们在后面将看到这一点.因此,只要存在一个\(x\)满足你的推导所需性质,你的推导就是对的.
因此,我们构造一个\(x\neq 0\),使得\(px\in(0,1)\),发现上面的级数是收敛的,根据等比数列求和公式,则有:
\[
\begin{align}
& F(x)=\sum_{i=0}^{\infty}p^ix^i=\lim_{n\to\infty}\frac{(px)^{n+1}-1}{px-1}=\frac{1}{1-px} \notag\\
\mathbf{公式1}\ \ & \frac{1}{1-px}=\sum_{i=0}^{\infty}p^ix^i\ \leftrightarrow\ <1,p^1,p^2,p^3,p^4,\dots> \notag
\end{align}
\]
特别的,将\(p=1\)代入,则有
\[\mathbf{推论1}\ \ \frac{1}{1-x}=\sum_{i=0}^{\infty}x^i \ \leftrightarrow \ <1,1,1,1,1,\dots>
\]
有时我们需要从\(F(x)\)推出其生成的数列,对分式我们常采取裂项的手段(后面会有所体现),然而,当面对一些不那么熟悉的函数时,我们也有特殊手段.
根据泰勒展开,我们有:
\[F(x)=\sum_{i=0}^\infty \frac{F^{(i)}(x)}{i!}
\]
因此,我们有:
\[\mathbf{公式2}\ \ \sin x = x -\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+ \ \dots \ \leftrightarrow \ <0,1,0,-\frac{1}{3!},0,\frac{1}{5!},\dots>
\]
\[\mathbf{公式3}\ \ e^x = 1 +x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+ \ \dots \ \leftrightarrow \ <1,1,\frac{1}{2!},\frac{1}{3!},\frac{1}{4!},\frac{1}{5!},\dots>
\]
在处理这些问题时,我们通常可以直接考虑每一项的系数除以阶乘后的值,以更方便的探究性质.
根据牛顿二项式定理,我们有:
\[\mathbf{公式4}\ \ (1-x)^{-\alpha}=\sum_{i=0}^{\infty}\binom{i+\alpha-1}{\alpha-1}x^i \ \leftrightarrow \ <\binom{\alpha-1}{\alpha-1},\binom{\alpha}{\alpha-1},\dots>
\]
生成函数的简单常用变换
先来考虑加减,我们设\(F(x),G(x)\)是两个生成函数,则有
\[
\begin{align}
& F(x)+G(x)=\sum_{i=0}^{\infty}(f_i+g_i)x^i \notag\\
\mathbf{公式5}\ \ & F(x)\pm G(x) \ \leftrightarrow \ {f_n\pm g_n} \notag
\end{align}
\]
在考虑将\(F(x)\)乘以一个常数,有:
\[
\begin{align}
& cF(x)=\sum_{i=0}^{\infty}cf_ix^i \notag \\
\mathbf{公式6}\ \ & cF(x) \ \leftrightarrow \ {cf_n} \notag
\end{align}
\]
显然上面两个操作对应了数列的加减和数乘.
我们考虑两个数列所对应的两个生成函数\(F(x)\)与\(G(x)\)乘起来会得到什么结果.
\[
\begin{align}
& F(x)G(x)=\sum_{i=0}^{\infty}f_ix^i\sum_{j=0}^{\infty}g_jx^j=\sum_{i=0}^{\infty}\sum_{j=0}^if_jg_{i-j} \ x^i \notag
\\ \mathbf{公式7}\ \ & F(x)G(x) \leftrightarrow \ <f_0g_0,f_0g_1+f_1g_0,f_0g_2+f_1g_1+f_2g_0,\dots>\notag
\end{align}
\]
我们发现生成函数的积似乎对应着数列的卷积.让我们将其特殊化:
- 令\(G(x)=x\),即\(g_n=[n=1]\),则有:
\[
\begin{align}
& F(x)G(x)=\sum_{i=0}^{\infty}\sum_{j=0}^if_jg_{i-j} \ x^i=\sum_{i=1}^{\infty}f_{i-1} \ x^i \notag \\
\mathbf{推论7.1} \ \ & xF(x)=\sum_{i=1}^{\infty}f_{i-1} \ x^i \ \leftrightarrow \ <0,f_0,f_1,f_2,\dots> \notag
\end{align}
\]
我们发现,把一个函数乘以\(x\)就是把数列向右移一位,最前面补0.那自然的,\(\frac{F(x)-f_0}{x}\)就是将数列左移一位.
- 令\(G(x) = \frac{1}{1-x}\),根据推论1,\(g_n=1\).则有:
\[
\begin{align}
&F(x)G(x)=\sum_{i=0}^{\infty}\sum_{j=0}^if_jg_{i-j} \ x^i=\sum_{i=0}^{\infty}\sum_{j=0}^if_j \ x^i \notag
\\ \mathbf{推论7.2} \ \ &\frac{F(x)}{1-x}=\sum_{i=1}^{\infty}\sum_{j=0}^if_j \ \leftrightarrow \ <f_0,f_0+f_1,f_0+f_1+f_2,\dots> \notag
\end{align}
\]
我们发现,将一个函数除以\(1-x\)就是在对数列做前缀和.那么自然的,将一个函数乘以\(1-x\)就是在对数列做差分.
再来考虑对\(F(x)\)求导会得到什么:
\[\begin{align}
& F'(x) = \sum_{i=0}^{\infty}(i+1)f_{i+1}x^i \notag \\
\mathbf{公式8} \ \ & F'(x) \leftrightarrow \ <f_1,2f_2,3f_3,\dots> \notag
\end{align}
\]
我们发现,这样可以得到每一项向前平移一项再乘以该项的序号.
学习上列变换,目的就在于表示出一个复杂数列所对应的生成函数,再通过一些手段计算出第\(n\)项的系数,即为我们想要的数列的第\(n\)项.
例1 有数列\(f_n\),满足\(f_0=0,f_1=1\),且对任意\(i>1\),有\(f_i=f_{i-2}+f_{i-1}\).求\(f_n\)的通项公式.
解:
我们尝试求解\(f_n\)对应的生成函数\(F(x)\),根据斐波那契数列性质,我们利用推论7.1尝试错位相减:
\[\begin{align}
F(x) = & f_0 &+& f_1x&+ & f_2x^2&+ & f_3x^3&+ &f_4x^4 &+\dots \tag{1} \\
xF(x) = & 0 &+& f_0x&+ &f_1x^2&+ &f_2x^3&+ & f_3x^4&+ \dots \tag{2} \\
x^2F(x) = & 0 &+& 0x& +&f_0x^2 &+ &f_1x^3 &+& f_2x^4 &+ \dots \tag{3} \\
考虑将(1)-(2)-(3),有:& \notag \\
F(x)-xF(x)-x^2F(x) = &0&+&x&+&0&+&0&+&0&+\dots\notag
\end{align}
\]
由此,我们得到\(F(x)=\frac{x}{1-x-x^2}\),接下来尝试将其拆项:
\[\begin{align}
F(x)=&\frac{x}{1-x-x^2} \notag \\
=&\frac{A}{1-(\frac{1+\sqrt{5}}{2})x}+\frac{B}{1-(\frac{1-\sqrt{5}}{2})x} \tag{待定系数} \\
=&\frac{1}{\sqrt{5}}(\frac{1}{1-(\frac{1+\sqrt{5}}{2})x}-\frac{1}{1-(\frac{1-\sqrt{5}}{2})x}) \tag{4}
\end{align}
\]
接下来考察这是什么数列,根据公式1以及加减和数乘变换,生成函数\((4)\)对应数列的第\(n\)项为\(\frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n)\),则有:
\[f_n=\frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n)
\]
正如上所述,生成函数可以求解通项公式,但是从另一个角度,一个数列的前缀和也是一个数列,且由前缀和变换可以快速得到其生成函数,因此,生成函数也是求解前缀和的利器.让我们看下面的例子.
例2 化简:\(\sum_{i=1}^nip^i\).
这道题固然有初等解法,但是生成函数做法将更具有一般性.
初等解法
我们设数列\(a_n=np^n,S_n=\sum_{i=1}^na_i\),根据经典套路,我们考虑做差:
\[\begin{align}
S_n=&p&+&2p^2&+&3p^3&+&\dots&+&(n-1)p^{n-1}&+&np^n \notag \\
pS_n=&0&+&p^2&+&2p^3&+&\dots&+&(n-2)p^{n-1}&+&(n-1)p^n&+&np^{n+1} \notag
\end{align}
\]
上下相减,即得:
\[(1-p)S_n=\sum_{i=1}^np^i-np^{n+1} \\
\begin{align}
S_n&=\frac{\frac{p-p^{n+1}}{1-p}-np^{n+1}}{1-p} \notag \\
&=\frac{p+(pn-n-1)p^{n+1}}{(1-p)^2} \notag
\end{align}
\]
即为所求.
我们考虑数列\(f_n=np^n\)的生成函数是什么,我们当然可以如下考虑:
\[\sum_{i=1}^nip^i =n\sum_{i=1}^np^i- \sum_{i=1}^n(n-i)p^i
\]
考虑前后分别求解,前面是等比数列求和,后面可以考虑使用数列\(f_n=p^n,g_n=n\)卷积得到,也可以使用生成函数求解.
这样的思路是可行的,但是我们有更简单的做法:考虑数列\(f_n=p^n\),发现所需要的数列恰好是\(f\)乘以对应项标号后左移一位,可以将\(F(x)\)求导后得到,进而求解前缀和.
\[F(x) = \frac{1}{1-px} \ \leftrightarrow \ f_n=p^n \\
G(x) = F'(x) = \frac{p}{(1-px)^2} \ \leftrightarrow \ g_n=<p,2p^2,3p^3,\dots>
\]
发现这个形式已经很好了,我们只要求前\(n-1\)项的前缀和即为答案.写出答案数列的生成函数并尝试拆项:
\[\begin{align}
S(x)&=\frac{G(x)}{1-x}\notag \\
&=\frac{p}{(1-px)^2(1-x)} \notag \\
&=\frac{A}{1-px}+\frac{B}{(1-px)^2}+\frac{C}{1-x} \tag{待定系数} \\
&=-\frac{p^2}{(p-1)^2} \ \frac{1}{1-px}+\frac{p^2}{p-1} \ \frac{1}{(1-px)^2} + \frac{p}{(p-1)^2} \ \frac{1}{1-x} \notag
\end{align}
\]
根据公式1以及牛顿二项式定理,这个形式就可以还原为数列了:
\[\begin{align}
s_n&=-\frac{p^{n+2}}{(p-1)^2}+\frac{p^2 \ p^n(n+1)}{p-1}+\frac{p}{(p-1)^2} \notag \\
&=\frac{(p(n+1)-(n+1)-1)p^{n+2}+p}{(p-1)^2} \notag
\end{align}
\]
因此:
\[s_{n-1}=\frac{(pn-n-1)p^{n+1}+p}{(p-1)^2}
\]
即为所求.
生成函数与数论
让我们重新表示一个数列的生成函数,这次我们不再使用多项式,而改用迪利克雷生成函数,具体的,对于数列\(\{f_n\}\),我们定义它的迪利克雷生成函数为:
\[F(x)=\sum_{i=1}^\infty f_i \ \frac{1}{i^x}
\]
如不加特殊声明,本小节中的生成函数均指迪利克雷生成函数.
为什么我们要使用这个生成函数?这个生成函数与数论又有什么关系?我们知道,在前面的生成函数定义中,生成函数相乘意味着对应数列的卷积.让我们来考察一下在这个定义下,\(F(x)G(x)\)有什么样的性质.
\[\begin{align}
F(x)G(x)&=\sum_{i=1}^\infty f_i \ \frac{1}{i^x}\sum_{j=1}^\infty g_j \ \frac{1}{j^x} \notag \\
&= \sum_{i=1}^\infty\sum_{j=1}^\infty f_ig_j\frac{1}{(ij)^x} \notag \\
&= \sum_{i=1}^\infty \sum_{d|i}f_dg_{i/d} \ \frac{1}{i^x} \notag \\
&\leftrightarrow h_n=\sum_{d|i}f_dg_{i/d} = (f*g)(n) \notag
\end{align}
\]
可以发现,在这样的定义下,生成函数的乘积对应着数列的迪利克雷卷积,这可以引发我们的许多联想.
让我们引入黎曼-Zeta函数.
\[\zeta(x)=\sum_{i=1}^\infty \frac{1}{i^x} \leftrightarrow <1,1,1,\dots>
\]
根据莫比乌斯反演,\(\mu * 1 = \epsilon\),因此有:
\[\frac{1}{\zeta(x)}=\sum_{i=1}^\infty \mu(i)\frac{1}{i^x} \leftrightarrow <\mu(1),\mu(2),\mu(3),\dots>
\]
这也是莫比乌斯反演的另一种形式.
小结
我们重复一遍:“生成函数是数列与函数之间的桥梁.”我们通过生成函数,将数列问题转化为函数的问题,并借助函数的处理办法来求数列的一些性质.
我们可以用生成函数解决一些数列通项求解,前缀和求解问题,并以此来解决一些计数题目.