Finding the closest fibonacci numbers

前端 未结 11 2145

I am trying to solve a bigger problem, and I think that an important part of the program is spent on inefficient computations.

I need to compute for a given number N, th

11条回答
  •  生来不讨喜
    2021-02-02 14:04

    The Fibonacci numbers are given by Binet's formula

    F(n) = ( phi^n - (1-phi)^n ) / \sqrt{5}
    

    where phi is the golden ratio,

    phi = (1 + \sqrt{5}) / 2. 
    

    This can be implemented straightforwardly (Python example):

    <>=
    phi = (1 + 5**0.5) / 2
    
    def fib(n):
        return int(round((phi**n - (1-phi)**n) / 5**0.5))
    

    Because of floating-point rounding errors, this will however only give the right result for n < 70.

    Binet's formula can be inverted by ignoring the (1-phi)^n term, which disappears for large n. We can therefore define the inverse Fibonacci function that, when given F(n), returns n (ignoring that F(1) = F(2)):

    <>=
    from math import log
    
    def fibinv(f):
        if f < 2:
            return f
        return int(round(log(f * 5**0.5) / log(phi)))
    

    Here rounding is used to our advantage: it removes the error introduced by our modification to Binet's formula. The function will in fact return the right answer when given any Fibonacci number that can be stored as an exact integer in the computer's memory. On the other hand, it does not verify that the given number actually is a Fibonacci number; inputting a large Fibonacci number or any number close to it will give the same result. Therefore you can use this idea to find the Fibonacci number closest to a given number.

    The idea, then is to apply the inverse Fibonacci map to find N and M, the two closest Fibonacci numbers on either side, then use the direct Fibonacci map to compute P = F(N) and Q = F(M). This involves more computation, but less searching.

提交回复
热议问题