当前位置 博文首页 > pycr:总结:生成函数(斐波那契通项公式推导)

    pycr:总结:生成函数(斐波那契通项公式推导)

    作者:pycr 时间:2021-02-11 14:27

    生成函数总结

    前言

    • 生成函数是什么啊?能吃吗?
    • 生成函数(generating function),又称母函数,是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。——oi-wiki
    • 太晦涩了,简而言之,对于一个序列,其生成函数就是以这个序列为系数的多项式。
    • 举个栗子??:对于序列 \(A=<0,1,2,3,4,5,\ldots>\) ,其普通生成函数为 \(\sum_{i=0}^{+\infty}A_ix^i=\sum_{i=0}^{+\infty}ix^i\),而对于序列 \(B=<1,2,3,4,5,\ldots>\),其普通生成函数为 \(\sum_{i=0}^{+\infty}(i+1)x^i\)
    • 所以这玩意儿有什么用?用处可大了,至少在我目前看来,生成函数就有两种作用:
      1. 能够计算一个序列的第 \(n\) 项的系数,可以用来求通项公式。
      2. 广泛运用于组合数学。

    形式幂级数

    • 在生成函数的定义里面有一个词叫做形式幂级数。能吃吗?

    先讲讲什么是幂级数叭

    • 幂级数是指级数的每一项均为与级数项序号 \(n\) 相对应的以常数倍的 \((x?a)\)\(n\:(n\in \N)\) 次方。
    • 比如

      \[A(x)=\sum_{i\geq 0}a_i(x-x_0)^i \]

      它与多项式不同的一点在于多项式只有有限项的系数是非零的。

    接着讲形式幂级数

    • 其意思就是:对于我们生成的这个多项式来说,其中的变量 \(x\) 只是作为一个符号而已,只是一个形式,它的取值并不重要,我们关心的只是它所携带的信息而已。好惨一变量……
    • 就比如在最简单的生成函数方案统计问题中,其指数就是我们要求的方案,而其系数就是答案。后面讲生成函数的时候会细讲。

    生成函数

    • 生成函数可以分为很多种,但是用的最广泛的还是普通生成函数指数生成函数

    普通生成函数

    • \(Ordinary\:Generating\:Function,OGF\) :普通生成函数。定义为形式幂级数:

      \[F(x)=\sum_{n\geq0}a_nx^n \]

    封闭形式

    • 每次计算都要写一长串的多项式或者写一个 \(\sum\)太麻烦了,有没有更好的方法?

    • 自然是有的,我们发现:对于序列 \(<1,1,1,\ldots>\) 的普通生成函数 \(F(x)=\sum_{n\geq 0}x^n\) ,有

      \[F(x)\cdot x+1=F(x) \]

    • 解得 \(F(x)=\frac{1}{1-x}\),所以我们可以用这个来代替原来琐碎的 \(\sum\) 并简化运算。

    • 真是天衣无缝又十分扯淡

    • 这种方法用的非常多,尤其是在求通项公式的时候,比如求斐波那契和卡特兰数的通项公式时就会用到。

    二项式定理

    • 但是我们将一个多项式变成封闭形式之后就无法得到第 \(n\) 项的系数了啊。但是没有关系,我们可以用二项式定理将其展开。
    • \(Generalized\:Binomial\:Theorem:\) 广义二项式定理:

      \[(x+y)^\alpha=\sum_{k=0}^\infty \left(\begin{matrix}\alpha\\k\end{matrix}\right)x^{\alpha-k}y^k \]

      其中 \(\left(\begin{matrix}\alpha\\k\end{matrix}\right)\) 为广义二项式系数(其实就是实数域下的组合数)

      \[\left(\begin{matrix}\alpha\\k\end{matrix}\right)=\frac{\alpha^{\underline k}}{k!}=\frac{\alpha(\alpha-1)\ldots(\alpha-k+1)}{k!},\alpha\in\R,k\in\N \]

      \(\alpha^{\underline k}\) 表示 \(\alpha\)\(k\) 次下降幂,即 \(\alpha(\alpha-1)\ldots(\alpha-k+1)\)。上升幂类似。

    • 举上面的那个栗子??,将 \(F(x)=\frac{1}{1-x}\) 展开:

      \[\begin{aligned} F(X)&=(1-x)^{-1}\\ &=\sum_{k\geq 0}\left(\begin{matrix}-1\\k\end{matrix}\right)(-x)^k\\ &=\sum_{k\geq 0}\left(\begin{matrix}-1\\k\end{matrix}\right)(-1)^kx^k\\ \end{aligned} \]

      那么 \(n\) 项的系数为

      \[\left(\begin{matrix}-1\\n\end{matrix}\right)(-1)^n \]

      将广义二项式系数展开,上下约分得 \((-1)^n\) ,所以第 \(n\) 项的系数为 \(1\)

    • \(Tips:\left(\begin{matrix}m\\n\end{matrix}\right)(-1)^n=\left(\begin{matrix}n-m-1\\n\end{matrix}\right)\),将广义二项式系数展开之后把 \(-1\) 代进去得上升幂再转下降幂即可。

      \[\begin{aligned} \left(\begin{matrix}m\\n\end{matrix}\right)(-1)^n&=\frac{m(m-1)\ldots (m-n+1)}{n!}(-1)^n\\ &=\frac{-m(-m-1)\ldots (n-m-1)}{n!}\\ &=\frac{(n-m-1)^{\underline n}}{n!}\\ &=\left(\begin{matrix}n-m-1\\n\end{matrix}\right) \end{aligned} \]

    回到形式幂级数

    • 用一个题目来简单说明一下:你有两个苹果??,三个梨子??,两个桃子??。问:拿五个水果共有几种方案?

    • 我们分别写出 ?????? 的生成函数:

      ?? : \(1+x+x^2\)

      ?? : \(1+x+x^2+x^3\)

      ?? : \(1+x+x^2\)

    • 其中 \(x\) 的指数表示这种水果拿多少个,我们将其乘起来之后,五次项(表示选五个)的系数即为问题的答案:

      \[(1+x+x^2)(1+x+x^2+x^3)(1+x+x^2)=1+3x+6x^2+8x^3+8x^4+6x^5+3x^6+x^7 \]

      所以答案为 \(6\)

    指数生成函数

    • \(Exponential\:Generating\:Function,EGF\) :指数生成函数。定义为形式幂级数:

      \[\hat F(x)=\sum_{n\geq 0} a_n\frac{x^n}{n!} \]

    封闭形式

    • 我们先反着来,先说展开

    • 前置芝士??:泰勒展开

    • 看到指数生成函数的阶乘分母有没有觉得很熟悉?

    • 我们想到泰勒级数也同样具有作为分母的阶乘,那么我们可以考虑将某个函数泰勒展开。

    • 考虑在 \(x_0=0\) 处用多项式去模拟 \(e^x\),将 \(e^x\) 取一阶导数、二阶导数、三阶导数……然后将 \(x_0=0\) 代入可得

      \[e^x=\sum_{n\geq 0}\frac{1}{n!}x^n \]

      为什么去模拟 \(e\)因为这玩意儿太好算了

    • 所以我们将这个式子反过来就得到了序列 \(<1,1,1,1,\ldots>\) 的指数生成函数的封闭形式。

    • 类似的,还有

      \[\begin{aligned} xe^x&=\sum_{n\geq 0}\frac{n}{n!}x^n\\ e^{Cx}&=\sum_{n\geq 0}\frac{C^n}{n!}x^n\\ \ln (1-x)&=-\sum_{n\geq 1}\frac{1}{n}x^n\\ \end{aligned} \]

    一个小小的问题

    • 为什么指数生成函数需要除以一个阶乘呢?这个阶乘有什么用?
    • 因为指数生成函数就类似于多重集的排列数,从一个多重集中依次选择 \(N\) 个元素的方案数为 \(\frac{N!}{a_1!a_2!\ldots a_n!}\)\(a_i\) 表示每一个元素有多少个),有没有觉得很像?没有。其实除以的这个阶乘就相当于方案数中的分母。所以最后得到系数之后是需要乘上 \(N!\) 的。
    • 等等,这个乘是什么意思,是额外再乘一个 \(N!\) 吗?
    • 显然不是,它是自动生成的。怎么越来越玄乎了?
    • 我们可以将这个阶乘想象成是 \(x\) 的一部分(不要看做是系数),就是有 \(x\) 就必须要有阶乘,那么我们将两个指数生成函数相乘之后,第 \(n\) 项可能就是 \(\frac{1}{i!j!}x^n\),这个时候我们发现没有 \(n!\),所以我们乘上 \(\frac{n!}{n!}\) 得到 \(\frac{n!}{i!j!}\cdot \frac{x^n}{n!}\),前面才是我们最终得到的系数,是已经乘了的结果。
    • 补充一点,因为平时计算最后结果时都是先化成封闭形式再展开。展开时分母可能会有 \(n!\),所以这时我们只要取前面的系数就可以了。果然自动。

    一些通项公式的推导

    斐波那契数列

    • 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)——百度百科
    • 斐波那契数列真是再熟悉不过的数列了,因为它比较简单,其每一项都等于前两项之和。所以其通项公式也比较容易得到。

    • 我们设 \(F(x)=f_0+f_1x+f_2x^2+\ldots\) 为斐波那契数列的生成函数。则

      \[\begin{aligned} F(x)&=\sum_{i\geq 0}f_ix^i\\ &=f_0+f_1x+\sum_{i\geq 2}f_ix^i\\ &=x+\sum_{i\geq 2}(f_{i-2}+f_{i-1})x^i\\ &=x+x^2\sum_{i\geq 2}f_{i-2}x^{i-2}+x\sum_{i\geq 2}f_{i-1}x^{i-1}\\ &=x+x^2F(x)+xF(x) \end{aligned} \]

      解得 \(F(x)=\frac{x}{1-x-x^2}\) 。考虑到这是封闭形式,我们尝试用待定系数法将其化为广义二项式的形式并将其展开。

      设:

      \[\frac{x}{1-x-x^2}=\frac{A}{1-ax}+\frac{B}{1-bx} \]

      通分然后用待定系数法:

      \[\begin{aligned} \frac{x}{1-x-x^2}&=\frac{A-Abx+B-Bax}{(1-ax-bx+abx^2)}\\\:\\ \therefore &\begin{cases} A+B=0\\ -Ab-Ba=1\\ -a-b=-1\\ ab=-1 \end{cases} \end{aligned} \]

      解得:

      \[\begin{cases} A=\frac{1}{\sqrt 5}\\ B=-\frac{1}{\sqrt 5}\\ a=\frac{1+\sqrt 5}{2}\\ b=\frac{1-\sqrt 5}{2} \end{cases} \]

      那么:

      \[\begin{aligned} F(x)&=\frac{1}{\sqrt 5}\left(\left(1-\frac{1+\sqrt 5}{2}x\right)^{-1}-\left(1-\frac{1-\sqrt 5}{2}x\right)^{-1}\right)\\ &=\frac{1}{\sqrt 5}\left(\sum_{n\geq 0}\left(\frac{1+\sqrt 5}{2}x\right)^n-\sum_{n\geq 0}\left(\frac{1-\sqrt 5}{2}x\right)^n\right)\\ &=\sum_{n\geq 0}\frac{1}{\sqrt 5}\left(\left(\frac{1+\sqrt 5}{2}\right)^n-\left(\frac{1-\sqrt 5}{2}\right)^n\right)x^n \end{aligned} \]

      所以我们就得到了斐波那契数列的通项公式:

      \[\frac{1}{\sqrt 5}\left(\left(\frac{1+\sqrt 5}{2}\right)^n-\left(\frac{1-\sqrt 5}{2}\right)^n\right) \]

    卡特兰数

    简介

    • 卡特兰数,又称卡塔兰数,是组合数学中一种常出现于各种计数问题中的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名。1730年左右被蒙古族数学家明安图 (1692-1763)使用于对三角函数幂级数的推导而首次发现,1774年被发表在《割圜密率捷法》。——百度百科
    • 完全不懂

    • 简而言之,卡特兰数也是组合数学中十分重要的内容,其有多种计算公式:

      1. 递推公式 \(1\)\(C_n=\sum_{i=0}^{n-1}C_iC_{n-1-i}\)
      2. 递推公式 \(2\)\(C_n=\frac{C_{n-1}\times (4\times n-2)}{n+1}\)
      3. 组合公式 \(1\)\(f(n)=\frac{C_{2n}^n}{n+1}\)
      4. 组合公式 \(2\)\(f(n)=C_{2n}^n-C_{2n}^{n-1}\)
    • 以下一些问题的答案都是卡特兰数:

      1. \(n\) 个节点的二叉树的形态个数。
      2. 设进栈的序列为 \(<1,2,3,\ldots,n>\) ,有多少种不同的出栈序列。
      3. \(n\) 级阶梯的化分数。
      4. \(n\)\(0\)\(1\) 组成的长度为 \(2n\) 且前缀和非负的 \(01\) 序列的个数。
      5. \(n+2\) 边形三角划分方案数。
      6. 网格图中从 \((0,0)\) 走到 \((n,n)\) 且不越过对角线的方案数。
    • 对④的一些理解:受网格图中容斥原理的启发,我们假设一开始在原点,\(1\) 代表向右上方走一步,\(0\) 代表向右下方走一步,那么最终都会走到 \((2n,0)\)。如果不考虑前缀和非负这一条件的话,那么方案数就为 \(C_{2n}^n\)。这时加上前缀和这一条件,我们发现,在该网格图中,纵坐标就代表着前缀和,那么合法的方案一定不会经过直线 \(y=-1\) 。换句话说,我们将 \((2n,0)\) 沿着 \(y=-1\) 翻折得到对称点 \((2n,-2)\),那么从 \((0,0)\)\((2n,-2)\) 的每条路线就对应着原图中的一条不合法的路线,这样的路线一共有 \(C_{2n}^{n-1}\) 条,即有 \((n-1)\)\(1\) 的序列数,减去即可。所以答案即为 \(C_{2n}^n-C_{2n}^{n-1}\),为卡特兰数组合公式 \(2\)

    • 为什么⑤是卡特兰数?其递推公式明明为 \(C_n=\sum_{i\geq 2}^{n-1}C_iC_{n-i+1}\)。我们考虑作以下变换:

      \[\begin{aligned} C_n&=\sum_{i\geq 2}^{n-1}C_iC_{n-i+1}\\ &=\sum_{i\geq 0}^{n-3}C_{i+2}C_{n-i-1} \end{aligned} \]

      将整个数列向左平移两个位置

      \[\begin{aligned} C_{n-2}&=\sum_{i\geq 0}^{n-3}C_iC_{n-i-3}\\ \therefore C_m&=\sum_{i\geq 0}^{m-1}C_iC_{m-1-i}\quad(m=n-2) \end{aligned} \]

    • 其实有一种更为直观的理解:在求和的时候,\(i\) 的取值范围为 \(2\sim n-1\),而 \(n-i+1\) 则为 \(n-1\sim 2\),标准的卡特兰数。

    求通项公式

    • 知道卡特兰数的递推公式之后就好办了。

    • \(F(x)=C_0+C_1x+C_2x^2+\ldots\) 为卡特兰数的生成函数。则

      \[\begin{aligned} F(x)&=\sum_{i\geq 0}C_ix^i\\ &=1+x\sum_{i\geq 1}\sum_{j=0}^{i-1}C_jx^j\cdot C_{i-1-j}x^{i-1-j}\\ &=1+x\sum_{i\geq 0}\sum_{j=0}^{i}C_jx^j\cdot C_{i-j}x^{i-j}\\ &=1+xF^2(x)\\ \end{aligned} \]

      解得 \(F(x)=\frac{1\pm\sqrt{1-4x}}{2x}\),因为 \(F(0)=C_0=1\),且

      \[\begin{aligned} \lim_{x\to 0} \frac{1+\sqrt{1-4x}}{2x}&=\infty\\ \lim_{x\to 0} \frac{1-\sqrt{1-4x}}{2x}&=0 \end{aligned} \]

      (具体参考洛必达法则)

      所以 \(F(x)=\frac{1-\sqrt{1-4x}}{2x}\)

    • 这才推了一点点

    • 考虑将 \(\sqrt{1-4x}\) 广义二项式展开

      \[\begin{aligned} (1-4x)^\frac{1}{2}&=\sum_{n\geq 0}\left(\begin{matrix}\frac{1}{2}\\n\end{matrix}\right)(-4x)^n\\ &=1+\sum_{n\geq 1}\frac{\left(\frac{1}{2}\right)^{\underline n}}{n!}(-4x)^n \end{aligned} \]

      \[\begin{aligned} \left(\frac{1}{2}\right)^{\underline n}&=\frac{1}{2}\frac{-1}{2}\frac{-3}{2}\cdots \frac{-(2n-3)}{2}\\ &=\frac{(-1)^{n-1}(2n-3)!!}{2^n}\\ &=\frac{(-1)^{n-1}(2n-2)!}{2^n(2n-2)!!}\\ &=\frac{(-1)^{n-1}(2n-2)!}{2^{2n-1}(n-1)!} \end{aligned} \]

      所以

      \[\begin{aligned} (1-4x)^\frac{1}{2}&=1+\sum_{n\geq 1}\frac{(-1)^{n-1}(2n-2)!}{2^{2n-1}(n-1)!n!}(-4x)^n\\ &=1-\sum_{n\geq 1}\frac{(2n-2)!}{(n-1)!n!}2x^n \end{aligned} \]

      带回原式得到

      \[\begin{aligned} F(x)&=\frac{1}{2x}\sum_{n\geq 1}\frac{(2n-2)!}{(n-1)!n!}2x^n\\ &=\sum_{n\geq 1}\frac{(2n-2)!}{(n-1)!n!}x^{n-1}\\ &=\sum_{n\geq 0}\frac{2n!}{n!(n+1)!}x^n \end{aligned} \]

      所以卡特兰数的通项公式为

      \[\frac{2n!}{n!(n+1)!}=\frac{2n!}{n!n!}\cdot\frac{1}{n+1}=\frac{C_{2n}^n}{n+1} \]

      为组合公式 \(1\)

    ——2021年2月11日

    bk