1. 程式人生 > 其它 >淺談生成函式

淺談生成函式

生成函式

生成函式(generating function),又稱母函式,是一種形式冪級數,其每一項的係數可以提供關於這個序列的資訊。
生成函式有許多不同的種類,但大多可以表示為單一的形式

\[F(x) = \sum_{n}a_nk_n(x) \]

其中 \(k_n(x)\) 被稱為核函式,不同的核函式會匯出不同的生成函式,分成3類

普通生成函式:\(k_n(x)=x^n\)OGF
指數生成函式:\(k_n(x)=\dfrac {x^n} {n!}\)EGF
狄利克雷生成函式:\(k_n(x)=\dfrac {1} {n^x}\)DGF

另外,對於生成函式 \(F(x)\)

,我們用 \([k_n(x)]F(x)\) 來表示它的第 \(n\) 項的核函式對應的係數,也就是 \(a_n\)

容易發現其中的 \(x\) 對於原式中的結果並沒有什麼影響,我們想要的應該是固定項前面的係數

普通生成函式

形式:

\[F(x) = \sum_{n}a_n x^n \]

\(a\) 既可以是有窮序列,也可以是無窮序列

若干例子:
序列 \(a=\langle 1,2,3\rangle\) 的OGF:\(1+2x+3x^2\)
序列 \(a=\langle 1,1,1,\dots,1\rangle\) 的OGF:\(\displaystyle\sum_{n} x^n\)
序列 \(a=\langle 1,2,4,8,16,\dots\rangle\)

的OGF:\(\displaystyle \sum_n 2^nx^n\)
序列 \(a=\langle 1,3,5,7,9,\dots\rangle\) 的OGF:\(\displaystyle \sum_n (2n+1)x^n\)

基本運算

考慮兩個序列 \(a,b\) 的普通生成函式,分別為 \(F(x),G(x)\),那麼有

\[F(x)\pm G(x)=\sum_n (a_n\pm b_n)x^n \]

因此 \(F(x)\pm G(x)\) 是序列 \(\\langle a_n\pm b_n \rangle\)

考慮乘法運算,也就是卷積:

\[F(x)G(x)=\sum_n x^n \sum_{i=0}^n a_ib_{n-i} \]

封閉形式

這是OGF比較好玩的一個東西,就是說每次寫成一個多項式真的很難受,但是如果能夠把這個形式冪級數寫成其它的形式可能就會好很多

對於上述例二,容易發現:

\[xF(x)+1=F(x) \]

很容易想到移項後可以得到:\(F(x)=\dfrac {1}{1-x}\)
可能會有點疑惑,這個東西怎麼還能是負數?
實際上發現,如果要讓前面的形式冪級數在 \(\infty\) 處收斂,x的範圍應在 \(\in (-1,1)\)
但是還是不需要去理它,因為我們生成函式的本質不在於這個 \(x\) 的取值,或者說對於這個封閉形式,只是一種方便推過去和推回來的過程罷了,並不是對原式的具體闡述

有若干種物品 ,每種物品只有1件,求取 \(n\) 件物品的總方案數。

每種物品的生成函式是 \(1\times x^0+1\times x^1\)
那麼若干個物品乘起來就是 \((x+1)^n\)
然後用二項式定理展開一下就可以得到:

\(\displaystyle (x+1)^n=\sum_{i=0}^n \binom {n} {i}x^i\)

如果學過組合數學就會發現這個確實很對

當然也有比較噁心的

有若干種物品 ,每種物品可以取任意件,求取 \(n\) 件物品的總方案數

和上個題一樣,每個物品的生成函式是:\(\displaystyle\sum_{i=0}^n x^i\) 很快就能發現,又等於 \(\dfrac 1 {1-x}\)

這樣的話 \(m\) 件物品的生成函式就是

\[\begin{aligned} \dfrac {1} {(1-x)^m}=&(1-x)^m\\ =&\sum_{i=0}^{\infty} \dfrac {-m \times (-m-1) \dots (-m-i+1)} {i!}(-x)^i\\ =&\sum_{i=0}^{\infty} \dfrac {(-1)^i \times m \times (m+1)\dots (m+i-1)} {i!}(-1)^ix^i\\ =&\sum_{i=0}^{\infty} \dfrac {(m+i-1)!} {i!(m-1)!}x^i\\ =&\sum_{i=0}^{\infty} \binom {m + i - 1} {m - 1}x^i \end{aligned} \]

同時可以用隔板法理解,答案是相同的

來個重頭戲:斐波那契數列:

前置知識:

\(\displaystyle\dfrac {1} {1-kx}=\sum_{i=0}k^ix^i\)

\(F(x)\) 表示斐波那契數列的生成函式

首先第一步拆分,容易得到:

\[\begin{aligned} A =& 1+1x+2 x^2 + 3x^3+5x^4+8x^5\\ xA =& ~~~~~~~~~ x+ 1x^2+2x^3+3x^4+5x^5\\ x^2A=&~~~~~~~~~~~~~~~~1x^2+1x^3+2x^4+3x^5 \end{aligned} \]

容易發現下面兩個相加就只和第一個差出來一個數1

\(A-xA-x^2A=1\)

整理一下:\(A=\dfrac {1}{1-x-x^2}\)

然後發現這和上面補充的前置知識太相似了,如果能做到和前面的那個完全一樣就好了

然後就是很多套路性的轉化了

第一個因式分解,\(1-x-x^2=(1-ix)(1-jx)\)

解得 \(i=\dfrac {1+\sqrt 5} {2}~~j =\dfrac {1-\sqrt 5} {2}\)

但是這時候還是兩個 \(\dfrac {1} {1-kx}\) 的卷積,容易發現既然根式都出來了,上面的1也順路拆了算了

\(ai+bj=1\),得到 \(a=\dfrac {1} {{\sqrt 5}}i~~b=-\dfrac {1} {\sqrt 5}j\)
帶回原來的式子裡,裂項以後拆成一個巨無霸式子:

\(A=\dfrac {i} {\sqrt 5}\dfrac {1}{1-ix}-\dfrac{j}{\sqrt 5}\dfrac{1}{1-jx}\)

寫的更加簡便一點:

\(\displaystyle A = \dfrac {M} {1-ax}+\dfrac {N} {1-bx}=\sum_{k=0}(Ma^k + Nb^k)x^k\)

同時 \(M=\dfrac {\sqrt 5 i} {5},N=-\dfrac {\sqrt 5 j} {5},a=i,b=j\)
然後就是前面的基本多項式運算了

\(\displaystyle F(x)=\sum_{k=0}((\dfrac {\sqrt 5 i} {5}) \times (\dfrac {1+\sqrt 5} 2)^k-\dfrac {\sqrt 5 j} {5}\times (\dfrac {1-\sqrt 5} {2})^k)x^k\)

經過一點點化簡就能得到:

\[ \frac{x}{1-x-x^2}=\sum_{n\ge 0}x^n \frac{1}{\sqrt{5}}\left( \left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n \right) \]

到這裡其實要說的也就差不多了