生成函數作為計數的記帳工具
假設你有一整串計數——比如 a0, a1, a2, ...,其中 ak 是用 k 單位某資源去做某事的方法數。追蹤一整串很麻煩。生成函數是一個巧妙的記帳技巧:把整串掛在一個佔位符號 x 的各次方上,把 a0 + a1 x + a2 x^2 + a3 x^3 + ... 寫成單一個物件。變數 x 只是個標籤——它從不取數值——而 x^k 的係數儲存了第 k 個計數。
神奇之處在於,對物件做的組合運算會變成對級數做的「代數」。「從幾個獨立群組中選取」變成把各群組的生成函數「相乘」,因為兩個級數相乘時,x^k 的係數會自動把 k 分配到兩群組的所有方式加總起來——這正是乘法與加法原理協同運作。例如,一枚硬幣你可以拿(貢獻 x)或不拿(貢獻 1),其生成函數是 (1 + x);n 枚這樣的獨立硬幣給出 (1 + x)^n,其 x^k 的係數是 C(n,k)——二項式係數就作為所有子集的記帳而掉出來。星號與隔板的計數同樣從 1 + x + x^2 + ... = 1/(1-x) 這類幾何級數的乘積中浮現。
如此處理時,這個級數是「形式的」:你把它當作符號帳本來操作並讀出係數;你不代入數值,也不擔心它是否收斂。這正是這裡的重點——它是一個計數裝置,是讓代數替你記帳的方法。(這不同於隨機變數的機率母函數,那裡你真的會代入數值並詢問機率;那屬於本主題另一個角落。)
用 1 分與 5 分硬幣(各種數量不限)湊出 6 分有幾種方式?用 (1 + x + x^2 + ...) 追蹤 1 分硬幣、用 (1 + x^5 + x^10 + ...) 追蹤 5 分硬幣;相乘後,x^6 的係數就是答案(這裡是 2:六枚 1 分,或一枚 5 分加一枚 1 分)。記帳替你完成了分類討論。
把計數序列裝進 x 的係數;乘積執行了計數。
這裡的級數是「形式的」——x 是記帳標籤而非數值,收斂與否無關緊要。別把這種計數用途和隨機變數的機率母函數混為一談,後者的變數是真的會被代入的。