生成函数


生成函数

引入

对于一个长度无限一个随机数列,我们能不能用一个函数表示这个数列呢?

我们把每一项当做多项式的一个系数,得到了用来表示序列的多项式函数 。

详见:函数插值

思考了一会,又找到了它的一种用途。假如数列 aa 代表一类物品,中 aia_i 表示这类物品中选 件物品的方案数

例如:a={1,1,1}a=\{1,1,1\} 表示 AA 类物品中可以选 00 件或 11 件或 22 件,但不能选大于 22 件;又例如无限长数列 b={1,0,0,1,0,0,1,0,0,…}b = \{ 1,0,0,1,0,0,1,0,0, \ldots \} 表示 BB 类物品只能选 33 的倍数件。这时候,把 f(x)=1+x+x2f(x) = 1 + x + {x^2} 和 g(x)=1+x3+x6+x9...g(x) = 1 + {x^3} + {x^6} + {x^9}... 乘起来,得到另一个函数 h(x)=1+x+x2+x3+x4+…h(x) = 1 + x + {x^2} + {x^3} + {x^4} + \ldots 。这个函数有什么意义呢?它的第 ii 项的系数就是选AA、BB两种物品共 ii 件的方案数。

大家可能会好奇:这不就是把两个多项式乘起来么?和 一次次枚举情况有什么区别?

这里扯得远一点:多项式可以 FFT(快速傅里叶变换)

我们给这个“用函数表示数列”的东西取了个名字——数列的“生成函数”,表示用这个函数能生成一个数列。

一些疑问

现在有个问题:

f(x)=11−xf(x) = \frac{1}{ {1 - x} } 是否是 a={1,1,1,1,1,…}a = \{ 1,1,1,1,1, \ldots \} 的生成函数?

估计大家可能会毅然决然地否定,因为它的生成函数是 1+x+x2+x3+⋯1 + x + {x^2} + {x^3} + \cdots 。但如果考虑定义域 x∈(−1,1)x \in ( - 1,1) 呢?

这里大家可以停顿一下想一想

根据我们小学学过的等比数列求和公式:

1+x+x2+x3+⋯1 + x + {x^2} + {x^3} + \cdots 的前 nn 项和等于1−xn1−x\frac{1 - {x^n} }{1 - x} ,

这是个无限长的数列,

且 limn→∞1−xn1−x=xn=0\mathop {\lim }\limits_{n \to \infty} \frac{1 - {x^n} }{1 - x} = {x^n} = 0 ,这不就相等了嘛!

可是好好的一个函数,被我们蹂躏成这个样子,凭空给限定了定义域,这还是原来那个函数嘛?

注意!生成函数中的 xx 是没有意义的。

例如,函数 1+x2+x4+x6 + ⋯1 + {x^2} + {x^4} + {x^6}{\text{ + } } \cdots 是不是等于 11−x2\frac{1}{1 - {x^2} } ?

提示: t -> x^2

那函数 1+2x+3x2+4x3⋯1 + 2x + 3{x^2} + 4{x^3} \cdots 呢?

对等式 11−x=1+x+x2+x3+⋯\frac{1}{ {1 - x} } = 1 + x + {x^2} + {x^3} + \cdots 两边分别求导,或者把两个 1+x+x2+x3+⋯1 + x + {x^2} + {x^3} + \cdots 乘起来就可以了。

进而考虑推广,

1(1−x)k=∑i∞Ci+k−1k−1xi \frac{1}{ { { {(1 - x)}^k} } } = \sum\limits_i^\infty {C_{i + k - 1}^{k - 1}{x^i} }

1(1−x)k\frac{1}{(1 - x)^k} 就是 kk 个 1+x+x2+x3+⋯1 + x + {x^2} + {x^3} + \cdots 相乘,那么第 ii 项系数就是从 kk 个 1+x+x2+x3+⋯1 + x + {x^2} + {x^3} + \cdots 中每个选出一项,乘起来恰为 xi{x^i} 的方案数,就是 i=x1+x2+...+xki = {x_1} + {x_2} + ... + {x_k} 的非负整数解的组数,用组合数学中的隔板法求,是不是有道理 ?

Example: Fibbonaci 数列

先说结论:生成函数求斐波那契数列的通项

斐波那契数列的生成函数 : f(x)=x+x2+2x3+3x4+5x5+8x6+⋯(i) f(x) = x + {x^2} + 2{x^3} + 3{x^4} + 5{x^5} + 8{x^6} + \cdots \text{(i)} 乘 xx ,得 : x⋅f(x)=x2+x3+2x4+3x5+5x6+8x7+⋯(ii) x \cdot f(x) = {x^2} + {x^3} + 2{x^4} + 3{x^5} + 5{x^6} + 8{x^7} + \cdots \text{(ii)} 用 i\text{i} 式减去 ii\text{ii} 式,得到 f(x)−x⋅f(x)=x+x3+x4+2x5+3x6+5x7+⋯=x+x2⋅f(x) f(x) - x \cdot f(x) = x + {x^3} + {x^4} + 2{x^5} + 3{x^6} + 5{x^7} + \cdots = x + {x^2} \cdot f(x) 所以 f(x)=x1−x−x2 f(x) = \frac{x}{1 - x - x^2}

看着非常难受,把它还原成数列来验证:

首先, 1−x−x21 - x - {x^2} 可以被因式分解为:

(1−1−52x)(1−1+52x) (1 - \frac{ {1 - \sqrt 5 } }{2}x)(1 - \frac{ {1 + \sqrt 5 } }{2}x) 所以 x1−x−x2=x(1−1−52x)(1−1+52x) \frac{x}{ {1 - x - {x^2} } } = \frac{x}{ {(1 - \frac{ {1 - \sqrt 5 } }{2}x)(1 - \frac{ {1 + \sqrt 5 } }{2}x)} } 裂项 x(1−1−52x)(1−1+52x)=−151(1−1−52x)+151(1−1+52x) \frac{x}{ {(1 - \frac{ {1 - \sqrt 5 } }{2}x)(1 - \frac{ {1 + \sqrt 5 } }{2}x)} } = - \frac{1}{ {\sqrt 5 } }\frac{1}{ {(1 - \frac{ {1 - \sqrt 5 } }{2}x)} } + \frac{1}{ {\sqrt 5 } }\frac{1}{ {(1 - \frac{ {1 + \sqrt 5 } }{2}x)} }

这就是斐波那契数列通项公式了

这种方法也可以应用到各种线性齐次递推中


文章作者: sfc9982
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 sfc9982 !
  目录