生成函数
引入
对于一个长度无限一个随机数列,我们能不能用一个函数表示这个数列呢?
我们把每一项当做多项式的一个系数,得到了用来表示序列的多项式函数
。
详见:函数插值
思考了一会,又找到了它的一种用途。假如数列
代表一类物品,中
表示这类物品中选 件物品的方案数
例如:
表示
类物品中可以选
件或
件或
件,但不能选大于
件;又例如无限长数列
表示
类物品只能选
的倍数件。这时候,把
和
乘起来,得到另一个函数
。这个函数有什么意义呢?它的第
项的系数就是选、两种物品共
件的方案数。
大家可能会好奇:这不就是把两个多项式乘起来么?和
一次次枚举情况有什么区别?
这里扯得远一点:多项式可以 FFT(快速傅里叶变换)
我们给这个“用函数表示数列”的东西取了个名字——数列的“生成函数”,表示用这个函数能生成一个数列。
一些疑问
现在有个问题:
是否是
的生成函数?
估计大家可能会毅然决然地否定,因为它的生成函数是
。但如果考虑定义域
呢?
这里大家可以停顿一下想一想
根据我们小学学过的等比数列求和公式:
的前
项和等于
,
这是个无限长的数列,
且
,这不就相等了嘛!
可是好好的一个函数,被我们蹂躏成这个样子,凭空给限定了定义域,这还是原来那个函数嘛?
注意!生成函数中的
是没有意义的。
例如,函数
是不是等于
?
提示: t -> x^2
那函数
呢?
对等式
两边分别求导,或者把两个
乘起来就可以了。
进而考虑推广,
就是
个
相乘,那么第
项系数就是从
个
中每个选出一项,乘起来恰为
的方案数,就是
的非负整数解的组数,用组合数学中的隔板法求,是不是有道理 ?
Example: Fibbonaci 数列
先说结论:生成函数求斐波那契数列的通项
斐波那契数列的生成函数 :
乘
,得 :
用
式减去
式,得到
所以
看着非常难受,把它还原成数列来验证:
首先,
可以被因式分解为:
所以
裂项
这就是斐波那契数列通项公式了
这种方法也可以应用到各种线性齐次递推中