一种写程序快速计算常系数线性齐次递推关系的指定项的方法

上次学习到了利用Fibonacci恒等式在log(n)时间内计算出F(n)的方法。这种方法也适用于任何常系数线性齐次递推数列的计算。在这里把能想到的东西小结一下。
例一:扩展Euclid算法。
两个整数a,b的最高公因数为gcd(a,b)。扩展Euclid算法在计算出gcd(a,b)的同时计算出gcd(a,b)=sa+tb中的系数s,t。因为:

这样,只要计算出中间那些矩阵的乘积,就很容易计算出系数s,t。其妙处就在于将(a,b)和(b,r1)通过矩阵联系起来。
例二:Fibonacci数。
F(n)=F(n-1)+F(n-2),这是一个二阶递推式。所以存在一个二阶矩阵。类似上面的方法,将F(n),F(n-1)和F(n-1),F(n-2)通过矩阵联系起来:

计算n次方可以使用快速模幂算法在log(n)内完成。而二阶矩阵的一次乘法所用时间是常量。所以可以在log(n)时间复杂度内计算F(n)。
还可以把上述等号两边的Fibonacci数合成一个2*2矩阵。即:

通过最后那个式子可以看出F(n+1)与F(n)互素。
以上两个算法的共同点是通过矩阵建立起一个递推关系。常系数线性递推关系的解总是指数形式的。都可以使用这样的方法在对数时间复杂度里计算出指定项的值。
下面的代码是用来计算指定项的Fibonacci数和另一个递推关系A(k)=A(k-1)+A(k-2)+A(k-3),A(0)=1,A(1)=A(2)=2的。代码用C++写,比较冗长。先记在这里。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值