Find F(n) when F(i) and F(j) of a sequence are given


Given five integers i, Fi, j, Fj and N. Where Fi and Fj are the ith and jth term of a sequence which follows the Fibonacci recurrence i.e. FN = FN – 1 + FN – 2. The task is to find the Nth term of the original sequence.

Examples:

Input: i = 3, F3 = 5, j = -1, F-1 = 4, N = 5
Output: 12
Fibonacci sequence can be reconstructed using known values:
…, F-1 = 4, F0 = -1, F1 = 3, F2 = 2, F3 = 5, F4 = 7, F5 = 12, …

Input: i = 0, F0 = 1, j = 1, F1 = 4, N = -2
Output: -2



Approach: Note that, if the two consecutive terms of the Fibonacci sequence are known then the Nth term can easily be determined. Assuming i < j, as per Fibonacci condition:

  Fi+1 = 1*Fi+1 + 0*Fi
  Fi+2 = 1*Fi+1 + 1*Fi
  Fi+3 = Fi+2 + Fi+1 = 2*Fi+1 + 1*Fi
  Fi+4 = Fi+3 + Fi+2 = 3*Fi+1 + 2*Fi
  Fi+5 = Fi+4 + Fi+3 = 5*Fi+1 + 3*Fi
  .. .. ..
and so on

Note that, the coefficients of Fi+1 and Fi in the above set of equations are nothing but the terms of Standard Fibonacci Sequence.

So, considering the Standard Fibonacci sequence i.e. f0 = 0, f1 = 1, f2 = 1, f3 = 2, f4 = 3, … ; we can generalize, the above set of equations (for k > 0) as:

  Fi+k = fk*Fi+1 + fk-1*Fi   …(1)

Now consider,

  k = j-i   …(2)

Now, substituting eq.(2) in eq.(1), we get:

  Fj = fj-i*Fi+1 + fj-i-1*Fi

Hence, we can calculate Fi+1 from known values of Fi and Fj. Now that we know two consecutive terms of sequence F, we can easily reconstruct F and determine the value of FN.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
  
# Function to calculate kth Fibonacci number 
# in the standard Fibonacci sequence
def fibonacci(k):
    a = 0
    b = 1
    if k == 0:
        return a
    if k == 1:
        return b
    for i in range(2, k + 1):
        c = a + b
        a = b
        b = c
    return c
  
# Function to determine
# the value of F(n)
def determineFn(i, Fi, j, Fj, n):
    if j<i:
        i, j = j, i
        Fi, Fj = Fj, Fi
  
    # Find the value of F(i + 1)
    # from F(i) and F(j)
    Fi1 = (Fj - fibonacci(j-i-1)*Fi)\
                      //fibonacci(j-i)
  
    # When n is equal to i
    if n == i:
        Fn = Fi
  
    # When n is greater than i 
    elif n>i:
        b = Fi
        Fn = Fi1
        n = n - 1
        while n != i:
            n = n - 1
            a = b
            b = Fn
            Fn = a + b
  
    # When n is smaller than i
    else:
        a = Fi
        b = Fi1
        while n != i:
            n = n + 1
            Fn = b - a
            b = a
            a = Fn
    return Fn
  
# Driver code
if __name__ == '__main__':
    i = 3
    Fi = 5
    j = -1
    Fj = 4
    n = 5
    print(determineFn(i, Fi, j, Fj, n))

chevron_right


Output:

12


My Personal Notes arrow_drop_up

Interested in Algorithms and Data Structures

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.