zoukankan      html  css  js  c++  java
  • 斐波那契 —— 矩阵形式推导

    https://blog.csdn.net/lanchunhui/article/details/50569311

    1. 矩阵形式的通项

    (Fn+2Fn+1)=(1,11,0)(Fn+1Fn)

    不妨令:A=(1,11,0),F1=1,F0=0,证明,An=(Fn+1,FnFn,Fn1),采用数学归纳法进行证明,A1=(F2,F1F1,F0),显然成立,

    An+1=AnA=(Fn+1,FnFn,Fn1)(1,11,0)=(Fn+2,Fn+1Fn+1,Fn)

    2. 偶数项和奇数项

    因为 An=(Fn+1,FnFn,Fn1),则有:

    A2m=(F2m+1,F2mF2m,F2m1)=AmAm=(Fm+1,FmFm,Fm1)(Fm+1,FmFm,Fm1)=(Fm+12+Fm2,Fm(Fm+2Fm1)Fm(Fm+2Fm1),Fm2+Fm12)

    所以有:

    F2m+1=Fm+12+Fm2F2m=Fm(Fm+2Fm1)

    3. 矩形形式求解 Fib(n)

    因为涉及到矩阵幂次,考虑到数的幂次的递归解法:

    • n 为奇数:n=2k+1
      • Fn=F2k+1=Fk+12+Fk2
      • Fn+1=F2k+2=Fk+1(Fk+1+2Fk)
    • n 为偶数:n=2k
      • Fn=F2k=Fk(Fk+2Fk1)=Fk(Fk+2(Fk+1Fk))
      • Fn+1=F2k+1=Fk+12+Fk2

    4. Python

    def fib(n):
    
        if n > 0:
            f0, f1 = fib(n // 2)
            if n % 2 == 1:
                return f0**2+f1**2, f1*(f1+2*f0)
            return f0*(f0+2*(f1-f0)), f0**2+f1**2
        return 0, 1
    
    
    if __name__ == '__main__':
        print([fib(i)[0] for i in range(10)])
  • 相关阅读:
    感谢那些给予我无偿帮助的人!
    软件工程总结
    《暗时间》部分感想!
    四个数混合运算,数据库存题,程序集构建三层建构
    三个数混合运算和三层架构
    需求
    数据库实现,以及工厂方法模式实现
    WPF中实现
    git简单操作
    git操作??
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9420942.html
Copyright © 2011-2022 走看看