• 特征多项式


    特征多项式与常系数线性齐次递推

    一般来说,这个东西是用来优化能用矩阵乘法优化的递推式子的。

    通常,这种递推式子的特征是在齐次的条件下,转移系数也可以通过递推得到。

    对于这样的递推,通常解法为$O(NK)$的递推或者$O(k^3log n)$的矩阵乘法,但是有些**毒瘤**的出题人~~吉老师~~,会将这样的递推强行出成$Kle 1000$,特别,对于常系数线性齐次递推有些出题人甚至会出成$20000$!

    这样,就需要引入一个非常有趣~~头秃~~的概念:特征多项式。

    首先,我们需要介绍$Cayley-Hamilton$定理

    对于一个$n$阶的一个方阵,它的特征多项式为$p(lambda)=|lambda E-A|=lambda^n+b_1lambda^{n-1}+b_2lambda^{n-2}+...+b_n$

    那么显然:$p(A)=0$

    也就是说:$A^N+b_1A^{n-1}+...+b_n=0$,即$p(lambda)$为原多项式的化零多项式。

    因此,这个特征多项式可以通过高斯消元及拉格朗日插值求出。

    求矩阵的特征多项式

    一个$O(n^4)$的做法

    显然,我们得到的特征多项式是一个$n$阶多项式,那么只需要知道$n+1$个点的点值就可以得到了。

    也就是,我们把$n+1$个数代入$|lambda E-A|$中(作为$lambda$),然后暴力高斯消元即可得到一个矩阵的特征多项式。

    那么,接下来,只需要拉格朗日插值即可。

    这个做法作为一个$n^4$的做法其实想要卡掉矩阵乘法是很难的,除非将递推的项数放到$10^{1000}$这样的级别,如[BZOJ4162]

    那么接下来,我们考虑刚刚的做法能否被优化。

    显然,每次$n^3$求矩阵行列式太慢了。

    一个$O(n^3)$的做法

    对于这样的矩阵:$A=P imes B imes P^{-1}$

    称$A,B$是相似的,也就是说,对于$A,B$的特征多项式相同。

    构造还是很容易的,只需要保留每行与每行之间的关系即可。

    对于这样的矩阵,我们称之为上海森堡矩阵。

    $egin{pmatrix} a_{1,1}&a_{1,2}&a_{1,3}&cdots&a_{1,n}\ a_{2,1}&a_{2,2}&a_{2,3}&cdots&a_{2,n}\ 0&a_{3,2}&a_{3,3}&cdots&a_{3,n}\ vdots&vdots&vdots&ddots&vdots\ 0&0&0&cdots&a_{n,n} end{pmatrix}$

    那么,对于这样的矩阵,求行列式的时间复杂度就降为$n^2$了!

    然后,总时间复杂度为$n^3+n^2log m$,或者为$n^3+nlog n log m$(并无卵用),然后对于$n^3 log m$的矩阵乘法构成了鲜明的优势(大雾

    显然,其实上面的东西没有那么有用...

    但是还是有必要知道的,万一他卡你呢?

    常系数线性齐次递推的矩阵的特征多项式

    定义:递推式为$f_i=sumlimits_{j=1}^na_j imes f_{i-j},i>n$的递推。

    讲道理,这个东西才非常有用...

    对于所有的常系数线性齐次递推来说,它们的矩阵形态类似,同样,他们的特征多项式也类似...

    其实手画一下就可以发现,它们的特征多项式都是$p(lambda)=lambda^n-a_1lambda^{n-1}-a_2lambda^{n-2}-...-a_n$

    按照行列式的定义展开式子退一下就得到啦!

    特征多项式的使用手册

    其实,使用方法很简单啦,就是运用之前得到的特征多项式性质,$p(A)=A^N+b_1A^{n-1}+...+b_n=0$

    那么,对于这样的式子,就可以做到将所有的$A^K$用$A^0sim A^n$的矩阵线性表达出来了。

    $A^{x+y}=A^x imes A^y$

    那么$A^x=sumlimits_{i=0}^n b_i imes A^i,A^y=sumlimits_{i=0}^nc_i imes A^i$

    也就是:$A^{x+y}=sumlimits_{i=0}^nsumlimits_{j=0}^nb_i imes c_{j} imes A^{i+j}$

    因为有:$p(A)=0$也就是说:$A^{x+y}=sumlimits_{k=0}^{2 imes n}(sumlimits_{i=0}^{min(n,k)}b_ic_{k-i})A^k mod p(lambda)$

    然后显然,可以用倍增(其实就是快速幂)上述操作,也就是我们得到了一个$n^2log m$复杂度的递推。

    对于上述暴力操作可以用$NTT$或$FFT$优化上述多项式相乘和多项式取模。

    也就是说,我们得到了一个$nlog n log m$的优秀做法!(拿头写啊

    关于答案

    $A^x=sumlimits_{i=0}^n b_i imes A^i$

    这个式子已经给我们答案了,也就是说,这个矩阵的前$n$项加上系数相加即可,但是显然这个东西是$n^4$的

    如果要求$f_m$的话,这个东西只需要用到$f_0sim f_n$即可

    如果求矩阵的话,还是老老实实的一个一个乘吧...

    例题.jpg

    求矩阵特征多项式裸题:[BZOJ4162]

    常系数线性齐次递推$n^2log m$裸题:[BZOJ4161]

    高难度的东西:[NOI 2017 泳池]

    附件

    NOI 2017 泳池 题解

    对我来说,可能我只能接受$kle 2000$,如果再大就想要打人了...

    首先70分的暴力基本雷同[UNR 2 积劳成疾](http://uoj.ac/problem/311)

    大概就是推一个$f[i][j],s[i][j]$即可,[我不想再写一遍了](https://winniechen.cn/?p=152)

    剩下的就是可以把这个转移写成矩阵的形式,然后就可以拿到优秀的$90$分了。

    最后,根据上面的东西,优化一下就可以AC掉这道题了!

  • 相关阅读:
    正则表达式
    javascript if(条件)------------条件中可以使用的值
    maven配置
    获取中文日期
    Oracle无安装客户端安装方法
    Eclipse org.eclipse.compare plug-in
    Differences or similarities between Java and C++
    Java Programming Guidelines
    Native Method
    Object in Java same as pointer
  • 原文地址:https://www.cnblogs.com/Winniechen/p/10246295.html
Copyright © 2020-2023  润新知