化零多项式,例如特征多项式可以优化单变量的线性递推(详见博客《特征多项式优化线性递推》),我们来考虑多变量线性递推。我们先来看几个问题,从中体会一下怎么利用化零多项式优化线性递推。
好集个数
如果一个集合的全体元素之和为 $3$ 的倍数,我们则称之为好集(空集元素之和为 $0$ )。
那么,在集合 $\{1,2,3,…,3n\}$ 的所有子集中,有多少个好集?
这道题(个人认为的)最漂亮的做法并不是利用线性递推,我将这个做法补充在文章结尾。
我们暴力一点,假设 $a_n$ 表示和为 $3$ 的倍数的集合个数,$b_n$ 表示和除 $3$ 余 $1$ 的集合个数,$c_n$ 表示和除 $3$ 余 $2$ 的集合个数,于是我们有:
我们记:
考虑 $A$ 的特征多项式 $f(\lambda)=-\lambda^3+12\lambda^2-36\lambda+32$。
根据 Caylay-Camilton 定理我们有 $f(A)=-A^3+12A^2-36A+32I=0$,于是我们得到:
故:$a_{n+3}-12a_{n+2}+36a_{n+1}-32a_n =0 \Leftrightarrow a_{n+3}=12a_{n+2}-36a_{n+1}+32a_n$。
我们就根据转移矩阵得到递推式了,之后我们就可以使用特征方程法或者生成函数法求通项了,这都是后话。
值得注意的是,如果使用特征方程法,其特征方程就是 $f(\lambda)=0$(想想为什么) 。
一般化
我们发现这个方法适用于任何有较多变量的线性递推(其实任何能用转移矩阵转移的都可以),我们只需要求出转移矩阵的特征多项式。那么对于线性递推中的每一个变量,其递推式系数就是特征多项式前的系数。
有趣的是,每一个不同的变量拥有同样的递推式和特征方程。
好集个数问题的一个非递推解法
考虑函数 $f(x)=(x+1)(x^2+1)(x^3+1)…(x^{3n}+1)$ 的展开式。我们记:
三式相加可得 $3p=2^{3n}+2^{n+1}$ ,答案即 $p=\frac{2^{3n}+2^{n+1}}{3}$ 。