定义
序列 \(A\) 的生成函数(又称母函数,generating function),是一种形式幂级数,其每一项的系数都可以提供关于 \(A\) 的信息。
形式幂是指,无论函数的自变量的取值是多少,都不影响原序列的信息。
常用的有普通生成函数和指数生成函数。
生成函数经常被用于处理组合/排列问题。
普通生成函数
开放形式
我们看这样一个模型:
有三堆颜色不同的球,分别为 \(A,B,C\)。其中,\(A\) 有 3 个,\(B\) 有 4 个,\(C\) 有 2 个。问从中取出 4 个球进行组合的方案数是多少?
我们定义多项式 \(A(x)=1+x+x^2\),系数表示 1 种方案,指数表示取几个。\(B,C\) 同理。
那么最后的答案即为 \((A*B*C)(x)\) 的第 4 项上的系数。因为第 4 项的系数表示取 4 个的方案数。
可以乘起来的原因是多项式乘法的本质是乘法分配律后同阶相加。
我们称形如 \(F(x)=\sum_{i=0}^n a_ix^i\) 为序列 \([a_1,a_2,\dots,a_n]\) 的普通生成函数。
再来一个例子:
若有面值为 \(1,2,3,4\) 的钱币各 1 枚,请问一共能凑出多少种面值?
\((1+x)(1+x^2)(1+x^3)(1+x^4)\) 的项数即为答案。如果至少去一个就去掉常数项。
封闭形式
我们在实际运用中,直接做形式幂级数的形式十分不方便。我们可不可以找到一个简洁的形式使其脱离多项式,尤其是项数 \(\rightarrow \infty\) 的时候。
我们拿 \([1,1,1,\dots]\) 的生成函数 \(F(x)=\sum_{i\geqslant0}x^i\) 来举例:
\[\begin{aligned} F(x)x+1 &= F(x) \\ F(x) &= \frac{1}{1-x} \end{aligned} \]亦或者等比数列 \([1,a,a^2,a^3,\dots]\) 的生成函数 \(F(x)=\sum_{i\geqslant0}a^ix^i\):
\[\begin{aligned} F(x)ax+1 &= F(x) \\ F(x) &= \frac{1}{1-ax} \end{aligned} \]这里列举一些:
\[\begin{aligned} &\sum_{i\geqslant0}x^i=\frac{1}{1-x}\\ &\sum_{i\geqslant0}a^ix^i=\frac{1}{1-ax}\\ &\sum_{i\geqslant0}x^{2i}=\frac{1}{1-x^2}\\ &\sum_{i\geqslant0}(i+1)x^i=\frac{1}{(1-x^2)} \end{aligned} \]我们一般先将初始的几个函数转成封闭形式,乘起来后再转回开放形式得到答案。