矩阵快速幂

来源:互联网 发布:淘宝网已买到的宝贝 编辑:程序博客网 时间:2024/05/29 10:43

无耻的粘自Margatroid

前置技能

矩阵乘法

复杂度为O(n3),有复杂度稍低的分治写法,不过意义不大(毕竟你的矩阵这么小)

A,B是两个矩阵,其中Am×n的矩阵,Bx×y的矩阵

A=[a11a21a12a22a13a23], B=b11b21b31b12b22b32

当且仅当n=xAB有意义。

注意:矩阵乘法不满足交换律,设C=AB,则

cik=j=1naijbjk

一般的,我们用矩阵去左乘一个向量,来对该向量进行线性变换

如果对于矩阵乘法仅仅是会写代码的程度,请深入理解并能够手算,否则不要阅读以下内容。

快速幂

复杂度O(logn)

这个没啥好说的,如果不会可以上网搜或者看我之前的博客

矩阵快速幂

矩阵加上快速幂,可以迅速求出线性递推式的第n项,或者是前n项和(必须是线性组合

求斐波那契数列

斐波那契数列的定义:

F1=F2=1, Fn=Fn1+Fn2

我们注意到,该数列的第n项是第n1项和第n2项的线性组合(你tm在放屁

我们构造一个列向量:

A=[Fn1Fn2]

然后我们考虑第n+1项,是第n项和第n1项的线性组合(简直是废话

同样的,我们也可以构造一个列向量:

B=[Fn1+Fn2Fn1]

然后我们考虑一下怎么把A经过一波骚变换而把它变成B,由于这是向量之间线性组合,左乘一个矩阵是可以的:

[1011][Fn1Fn2]=[Fn1+Fn2Fn1]

嗯,就这样变换。

如果我要求第n项,就再左乘n2个同样的矩阵,所以,我们有:

[1011]n2[F1F2]=[FnFn1]

然后左边的那个矩阵的幂可以用快速幂处理,可以在O(logn)时间内求出,再乘一下那个列向量,就得到了我们要求的东西。

进阶版:求两项的线性递推式

题目:COGS

其实就是给斐波那契数列加上了系数。

矩阵会变成这样:

[a0b1][Fn1Fn2]=[aFn1+bFn2Fn1]

极限版:求n项的线性递推式

题目:COGS

嗯。。。这个就比较毒瘤了。。。


还是要构造矩阵。。(怕是要敲公式敲死)

还是去网上搜一个矩阵粘下来吧(懒癌爆发)

好像并没有人手敲矩阵。。决定吃螃蟹。。。


f(n)=a1f(n1)+a2f(n2)+...+adf(nd) (n>d)

其中a1,a2,anf(1),f(2),f(n)已知。

大力构造矩阵:(md真丑)

a11000a20100a300101an0000f(n)f(n1)f(n2)f(n3)=f(n+1)f(n)f(n1)f(n2)

啊。。我尽力了。。。就是这样。。敲公式真累。。。

求斐波那契数列的前n项和

即求

i=1nFi

这个和之前的还是不太一样的,没有明确的递推式。

我们注意到前n项和sumnsumn1Fn的线性组合,然后构造矩阵:

100111110sumn1Fn1Fn2=sumnFnFn+1

求自然数列的前n项平方和

即求:

i=1ni2

由于sumn+1sumn(i+1)2的线性组合,(i+1)2i2, i, 1的线性组合,因此可以构造矩阵:

1000110022101111sumni2i1=sumn+1(i+1)2(i+1)1

求斐波那契数列的前n项平方和

即求

i=1nF2i

注意到sumnF2nsumn1的线性组合,而F2nF2n1F2n2Fn1Fn2的线性组合,所以构造矩阵:

1000111111002201sumn1F2n1F2n2Fn1Fn2=sumnF2nF2n1FnFn1

注意在推矩阵的最后以后时使用了一些骚操作,可以手推一下验证一下正确性

求自然数列的前n项立方和

即求:

i=1ni3

注意到sumn+1(i+1)3sumn的线性组合,而(i+1)3=i3+3i2+3i+1,是i3,i2,i,1的线性组合,(i+1)2=i2+2i+1,是i2i的线性组合,i+1i1的线性组合,因此构造矩阵:

1000011000331003321011111sumni3i2i1=sumn+1(i+1)3(i+1)2(i+1)1

参考资料

  • leakov-济南集训课件:网页链接
  • 维基百科-矩阵乘法:网页链接

写在最后

本文中举出的一些例子有更简单的做法,比如后三个,之所以以最复杂的形式展示出来,是为了提高构造矩阵的能力。还有,敲公式真tm累

原创粉丝点击