1. 程式人生 > 其它 >斯特林數與斯特林反演

斯特林數與斯特林反演

我們熟知一個度數為 \(D\) 的多項式有三種經典表示:

  1. 係數表示,也就是 \(P(x) = \sum_{i=0}^D\limits c_i x^i\)

  2. 點值表示,也即給出 \(P\)\(D+1\) 個不同的位置的取值 \((x_0, P(x_0)), \dots, (x_D, P(x_D))\).

  3. 下降冪表示,也即定義 \(x^{\underline{i}} = x(x-1)\dots (x-i+1)\),那麼可以把 \(P\) 寫為 \(P(x) = \sum_{i=0}^D\limits b_i x^{\underline{i}}\).

由 (1) 和 (2) 相互轉化可以使用多項式的多點求值和快速插值。

在點值表示中,如果我們的取值點是經典的前 \(D+1\) 個非負整數,也即 \(P(0),\dots,P(D)\),那麼可以藉助二項式反演和 \(FFT\),以 \(O(D\log D)\) 的時間在 (2) 和 (3) 之間轉化。

第一類斯特林數

我們考慮從 (3) 轉化為 (1)。為此我們考慮對任意 \(i\ge 0\),把 \(x^{\underline{i}}\) 寫成一個 \(i\) 次多項式:

\[x^{\underline{i}} = x (x-1)\dots (x-i+1) = \sum_{j=0}^i s(i,j)\cdot x^j, \]

其中 \(s(i,j)\) 是我們希望求出的係數。我們可以通過遞推來求出 \(s(i,j)\)

\[s(i,j) = [x^j]x^{\underline{i}} = [x^j] (x^{\underline{i-1}}\cdot (x-(i-1))) = s(i-1,j-1) - (i-1)\cdot s(i-1,j), \]

時間複雜度為 \(O(n^2)\). 得到 \(s(\star, \star)\) 之後,我們可以在 \(O(n^2)\) 的時間內完成由 (1) 和 (3) 之間的相互轉化。

這裡的 \(s(i,j)\) 就是(有符號)第一類斯特林數。

定義 (有符號第一類斯特林數). 對任意 \(i,j\ge 0\),定義 \(s(i,j)\)\(x^{\underline{i}}\)

展開之後 \(x^j\) 一項的係數。

類似地,考慮上升冪 \(x^{\overline{i}}=x(x+1)\dots (x+i-1)\) 展開後得到的的多項式 \(x^{\overline{i}} = \sum_{j=0}^{i}\limits s_u(i,j) x^j\)

定義 (無符號第一類斯特林數). 對任意 \(i,j\ge 0\),定義 \(s_u(i,j)\)\(x^{\overline{i}}\) 展開後 \(x_j\) 一項的係數。

\[s_u(i,j)=[x^j]x^{\overline{i}}=[x^j](x^{\overline{i-1}}\cdot(x+i-1)) \\ =s(i-1,j-1)+(i-1)\cdot s(i-1,j) \]