📜  用多项式归约法求解齐次递归方程(1)

📅  最后修改于: 2023-12-03 15:27:12.672000             🧑  作者: Mango

用多项式归约法求解齐次递归方程

齐次递归方程是一类常见的数学问题,在计算机领域也有广泛的应用。其中解决齐次递归方程的一个重要方法就是用多项式归约法。

多项式归约法的背景

在解决一般的线性递归方程时,我们通常采用特征方程的方法求解。但是对于齐次递归方程,特征方程不一定包含所有解,我们需要寻找更加有效的方法来求解。

多项式归约法就提供了一种新的思路。通过将递归方程表示为一个形如 $f(n)=a_1f(n-1)+a_2f(n-2)+...+a_kf(n-k)$ 的多项式形式,然后对其进行归约,可以得到一个更加简单的多项式,并且这个多项式的根可以直接给出递归方程的解。

如何使用多项式归约法求解齐次递归方程

我们首先将递归方程表示为一个多项式形式:

$$f(n)=a_1f(n-1)+a_2f(n-2)+...+a_kf(n-k)$$

其中 $a_i$ 是已知的常数项。

我们将该多项式表示为矩阵形式:

$$ \begin{bmatrix} f(n) \ f(n-1) \ \vdots \ f(n-k+1) \ \end{bmatrix}

\begin{bmatrix} a_1 & a_2 & \cdots & a_{k-1} & a_k \ 1 & 0 & \cdots & 0 & 0 \ \vdots & \vdots & \cdots & \vdots & \vdots \ 0 & 0 & \cdots & 1 & 0 \ \end{bmatrix} \begin{bmatrix} f(n-1) \ f(n-2) \ \vdots \ f(n-k) \ \end{bmatrix} $$

我们令 $A$ 为上述矩阵,$F(n)=[f(n), f(n-1),...,f(n-k+1)]^\top$,则有:

$$F(n)=AF(n-1)$$

我们再次将 $F(n-1)$ 分解成 $AF(n-2)$,再次代入,我们得到:

$$F(n)=A^nF(0)$$

我们对矩阵 $A$ 进行特征分解,有:

$$A=Q\Lambda Q^{-1}$$

其中 $\Lambda$ 是对角矩阵,其对角线为 $A$ 的特征值,$Q$ 是正交矩阵,其列向量为 $A$ 的特征向量。

则有:

$$F(n)=Q\Lambda^nQ^{-1}F(0)$$

因为 $F(0)=[f(0), f(-1),...,f(1-k)]^\top$,所以需要额外的初始状态才能求解。

代码实现

下面是 Python 实现代码片段,其中 af0 是输入参数,n 是待求解的值,mod 是取模数。

def matrix_pow(matrix, n, mod):
    # 矩阵快速幂,求解矩阵的 n 次幂
    ans = [[1 if i == j else 0 for j in range(len(matrix))] for i in range(len(matrix))]
    while n > 0:
        if n & 1 == 1:
            ans = [([sum([ans[i][k] * matrix[k][j] % mod for k in range(len(matrix))]) % mod for j in range(len(matrix))] 
                   for i in range(len(matrix))]
        matrix = [([sum([matrix[i][k] * matrix[k][j] % mod for k in range(len(matrix))]) % mod for j in range(len(matrix))] 
                  for i in range(len(matrix))]
        n >>= 1
    return ans


def poly_reduce(a, f0, n, mod):
    # 用多项式归约法求解齐次递归方程
    k = len(a)
    matrix = [[a[i-1] if i == j+1 else 1 if i == 1 and j == k else 0 for j in range(k)] for i in range(1, k+1)]
    matrix_pow_ans = matrix_pow(matrix, n-k+1, mod)

    f0 = [f0[-1-i] for i in range(k)] + [0] * (k-1)
    ans = sum([f0[i] * matrix_pow_ans[k-i-1][0] % mod for i in range(k)]) % mod
    return ans
结论

多项式归约法是一种有效的求解齐次递归方程的方法,其求解效率高,且不需要繁琐的计算过程。实际上,这种方法在计算机图形学、代码运行时间分析等领域都有广泛的应用。