今天來填上之前那個坑。
什么是生成函數
生成函數(\(\texttt{Generating Function}\))是一種形式冪級數,其每一項的系數可以提供對應序列的信息。
一般來說生成函數的形式為:
\[F(x)=\sum_{n}a_nf_n(x) \]
其中 \(f_n(x)\) 函數被我們稱為核函數,不同核函數對應不同的生成函數,擁有不同性質:
- 普通生成函數:\(f_n(x)=x^n\)
- 指數生成函數:\(f_n(x)=\frac{x^n}{x!}\)
- 狄利克雷生成函數:\(f_n(x)=\frac{1}{n^x}\)
而 \(a_n\) 稱為 \(f_n(x)\) 在 \(F(x)\) 中的系數 (\(\texttt{Coefficient}\)),寫作
\[a_n=[f_n(x)]F(x) \]
\(\{a_n\}\) 可以為有窮序列也可以是無窮序列。
普通生成函數
定義形式冪級數
\[F(x)=\sum_na_nx^n \]
為數列 \(\{a_n\}\) 的普通生成函數(\(\texttt{Ordinary Generating function-OGF}\))。
\(\texttt{for example:}\)
數列 \(\{a_n\}=\{0,1,2,3,\cdots\}\) 的普通生成函數是 \(\sum_{n\geq0}n\times x^n\)
而數列 \(\{a_n\}=\{ 0,1,2,3 \}\) 的普通生成函數是 \(0+x+2x^2+3x^3\)
數列 \(\{a_n\}\) 的起點決定了冪的起點。以上我們約定以 \(0\) 作起點編號,下同。
基本運算
與復數或反演等其他數論知識類似,生成函數也有自己基本運算的定義。也就是生成函數與生成函數之間的直接運算。
加減
假設有數列 \(\{a_n\},\{b_n\}\) 各自的 OGF \(F(x),G(x)\)。根據定義則有:
\[F(x)\pm G(x)=\sum_{n}(a_n+b_n)x^n \]
我們在序列的定義中有序列 \(\{ a\pm b\}\) 的定義,所以我們可以認為 \(F(x)\pm G(x)\) 為 \(\{ a\pm b\}\)的 OGF。
卷積
對於函數來說乘法運算就是做卷積,所以定義數列 \(\{a_n\},\{b_n\}\) 各自的 OGF \(F(x),G(x)\) 卷積可得:
\[F(x)\sdot G(x)=\sum_nx^n\sum_{i=0}^na_ib_{n-i} \]
那么同理 \(F(x)\sdot G(x)\) 是數列 \(\{c_n\}=\displaystyle\{ \sum_{i=0}^n a_ib_{n-i}\}\) 的 OGF,也就是兩數列卷積的 OGF。
移位
我們可以將生成函數進行移位,具體表現就是原來數列對應的生成函數編號整體變小向前移或變大向后移。
想做移位我們有
\[x^m\sum_{n\geq0}a_nx^n=\sum_{n\geq m}a_{n-m}x^n\\ \frac{1}{x^m}\bigg(\sum_{n\geq 0}a_nx^n-\sum_{n\geq 0}^{m-1}a_nx^n\bigg)=\sum_{n\geq 0}a_{n+m}x^n \]
生成函數是不存在負指數的,所以前移時我們減去前 \(m\) 項。
求導與積分
如果單獨對 \(a_nx^n\) 求很簡單:
對上式求導得:
\[na_xx^{n-1} \]
積分得:
\[\frac{a_n}{n+1}x^{n+1} \]
所以對生成函數逐項求導/積分整理得:
\[\frac{\mathrm d}{\mathrm{d}x}\bigg(\sum_{n\geq 0}a_nx^n\bigg)=\sum_{n\geq 0}(n+1)a_{n+1}x^n\\ \int\bigg(\sum_{n\geq 0} a_nx^n\bigg)\mathrm{d}x=\sum_{n\geq 0}\frac{a_{n-1}}{n}x^n+C \]
舉(幾)個栗子
Fibonacci
大家耳熟能詳的斐波拉契數列(\(\{fib_n\}\) 方便起見下文寫作 \(\{f_n\}\))定義為:
\[f_0=0,f_1=1,f_i=f_{i-1}+f_{i-2}(i\geq 1) \]
設其 OGF 為 \(F(x)=\sum_{n\geq 0}f_nx^n\)。容易發現其性質允許我們使用錯位相減法。
\[\begin{aligned} F(x) &= &f_0x^0+f_1x^1+f_2x^2+f_3x^3+\cdots\\ xF(x) &= &f_0x^1+f_1x^2+f_2x^3+\cdots\\ x^2F(x)&= &f_0x^2+f_1x^3+\cdots \end{aligned} \]
整理得:
\[F(x)=x+xF(x)+x^2F(x) \]
解方程有:
\[F(x)=\frac{x}{1-x-x^2} \]
我們觀察分母是最高是二次,分子單獨為一次的 \(x\) 所以可以考慮設一個待定系數分式方程。
\[\frac{A}{1-ax}+\frac{B}{1-bx}=\frac{x}{1-x-x^2} \]
通分有
\[\frac{A-Abx+B-aBx}{(1-ax)\times(1-bx)}=\frac{x}{1-x-x^2} \]
得
\[\begin{cases} A+B=0\\ Ab+aB=-1\\ a+b=1\\ ab=-1 \end{cases}\Rightarrow \begin{cases} A=\frac{1}{\sqrt5}\\ B=-\frac{1}{\sqrt5}\\ a=\frac{1+\sqrt5}{2}\\ b=\frac{1-\sqrt5}{2} \end{cases} \]
對於等比數列的展開式:
\[\frac{1}{1-ax}=\sum_{i\geq 0}a^ix^i \]
我們可以將 \(F(x)\) 列成:
\[F(x)=\frac{x}{1-x-x^2}=\sum_{n\geq 0}x^n\frac{1}{\sqrt5}\bigg[\bigg(\frac{1+\sqrt5}{2}\bigg)^n-\bigg(\frac{1-\sqrt5}{2}\bigg)^n\bigg] \]
這就是我們斐波拉契數列 OGF \(F(x)\) 的兩種封閉形式。
Catalan
定義卡特蘭數數列 \(\{c_n\}\) 為
\[c_n=\begin{cases} 1&n\in\{0,1\}\\ \displaystyle\sum_{i=0}^{n-1}c_ic_{n-i-1}&n>1\\ \end{cases} \]
眾所周知卡特蘭數列是有對應組合意義的,我們在這里先不劇透。
我們設卡特蘭數列的 OGT 為 \(C(x)\) 則有:
\[C(x)=\sum_{n\geq 0}c_nx^n \]
\(\{c_n\}\) 的遞推式形式很奇怪,很像是一個數列卷積形式,實際上,\(c_{n+1}\) 就是 \(\{c_n\}\) 與自己卷積后的第 \(n\) 項。看不出來沒有關系,我們只需要嘗試亂搞將 \(C(x)\) 化為一個卷積形式解出 \(C(x)\) 的封閉形式。
\[\begin{aligned} C(x)&=\sum_{n\geq 0}c_nx^n\\ &=\sum_{n\geq 0}\bigg(\sum_{i=0}^{n-1}c_ic_{n-i-1}\bigg)x^n \end{aligned} \]
我們發現里面的和式以 \(n-1\) 為上界,所以可以考慮換元移位,剛好只需要移一位而 \(c_0=1\)。
\[\begin{aligned} &\cdots\\ &=1+\sum_{n\geq 1}\bigg(\sum_{i=0}^{n-1}c_ic_{n-i-1}\bigg)x^n\\ &\text{see n-1 as n'}\\ &=1+x\sum_{n'\geq 0}\bigg(\sum_{i=0}^{n'}c_ic_{n'-i}\bigg)x^{n'}\\ &=1+xC^2(x) \end{aligned} \]
得
\[\begin{aligned} C(x)&=xC^2(x)+1\\ C(x)-xC^2(x)-1&=0\\ xC^2(x)-C(x)+1&=0\\ C(x)&=\frac{1\pm\sqrt{1-4x}}{2x} \end{aligned} \]
嘗試分子有理化
\[\frac{1\pm\sqrt{1-4x}}{2x}=\frac{1-(1-4x)}{2x(1\mp\sqrt{1-4x})}=\frac{2}{1\mp\sqrt{1-4x}} \]
我們知道 \(C(0)=1\)
代入后會發現只有原式分子取 '\(-\)' 時成立,否則會出現分母 \(=0\) 的情況。
所以卡特蘭數列 OGF 的封閉形式是
\[C(x)=\frac{1-\sqrt{1-4x}}{2x} \]
我們怎么展開這樣一個式子呢。
對於 \(\sqrt{1-4x}\) 可以看成 \((1-4x)^{\frac{1}{2}}\) 然后我們就可以直接套用廣義二項式定理。
(廣義二項式定理:\(\displaystyle(x+y)^\alpha=\sum_{k=0}^\infty\binom{\alpha}{k}x^{\alpha-k}{y^k}\) 其中\(\displaystyle\binom{\alpha}{k}=\frac{\alpha(\alpha-1)\cdots(\alpha-k+1)}{k!}\))
所以展開得
\[\begin{aligned} (1-4x)^{\frac{1}{2}}&=\sum_{n=0}^\infty\binom{\frac{1}{2}}{n}(-4x)^n\\ &=\sum_{n=0}^\infty\frac{\frac{1}{2}\times(\frac{1}{2}-1)\times(\frac{1}{2}-2)\times\cdots\times(\frac{1}{2}-n+1)}{n!}(-4x)^n\\ &=1+\sum_{n=1}^\infty(-1)^{n-1}\frac{\prod_{i=2}^n(2i-3)}{2^n\times n!}(-4x)^n\\ &=1-\sum_{n=1}^\infty\frac{\prod_{i=2}^n(2i-3)}{n!}(2x)^n\\ &=1-\sum_{n=1}^\infty\frac{(2n-3)!}{n!\times\prod_{i=2}^n(2i-2)}(2x)^n\\ &=1-\sum_{n=1}^\infty\frac{(2n-2)!}{(n-1)\times!n!\times2^{n-1}}(2x)^n\\ &=1-2\sum_{n=1}^\infty\frac{(2n-2)!}{(n-1)!\times n!}x^n \end{aligned} \]
代入 \(C(x)\) 有:
\[\begin{aligned} C(x)&=\frac{\displaystyle\bigg(2\sum_{n=1}^\infty\frac{(2n-2)!}{(n-1)!\times n!}x^n\bigg)}{2x}\\ &=\sum_{n=1}^\infty\frac{(2n-2)!}{(n-1)!\times n!}x^{n-1}\\ &=\sum_{n=0}^\infty\frac{(2n)!}{n!\times(n+1)!}x^n\\ &=\sum_{n=0}^\infty\frac{\binom{2n}{n}}{n+1}x^n\\ \end{aligned} \]
於是得到 \(c_n=\frac{\binom{2n}{n}}{n+1}\)。
對於這個數的組合意義就有很多種了,在 OI 中我們一般可以應用到的有:\(n\) 個點的二叉樹的個數,\(n\) 對括號的合法括號序列數,計算幾何中將 \(n+2\) 邊形進行三角划分的方案數。
小結一下
生成函數其實是一個很大的數學知識點。雖說計數題在 OI 模擬賽中十分常見,但是真正比賽卻沒有多少很難的生成函數計數題,因為實際上過於簡單的沒有含金量,過難的並沒有什么意義。其實關於生成函數我不打算繼續擴展,因為實在太難了。 掌握基本的生成函數有助於學習組合意義,提升推式子能力,其他。。。就看着辦吧!!!
\[\text{OGF——}\texttt{2021.06.11寫在筆記本電腦前} \]
Reference: