生成函數

也許更好的閱讀體驗

一般生成函數(OGF)

引入

考慮一類組合對象組成的集合AA,其中:

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

eg. AA是全體0101串組成的集合,一個0101串的大小被定義爲它的長度則An=2nA_n=2^n

定義

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

  • A(x)A(x)爲一個多項式
  • 這裏的AiA_i爲第ii項的 係數

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

運算

有兩類組合對象AABB

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

eg:
AA是全體0101串組成的集合,BB是全體字母組成的集合

A(x)=i=02ixi=112x\begin{aligned}A\left( x\right) =\sum ^{\infty }_{i=0}2^{i}x^{i}\end{aligned}=\dfrac{1}{1-2x}
B(x)=i=026ixi=1126x\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)=A(x)+B(x)C(x)C(x)表示全體0101串與全體字母的並集
C(x)C(x)xix^i項的係數表示長度爲ii0101串與字符串有多少

D(x)=A(x)B(x)D(x)=A(x)B(x)D(x)D(x)表示0101串與字符串拼接出的串(前面是0101串,後面是字符串)
D(x)D(x)xix^i項的係數表示長度爲ii的拼接出的串有多少
其中某串長度可以爲0

個人理解

我們發現上面的例題中的DD如果我們不考慮多項式
自己暴力的去算,也有這樣的公式
i+j=naibj\begin{aligned}\sum_{i+j=n}a_ib_j\end{aligned}
其中aia_i表示長度爲ii0101串有多少種,bjb_j表示長度爲jj的字符串有多少種
然後我們可以發現長度i+ji+j的答案會由iijj項得到,再發現其與指數乘法有相似之處,即xixj=xi+jx^ix^j=x^{i+j},之後就想到將答案存爲其係數,xix^i表示實際意義,於是就可以用多項式來解決問題,因爲多項式可以FFTFFT優化,比暴力快很多
(我覺得生成函數可能就是這麼來的…)


指數生成函數(EGF)

引入

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

帶標號對象的拼接

將兩個對象a;ba;b拼接起來,a=nb=m|a|=n,|b|=m

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

定義

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

運算

有兩類組合對象AABB

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

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

個人理解

如引入中的問題
用一般生成函數來求解
D(x)=A(x)B(x)=i+j=nnAiBj(ni)\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}
最後又化簡成

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

以下AA爲生成函數

生成序列(seq)

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

生成集合(set)

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

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

最後一步是因爲該式子符合exe^x的泰勒展開
關於泰勒展開可看我的該篇博客泰勒公式於牛頓迭代

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章