zoukankan      html  css  js  c++  java
  • 「常系数齐次线性递推」——矩阵快速幂的优化

      

    引入:

      对于递推方程:

      $$F(x) = sum_{i=1}^k a_iF(x-i)$$

      我们显然会得到一个关于$F$的多项式求逆或者矩阵递推式,大多数情况下我们都是用后者,但是当$k$很大的时候,$k^3log n$的时间复杂度我们是吃不消的,那么自然我们的前人就搞出了一些优化。

    特征多项式及Cayley-Hamilton定理:

    一、特征多项式的定义:

      设$A$是$n$阶矩阵,若数$lambda$和非零列向量$x$使关系式$$Ax=lambda x;;;;;(1)$$

    成立,那么,这样的数$lambda$称为矩阵$A$的特征值,非零向量$x$称为$A$的对应于$lambda$的特征向量。

      (1)式也可写成$$(A-lambda E)x=0$$

    此式有非零解(即存在$x$)的充分必要条件是其行列式$$|A-lambda E|=0;;;;;;(2)$$

      (1)式可以看作以$lambda$为未知数的一元$n$次方程,称为$A$的特征方程,(2)式是关于$lambda$的$n$次多项式$phi(lambda)$,称为$A$的特征多项式。

    二、矩阵的多项式:

      (矩阵的多项式不等于矩阵多项式,读者若想了解请自行百度)

      即对于$m$次多项式$f(x)$,将矩阵$A$看作未知数,此时$$f(A)=a_0E+a_1A+dots +a_mA^m$$,记$f(A)$为$A$的$m$次多项式。其运算满足交换律,即$$f(A)g(A)=g(A)f(A)$$

    三、Cayley-Hamilton定理:

      对于$A$的特征多项式$phi(lambda)$,有$$phi(A)=0$$

    由于笔者能力所限,其证明请读者自行百度。

      P.S:觉得吧……其实考虑到$phi(A)=|A-AE|=|0|=0$,感觉这个也是很显然的吧……(评论说不可以这样证……我是不是误导了什么)

    $n$阶常系数齐次线性递推矩阵的特征多项式求法:

    一、结论(懒人专用)

      $$phi(lambda)=(-1)^n(lambda^n-sum_{i=1}^n a_ilambda^{n-i})$$

      其中$a$为递推方程中给出的递推系数。

    二、证明

      

      那么我们考虑此时行列式如何去求($a_{i,j}$表示以上行列式的第$i$行第$j$列的元素):

      先考虑这样一件事实:

      若我们在前i列的选择元素的最大行数也为i,那么接下来的列只能选择对角线上元素,否则其最大行数一定为i+1,此时下一列即i+1列我们可以选择第一行或者第i+2行的元素

    该事实读者可以自行证明。    

      假设我们选了$a_{1,1}$,由以上事实,我们只能选择对角线元素,那么此时结果为$$(-1)^nlambda^n$$。

      否则选取$a_{2,1}$由以上事实,我们会得到一个$dfs$,直到在第$i$列时选取了$a_{1,i}$,此时得到结果为$$a_{1,i}*(-lambda)^{n-i}*(-1)^{i-1}=a_{1,i}*(-1)^{n-1}lambda^{n-i}$$

    综上所述:

      $$phi(lambda)=(-1)^n(lambda^n-sum_{i=1}^{n}a_ilambda^{n-i})$$

    常系数齐次线性递推:

    一、多项式引入:

      我们设$$x^{n}=f(x)g(x)+h(x)$$

    其中$g(x)$为已知多项式,那么我们就可以通过多项式除法以及多项式取模来得到$f(x)$以及$h(x)$。

    二、带入矩阵:

      我们将$k$阶$A$视为未知量,则有$$A^n=f(A)g(A)+h(A)$$

    我们考虑若$g(A)=phi(A)=0$那么,此时有$$A^n=h(A)=sum_{i=0}^{k-1} h_i A^i;;;;;;(3)$$

    三、如何计算:

      考虑$A^n$我们已经表示出来了,但是,我们发现此时算法复杂非但没有减少,反而增加为$k^4$。

      我们设$k*1$矩阵$$B_i^T={F(i+k-1),F(i+k-2),dots ,F(i)}$$

      我们给式(3)等式两边同时乘上$B_1$,即$$A^nB_1=h(A)B_1$$

      化简得到$$B_{1+n}=sum_{i=0}^{k-1}h_i B_{1+i}$$

      $$B_{1+n}^T={B_{n+k},dots\,B_{n+1}}={sum_{i=0}^{k-1}h_iF(i+k),dots ,sum_{i=0}^{k-1}h_iF(i+1)}$$

    四、时间复杂度

      若只是计算$F$的某一项,那么时间复杂度上界在于如何去求$F$的前$2k$项和以及$h$。

      显然$h$由多项式取模方法时间复杂度为$k^2logn$或$klogklogn$。

      而$F$可以$klogk$或者$k^2$处理。  

  • 相关阅读:
    Redis常用数据类型介绍、使用场景及其操作命令
    spring的官方文档地址
    ps基础学习笔记一
    类的加载时机与步骤(转)
    jvm的基本结构以及各部分详解(转)
    jdk1.8使用的url和driverName的改变
    测试框架简单了解
    shiro简单学习的简单总结
    easyui弹框后销毁当前tab弹框不显示的解决方式
    springboot学习章节代码-Spring MVC基础
  • 原文地址:https://www.cnblogs.com/Troywar/p/9078013.html
Copyright © 2011-2022 走看看