矩阵快速幂中矩阵的构造技巧



简单的例子

Fibonacci数列

考虑Fibonacci数列, 

F(n)=F(n1)+F(n2)
将右边两项看做是一个列向量的形式,令 
Xn1={Fn1Fn2}
很容易得到Xn的形式,即 
Xn={FnFn1}
现在的任务就是找到一个系数矩阵A,使得AXn1=Xn,且A需与n无关。 
如果能够找到这个A,则易知An1X1=Xn,于是可以利用矩阵快速幂计算出Xn。这样就可以在O(logn)的时间内计算出指定的Fibonacci数。 
这个矩阵很容易找,观察易得 
A={1110}(1)

Fibonacci数列变种

推广一下,如果令Fn=aFn1+bFn2,则系数矩阵为 

A={a1b0}(2)

利用二项式展开构造矩阵

计算k次方和

Fibonacci数列只是最简单的例子,对于稍微复杂一点的例子,二项式展开是常用的一项技术。 
考虑计算: 

Sn=i=1nik
易得 
Sn=nk+Sn1
如果仿照Fibonacci数列,令 
Xn1={nkSn1}
则 
Xn={(n+1)kSn}
此时,可求出 
A=(n+1n)k101
这个系数矩阵很明显是不能用的,因为它与n有关,无法将递推公式转化为矩阵的幂运算。 
这里需要使用二项式展开。 
Sn=(n1+1)k+Sn1=C0k(n1)k+C1k(n1)k1++Ckk+Sn1
此时,如果令 
Xn1=(n1)k(n1)k1(n1)0Sn1
则有 
Xn=nknk1n0Sn
现在的任务与刚才一样,找到一个系数矩阵A,使得AXn1=Xn,且A需与n无关。 
有关Sn的递推公式实际上就指明了A的最后一行。而利用二项式展开很容易得到其他行。 
有 
A=C0k00C0kC1kC0k1C1kCkkCk1k1C00Ckk0001(3)
最后有 
An1X1=Xn
且 
X1={1 1  1}T
利用该系数矩阵可以在O(k3logn)时间内计算出k次方的和。

更一般的例子

再考虑一个一般情况:

Sn=i=1n(ai+b)k
与刚才几乎一模一样,有 
Sn=[a(n1)+(a+b)]k+Sn1=C0kak(n1)k+C1kak1(a+b)(n1)k1++Ckk(a+b)k+Sn1
剩下的步骤,也几乎完全与之前的一样,令 
Xn1=(n1)k(n1)k1(n1)0Sn1
则 
Xn=nknk1n0Sn
同样,有关Sn的递推公式实际上就指明了A的最后一行,其他行则利用二项式展开得到。 
有 
A=C0k00C0kakC1kC0k1C1kak1(a+b)CkkCk1k1C00Ckk(a+b)k0001(4)

更复杂的例子

假设要计算如下和式: 

Sn=i=1nikki
同样,将其写成递推公式,有 
Sn=nkkn+Sn1=(n1+1)kk(n1)+1+Sn1=C0k(n1)kk(n1)+1+C1k(n1)k1k(n1)+1++Ckkk(n1)+1+Sn1
将与n有关的项抽出来作为列向量,令 
Xn1=(n1)kk(n1)+1(n1)k1k(n1)+1(n1)0k(n1)+1Sn1
则 
Xn=nkkn+1nk1kn+1n0kn+1Sn

同样,有关Sn的递推公式说明了系数矩阵A的最后一行。而其他行仍然可以由二项式展开得到,只是相差了一个系数k而已,这很容易解决。 
最后,有 

A=kC0k00C0kkC1kkC0k1C1kkCkkkCk1k1kC00Ckk0001(5)

部分题目

POJ3070利用了矩阵1,hdu3369利用了矩阵3和4,hdu3483利用了矩阵5。



原文地址:   http://blog.csdn.net/u012061345/article/details/52224623

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告