生成函數


也許更好的閱讀體驗

一般生成函數(OGF)

引入

考慮一類組合對象組成的集合\(A\),其中:

  • 每個元素\(a\in A\)都被定義了“大小”\(|a|\),它是一個非負整數。
  • 對於給定的\(n\),大小為\(n\)的元素的數量是有限的,記作\(A_n\)

eg. \(A\)是全體\(01\)串組成的集合,一個\(01\)串的大小被定義為它的長度則\(A_n=2^n\)

定義

\(A\left( x\right) =\sum ^{\infty }_{i=0}A_ix^{i}\)
\(A\)的一般生成函數
注意

  • \(A(x)\)為一個多項式
  • 這里的\(A_i\)為第\(i\)項的 系數

這是一個形式冪級數,不用考慮何時收斂
這里的\(x^i\)為形式冪,無實義,一般也不會去求
但是\(x^i\)有區分實際意義的作用,即\(x^i\rightarrow\)\(i\)
\(x^i\)的系數為第\(i\)種狀態的答案
這個不好說,舉個例子
eg.
\(A\)是全體\(01\)串組成的集合,則
\(\begin{aligned}A\left( x\right) =\sum ^{\infty }_{i=0}2^{i}x^{i}\end{aligned}=\dfrac{1}{1-2x}\)
最后一步是用的等比數列求和公式,不用考慮何時收斂,所以認為其很大是趨近於0
其中\(A_i=2^i\),表示長度為\(i\)的答案為\(2^i\)
\(x^i\)的系數就是長度為\(i\)的答案,它是用於區分這個的

運算

有兩類組合對象\(A\)\(B\)

  • 定義\(C\)\(A\)\(B\)的並集
    \(C(x) =A(x) +B(x),O(n)\)計算
  • 定義\(D\)\(A\)\(B\)的笛卡爾積,也即\(D\)中每個元素\(d\)都是\(A\)中某元素\(a\)\(B\)中某元素\(b\)拼成的二元組\((a,b)\),其大小\(|d|\) 定義為\(|a|+|b|\)
    \(D(x) =A(x)B(x)\)\(FFT\)乘法\(O(nlogn)\)計算

eg:
\(A\)是全體\(01\)串組成的集合,\(B\)是全體字母組成的集合

\(\begin{aligned}A\left( x\right) =\sum ^{\infty }_{i=0}2^{i}x^{i}\end{aligned}=\dfrac{1}{1-2x}\)
\(\begin{aligned}B\left( x\right) =\sum ^{\infty }_{i=0}26^{i}x^{i}\end{aligned}=\dfrac{1}{1-26x}\)

\(C(x)=A(x)+B(x)\)\(C(x)\)表示全體\(01\)串與全體字母的並集
\(C(x)\)\(x^i\)項的系數表示長度為\(i\)\(01\)串與字符串有多少

\(D(x)=A(x)B(x)\)\(D(x)\)表示\(01\)串與字符串拼接出的串(前面是\(01\)串,后面是字符串)
\(D(x)\)\(x^i\)項的系數表示長度為\(i\)的拼接出的串有多少
其中某串長度可以為0

個人理解

我們發現上面的例題中的\(D\)如果我們不考慮多項式
自己暴力的去算,也有這樣的公式
\(\begin{aligned}\sum_{i+j=n}a_ib_j\end{aligned}\)
其中\(a_i\)表示長度為\(i\)\(01\)串有多少種,\(b_j\)表示長度為\(j\)的字符串有多少種
然后我們可以發現長度\(i+j\)的答案會由\(i\)\(j\)項得到,再發現其與指數乘法有相似之處,即\(x^ix^j=x^{i+j}\),之后就想到將答案存為其系數,\(x^i\)表示實際意義,於是就可以用多項式來解決問題,因為多項式可以\(FFT\)優化,比暴力快很多
(我覺得生成函數可能就是這么來的.....)


指數生成函數(EGF)

引入

有時我們需要考慮帶標號的組合對象,比如圖
\(n\)個點的標號圖,頂點的標號恰好為\(1\sim n\)

帶標號對象的拼接

將兩個對象\(a;b\)拼接起來,\(|a|=n,|b|=m\)

  • 無標號時,只有一種方法
  • 帶標號時,規定拼接時拼接對象內部相對標號順序不變,而互相的標號
    可以改變,則有\(C_{n+m}^{n}(\begin{pmatrix} n+m \\ n \end{pmatrix})\)種拼接方法
    因為只要考慮前\(a\)中的\(n\)個用了哪些標號,剩下的\(m\)個給\(b\)中的\(m\)個,答案唯一,而對象內部相對標號順序不變,所以得到的標號如何分配也是唯一的
    eg.
    \(213,21\)(每個數字是一個標號)拼接,有\(10\)種方法
    數字表示分配的標號
    \(435,21|\ 425,31|\ 325,41|\ 324,51|\ 415,32\)
    \(315,42|\ 314,52|\ 215,43|\ 214,53|\ 213,54\)
    如第一種方案\(435\)對應的\(231\)相對標號順序不變,\(31\)對應的\(21\)相對標號順序也不變

定義

對於帶標號組合對象組成的集合\(A\),定義
\(\begin{aligned}A\left( x\right) =\sum _{i= 0}^nA_{i}\dfrac {x^{i}}{i!}\end{aligned}\)
\(A\)的指數生成函數

運算

有兩類組合對象\(A\)\(B\)

  • 定義\(C\)\(A\)\(B\)的並集
    \(C(x) =A(x) +B(x),O(n)\)計算
  • 定義\(D\)\(A\)\(B\)的笛卡爾積,也即\(D\)中每個元素\(d\)都是\(A\)中某元素\(a\)\(B\)中某元素\(b\)拼成的二元組\((a,b)\),其大小\(|d|\) 定義為\(|a|+|b|\)
    \(D(x) =A(x)B(x)\)\(FFT\)乘法\(O(nlogn)\)計算

沒錯,就是復制上面的內容
對於\(D(x)\)
\(\begin{aligned}D(x)=\sum _{i+j=n}A_{i}B_{j}\dfrac {\left( i+j\right) !}{i!j!}\end{aligned}\)
\(\begin{aligned}\dfrac {D(x)}{n!}=\sum _{i+j=n}\dfrac {Ai}{i!}\dfrac {B_{j}}{j!}\end{aligned}\)
所以乘法運算成立

個人理解

如引入中的問題
用一般生成函數來求解
\(\begin{aligned}D\left( x\right) =A\left( x\right) B\left( x\right) =\sum ^{n}_{i+j=n}A_{i}\cdot B_{j}\begin{pmatrix} n \\ i \end{pmatrix}\end{aligned}\)
最后又化簡成

\(\begin{aligned}\dfrac {D(x)}{n!}=\sum _{i+j=n}\dfrac {Ai}{i!}\dfrac {B_{j}}{j!}\end{aligned}\)
於是我們就弄出一個指數生成函數方便運算且省去求組合數

以下\(A\)為生成函數

生成序列(seq)

如字面意思,要生成一個序列
序列的順序是確定的
\(\begin{aligned}seq\left( A\right) =\sum ^{\infty }_{i=0}Ai=\dfrac {1}{1-A}\end{aligned}\)

生成集合(set)

如字面意思,要生成一個集合
集合的順序是無關緊要的,所以要除以全排列

\(\begin{aligned}set\left( A\right) =\sum ^{\infty }_{i=0}\dfrac{A^i}{i!}=e^A\end{aligned}\)

最后一步是因為該式子符合\(e^x\)的泰勒展開
關於泰勒展開可看我的該篇博客泰勒公式於牛頓迭代

如有哪里講得不是很明白或是有錯誤,歡迎指正
如您喜歡的話不妨點個贊收藏一下吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM