在上一篇文章中我们探讨了如何快速求解幂运算的方法,并且最终给出了一个时间复杂度为O(logn)的算法,那么在这一片文章中,我想说一说快速幂运算的一个应用,也就是利用矩阵的快速幂运算求解线性递推序列。
首先我们来了解下什么是线性递推序列,在这里给大家看一个大家一定很熟悉例子,那就是斐波那契数列,它的递推公式是:
从上面这个方程中我们可以看到很明显的递推关系,实际上我们在做运算的时候,如果一步一步的按照递推式计算,将会消耗大量的时间,于是我们求助于其它的方式。
首先,对于一般的k阶线性递推函数y,应当有这样的形式:
若对于这个递推函数,如果对所有不小于k的n有:
直观来看,这个递推函数应该是长成这个样子的:
当给定了从X(0) ~ X(k – 1) 的k个初始值的时候,我们就能利用这个递推公式计算出所整个序列。那么解决问题的关键就落在了递推函数f的身上。
观察递推函数f的形式,我们发现它可以用两个向量乘积的形式来表达:
为了使用这个函数计算的递推序列能够方便的进入下次的跌打运算,我们把系数向量扩充成对角线为1的一个伴随矩阵,也就是我们通过矩阵乘法的运算之后能够达到下面的效果:
依赖于矩阵乘法的结合性,我们就可以得出下面的公式:
当我们给定递推公式以及其前k个项后,我们就能够通过矩阵乘幂的方法求解其第n项的数值,而在前一篇文章我们已经给出了快速求解矩阵幂的方法,所以求解一个递推序列第n项值的复杂度也被降低为了O(logn)。
下面我给读者准备了POJ上的一道题目,其解法就是依赖于本篇文章和前一篇文章所描述的内容:POJ 3070 Fibonacci,有兴趣的读者一定要试一试哦~