斐波那契 —— 矩阵形式推导

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

1. 矩阵形式的通项

( F n + 2 F n + 1 ) = ( 1 , 1 1 , 0 ) ( F n + 1 F n )

不妨令: A = ( 1 , 1 1 , 0 ) , F 1 = 1 , F 0 = 0 ,证明, A n = ( F n + 1 , F n F n , F n 1 ) ,采用数学归纳法进行证明, A 1 = ( F 2 , F 1 F 1 , F 0 ) ,显然成立,

A n + 1 = A n A = ( F n + 1 , F n F n , F n 1 ) ( 1 , 1 1 , 0 ) = ( F n + 2 , F n + 1 F n + 1 , F n )

2. 偶数项和奇数项

因为 A n = ( F n + 1 , F n F n , F n 1 ) ,则有:

A 2 m = ( F 2 m + 1 , F 2 m F 2 m , F 2 m 1 ) = A m A m = ( F m + 1 , F m F m , F m 1 ) ( F m + 1 , F m F m , F m 1 ) = ( F m + 1 2 + F m 2 , F m ( F m + 2 F m 1 ) F m ( F m + 2 F m 1 ) , F m 2 + F m 1 2 )

所以有:

F 2 m + 1 = F m + 1 2 + F m 2 F 2 m = F m ( F m + 2 F m 1 )

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

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

  • n 为奇数: n = 2 k + 1
    • F n = F 2 k + 1 = F k + 1 2 + F k 2
    • F n + 1 = F 2 k + 2 = F k + 1 ( F k + 1 + 2 F k )
  • n 为偶数: n = 2 k
    • F n = F 2 k = F k ( F k + 2 F k 1 ) = F k ( F k + 2 ( F k + 1 F k ) )
    • F n + 1 = F 2 k + 1 = F k + 1 2 + F k 2

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)])

猜你喜欢

转载自blog.csdn.net/lanchunhui/article/details/80953084