浅析生成函数
有些组合数学的东西看不懂主要是书本上不怎么好好说话。
所以有些东西还是得自己琢磨。
百度百科上给出了生成函数的定义 其实也非常难看懂。
生成函数(母函数):对数列$\{ a_0,a_1,a_2,...,a_n\}$,维护的一个多项式$G(x) = \sum\limits_{i=0}^{n} a_i x^i$
打个比方说,今天心血来潮想用一个多项式来表示一个序列$ \{ 1,2,3,4,5\}$
那么就可以这么构造多项式$G(x) = 1 + 2x^1 + 3x^2 + 4x^3 +5x^4$
但是这个东西对于$x$本生的取值是不影响多项式表示数列的本质的。
甚至说,我们把一个确定的$x=k$带入到多项式中计算出的值某种意义上可以作为分辨这些数列的$Key$。
所以$x$取多少是没有意义的,有些时候为了方便起见(方便描述一个无穷项的数列),我们指定$x$是一个范围使得多项式的值收敛。
比如,我要表示这样一个无穷序列$\{1,1,1...\}$,构造出的多项式是$G(x) = \sum\limits_{i=0}^{\infty}x^i$
通过等比数列求和我们可以知道这个事情在$|x| < 1$的时候是收敛的,于是$G(x) = \frac{x^{\infty}-1}{x-1}$
容易知道,当$|x| < 1$那么$x^{\infty} \to 0$ , 所以就有: $G(x) = \frac{1}{1-x} $
定理1: 对于数列$\{1,1,1...\}$的生成函数是$G(x) = \frac{1}{1-x}$
事情远远没有那么简单。
如果我要表示$\{ 1,0,0,1,0,0,1,0,0...\}$怎么办呢。
显然这个东西表示成生成函数,可以写成$G(x) = x^0 + x^3 + x^6 + ...$
在转换一下就是$G(x) = \sum\limits_{i=0}^{\infty} {x^2}^i =\frac{1}{1-x^2} $ (就相当于$x$用$x^2$代替即可)。
数论是研究自然数的数学,不知道自然数序列的生成函数怎么行呢。
我们看$\{1,2,3,4...\}$ 的生成函数 $G(x) = \sum\limits_{i=0}^{\infty}ix^i$
先说结论,$G(x) = \frac{1}{(1-x)^2}$,这是为什么呢?差比数列求n项和
考虑对等式 $ \frac{1}{1-x} = \sum\limits_{i=0}^{\infty}x^i$ 两边求导。
显然发现$ \sum\limits_{i=0}^{\infty}x^i$求导是$ \sum\limits_{i=0}^{\infty}i x^i$。(反正都是到$\infty$)
显然使用求导公式$(\frac{u}{v})' = \frac{u'v-uv'}{v^2}$ 可以知道左边求导答案是 $\frac{1}{(1-x)^2}$
所以我们知道$\{1,2,3...\}$的生成函数是 $\frac{1}{(1-x)^2}$
知道一个数列求它的生成函数比较简单,但是反过来 我知道一个数列的生成函数,那我怎么知道这个数列呢?
这个事情还有从一个问题说起。
你知不知道生成函数是$G(x) = \frac{1}{(1-x)^k}$表示的数列是什么呢?
答案是$\binom{n+k-1}{n-1} $,你知道怎么来的嘛?
非常显然,$\frac{1}{(1-x)^k} = (\frac{1}{1-x})^k = (\sum\limits_{i=0}^{\infty}x^i) ^k $
考虑最后答案一项$a_n x^n$,就是相当于从前面$k$个完全相同的多项式中每个选出1项$x^{e_k}$相乘得到$x^n$的可能性嘛。
就是解一个方程$e_1 + e_2 + ... + e_k = n$,然后你隔板法求一下不就是$\binom{n+k-1}{n-1} $了吗?
定理2:对于$ a_n = \binom{n+k-1}{n-1} 的数列其生成函数是G(x) = \frac{1}{(1-x)^k} $
到这里,你已经学会两类生成函数的构造,
1. $G(x) = \frac{1}{1-x^k}$ 描述循环数列 $1,0,0,0 .... (k-1个0) , 1,0,0,0,...(k-1个0),....$
2. $G(x) = \frac{1}{(1-x)^k}$描述数列 $a_n = \binom{n+k-1}{n-1}$
但是这个东西有什么用呢?计数!
考虑到$a_i$表示A类物品中选择$i$件的方案数,$b_i$表示B类物品中选择$i$件的方案数。
构造$A(x)$和$B(x)$分别表示这两个方案序列的生成函数,那么$h = a \times b$得到的一个生成多项式$h$就有了意义。
$h$的第$x$项的系数$h(x)$表示当A类物品和B类物品中一共挑选了$x$件的方案数(乘法原理,要求A,B中物品互异)。
我们可以大言不惭的说若干个序列进行上述操作得出的答案也都是这些物品中选择若干个的总方案数。【这个东西可以数学归纳法证明】
你可以尝试一下这道题 P2000 拯救世界
首先我们会发现有好多种限制,那么我们就构造这么多生成函数,放在一起求个卷积就行了。
设$a_i$表示A类物品选择$i$件的方案数。依次类推。
1. $\{1,0,0,0,0,0,1,0,0,0,0,0...\} = \frac{1}{1-x^6}$
2.$\{1,1,1,1,1,1,1,1,1,1\} = \frac{1-x^10}{1-x}$ (等比数列求和就可以了)
3.$\{1,1,1,1,1,1\} = \frac{1-x^6}{1-x}$
4.$\{1,0,0,0,1,0,0,0...\} = \frac{1}{1-x^4}$
5.$\{1,1,1,1,1,1,1,1\} = \frac{1-x^8}{1-x}$
6.$\{1,0,1,0...\} = \frac{1}{1-x^2}$
7.$\{1,1\}=\frac{1-x^2}{1-x}$
8.$\{1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0...\} = \frac{1}{1-x^8}$
9. $\{1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0...\} = \frac{1}{1-x^10}$
10.$\{1,1,1,1\}=\frac{1-x^4}{1-x}$
然后把最后化简的答案全部乘起来就是$\frac{1}{(1-x)^5}$对应一下发现最后序列是这个东西
$ k = 5 ,a_n = \binom{n+k-1}{n-1} = \binom{n+4}{4} =\frac{(n+1)(n+2)(n+3)(n+4)}{24}$
然后pyy2一下就过了。
然后我们来推一下$Fib$的通项,$fib_n =\frac{1}{\sqrt{5}}\left [ (\frac{1+\sqrt{5}}{2})^n - (\frac{1-\sqrt{5}}{2})^n \right ] $
显然构造$G(x) = \sum_{i} fib_i x^i$
那么可以比较显然的发现 $xG(x) -G(x) = x+x^2G(x)$
则$G(x) = \frac{x}{1-x-x^2}$
得 $ G(x) = \frac{x}{(1-\frac{1-\sqrt{5}}{2}x)(1-\frac{1+\sqrt{5}}{2}x)}$
裂项得$ G(x) = G(x) = \frac{-\frac{1}{\sqrt{5}}}{(1-\frac{1-\sqrt{5}}{2}x)}\frac{\frac{1}{\sqrt{5}}}{(1-\frac{1+\sqrt{5}}{2}x)} $
我们可以从$\{1,1,1...\}$的生成函数是$\frac{1}{1-x}$思考一下,如果把$x=cx$那么会变成什么情况。
那么生成原来的函数就是$G(x) = \sum_{i} (cx)^i =\sum_{i}{c^ix^i}= \frac{1}{1-cx}$此时,描绘的数列就是$1,c,c^2,c^3,...$
思考$\{a,a,a...\}$的生成函数是$\sum_{i} ax^i = a\sum_{i}x^i = \frac{a}{1-x}$
所以,对于一个一般的等比数列$a_n = \lambda c^n$ 他的生成函数就是$\frac{\lambda}{1-cx} $
所以上述函数恢复到原函数就比较容易了,所以最后的答案就是$fib_n =\frac{1}{\sqrt{5}}\left [ (\frac{1+\sqrt{5}}{2})^n - (\frac{1-\sqrt{5}}{2})^n \right ] $