最快计算斐波那契数列的方法

快速斐波那契

这种方法基于如下的公式:
F ( 2 k ) = F ( k ) [ 2 F ( k + 1 ) − F ( k ) ] F ( 2 k + 1 ) = F ( k + 1 ) 2 + F ( k ) 2 F(2k) = F(k) \left[ 2F(k+1) - F(k) \right] \\ F(2k+1) = F(k+1)^2 + F(k)^2 F(2k)=F(k)[2F(k+1)F(k)]F(2k+1)=F(k+1)2+F(k)2
这种的计算方法的时间复杂度是 Θ ( log ⁡ n ) \Theta(\log n) Θ(logn)

python代码

# returns F(n)
def fibonacci(n: int):  # noqa: E999 This syntax is Python 3 only
    if n < 0:
        raise ValueError("Negative arguments are not supported")
    return _fib(n)[0]


# returns (F(n), F(n-1))
def _fib(n: int):  # noqa: E999 This syntax is Python 3 only
    if n == 0:
        # (F(0), F(1))
        return (0, 1)
    else:
        # F(2n) = F(n)[2F(n+1) − F(n)]
        # F(2n+1) = F(n+1)^2+F(n)^2
        a, b = _fib(n // 2)
        c = a * (b * 2 - a)
        d = a * a + b * b
        if n % 2 == 0:
            return (c, d)
        else:
            return (d, c + d)

关于这种计算方法的详细介绍见fast-fibonacci-algorithms

猜你喜欢

转载自blog.csdn.net/Joker_So/article/details/92423443