转载自: https://blog.csdn.net/u012061345/article/details/52224623
简单的例子
Fibonacci数列
考虑数列,
将右边两项看做是一个列向量的形式,令
很容易得到的形式,即
现在的任务就是找到一个系数矩阵,使得
AXn−1=XnAXn−1=Xn,且
需与
无关。
如果能够找到这个,则易知
,于是可以利用矩阵快速幂计算出
。这样就可以在
的时间内计算出指定的
数。
这个矩阵很容易找,观察易得
Fibonacci数列变种
推广一下,如果令,则系数矩阵为
利用二项式展开构造矩阵
计算k次方和
FibonacciFibonacci数列只是最简单的例子,对于稍微复杂一点的例子,二项式展开是常用的一项技术。
考虑计算:
易得
如果仿照数列,令
则
此时,可求出
这个系数矩阵很明显是不能用的,因为它与nn有关,无法将递推公式转化为矩阵的幂运算。
这里需要使用二项式展开。
此时,如果令
则有
现在的任务与刚才一样,找到一个系数矩阵,使得
,且
需与
无关。
有关SnSn的递推公式实际上就指明了AA的最后一行。而利用二项式展开很容易得到其他行。
有
最后有
且
利用该系数矩阵可以在O(k3logn)O(k3logn)时间内计算出kk次方的和。
更一般的例子
再考虑一个一般情况:
与刚才几乎一模一样,有
剩下的步骤,也几乎完全与之前的一样,令
则
同样,有关SnSn的递推公式实际上就指明了AA的最后一行,其他行则利用二项式展开得到。
有
更复杂的例子
假设要计算如下和式:
同样,将其写成递推公式,有
将与有关的项抽出来作为列向量,令
则
同样,有关SnSn的递推公式说明了系数矩阵AA的最后一行。而其他行仍然可以由二项式展开得到,只是相差了一个系数kk而已,这很容易解决。
最后,有