组合计数与反演 —— 反演

【概述】

对于两个数列 \{f_i\}\{g_i\},他们之间满足 g_n=\sum_{i=0}^n a[n][i]f_i ,此时,若已知数组 a 和数列 \{f_i\},则可以推出 \{g_i\}

那么反演过程就是找到一个数组 b,通过使用 \{g_i\} 的值,来反推出 \{f_i\},即:f_n=\sum_{i=0}^n b[n][i]g_i

如果只考虑上面两个公式,整个方程组实际上是一个下三角矩阵的形式,因此从本质上来说,反演是一个解线性方程组的过程。

引入克罗内克函数:\delta (i,j)=\left\{\begin{matrix}1 ,i= j \\ 0,i\neq j \end{matrix}\right.

由 g_n=\sum_{i=0}^n a[n][i]f_i 可得 g_i=\sum_{j=0}^i a[i][j]f_j

考虑反演的过程:f_n=\sum_{i=0}^n b[n][i]g_i,将 g_i 代入,有:

\begin{align*}f_n &=\sum_{i=0}^nb[n][i]g_i \\ &=\sum_{i=0}^nb[n][i]\sum_{j=0}^ia[i][j]f_j \\ &=\sum_{i=0}^nf_i\sum_{j=i}^nb[n][j]*a[j][i]\end{align*}

对于最后一步,实质上是交换了求和顺序,将第二步按照矩阵形式写出,有:

\begin{bmatrix} b[n][0]*a[0][0]f_0 & & & \\ b[n][1]*a[1][0]f_0 & b[n][1]*a[1][1]f_1 & & \\ b[n][2]*a[2][0]f_0 & b[n][2]*a[2][1]f_1 & b[n][2]*a[2][2]f_2 & \\ ...& ... & \ddots & \\ b[n][n]*a[n][0]f_0& b[n][n]*a[n][1]f_1 & ... & b[n][n]*a[n][n]f_n \end{bmatrix}

可以看出,第二步是先对行进行,再将各行相加,那么第三步就是对列进行,然后再将各列相加,考虑每一个 f_i 的系数,显然只有 f_n 的系数为 1

那么反演式 f_n=\sum_{i=0}^n b[n][i]g_i 成立的充要条件是:\sum_{j=i}^nb[n][j]*a[j][i]=\delta(i,j)

同理,将 f 代入 g 的求和式中,可以推出:\sum_{j=i}^na[n][j]*b[j][i]=\delta(n,i)

也就是说,如果某个数列满足上面两个条件,就可以直接建立起反演公式。

可以发现,快速傅里叶变换与逆变换、第一类斯特林数、第二类斯特林数、二项式定理等满足这个条件,可以视为是一个反演的过程。

posted @ 2022-09-20 22:51  老程序员111  阅读(29)  评论(0)    收藏  举报