Find F(n) when F(i) and F(j) of a sequence are given
Last Updated :
28 Mar, 2022
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:
C++
#include<bits/stdc++.h>
using namespace std;
int fibonacci( int k)
{
int a = 0, b = 1, c = 0;
if ( k == 0)
return a;
if (k == 1)
return b;
for ( int i = 2; i < k + 1; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
int determineFn( int i, int Fi, int j, int Fj, int n)
{
if (j < i)
{
swap(i, j);
swap(Fi, Fj);
}
int Fi1 = (Fj - fibonacci(j - i - 1) * Fi) /
fibonacci(j - i);
int Fn = 0;
if (n == i)
Fn = Fi;
else if (n > i)
{
int b = Fi;
Fn = Fi1;
n = n - 1;
while (n != i)
{
n = n - 1;
int a = b;
b = Fn;
Fn = a + b;
}
}
else
{
int a = Fi;
int b = Fi1;
while (n != i)
{
n = n + 1;
Fn = b - a;
b = a;
a = Fn;
}
}
return Fn;
}
int main()
{
int i = 3;
int Fi = 5;
int j = -1;
int Fj = 4;
int n = 5;
cout << (determineFn(i, Fi, j, Fj, n));
}
|
Java
import java.util.*;
class GFG
{
static int fibonacci( int k)
{
int a = 0 , b = 1 , c = 0 ;
if (k == 0 )
return a;
if (k == 1 )
return b;
for ( int i = 2 ; i < k + 1 ; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
static int determineFn( int i, int Fi,
int j, int Fj, int n)
{
if (j < i)
{
i = i + j;
j = i - j;
i = i - j;
Fi = Fi + Fj;
Fj = Fi - Fj;
Fi = Fi - Fj;
}
int Fi1 = (Fj - fibonacci(j - i - 1 ) * Fi) /
fibonacci(j - i);
int Fn = 0 ;
if (n == i)
Fn = Fi;
else if (n > i)
{
int b = Fi;
Fn = Fi1;
n = n - 1 ;
while (n != i)
{
n = n - 1 ;
int a = b;
b = Fn;
Fn = a + b;
}
}
else
{
int a = Fi;
int b = Fi1;
while (n != i)
{
n = n + 1 ;
Fn = b - a;
b = a;
a = Fn;
}
}
return Fn;
}
public static void main(String[] args)
{
int i = 3 ;
int Fi = 5 ;
int j = - 1 ;
int Fj = 4 ;
int n = 5 ;
System.out.println(determineFn(i, Fi, j, Fj, n));
}
}
|
Python3
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
def determineFn(i, Fi, j, Fj, n):
if j<i:
i, j = j, i
Fi, Fj = Fj, Fi
Fi1 = (Fj - fibonacci(j - i - 1 ) * Fi)\
/ / fibonacci(j - i)
if n = = i:
Fn = Fi
elif n>i:
b = Fi
Fn = Fi1
n = n - 1
while n ! = i:
n = n - 1
a = b
b = Fn
Fn = a + b
else :
a = Fi
b = Fi1
while n ! = i:
n = n + 1
Fn = b - a
b = a
a = Fn
return Fn
if __name__ = = '__main__' :
i = 3
Fi = 5
j = - 1
Fj = 4
n = 5
print (determineFn(i, Fi, j, Fj, n))
|
C#
using System;
class GFG
{
static int fibonacci( int k)
{
int a = 0, b = 1, c = 0;
if (k == 0)
return a;
if (k == 1)
return b;
for ( int i = 2; i < k + 1; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
static int determineFn( int i, int Fi,
int j, int Fj, int n)
{
if (j < i)
{
i = i + j;
j = i - j;
i = i - j;
Fi = Fi + Fj;
Fj = Fi - Fj;
Fi = Fi - Fj;
}
int Fi1 = (Fj - fibonacci(j - i - 1) * Fi) /
fibonacci(j - i);
int Fn = 0;
if (n == i)
Fn = Fi;
else if (n > i)
{
int b = Fi;
Fn = Fi1;
n = n - 1;
while (n != i)
{
n = n - 1;
int a = b;
b = Fn;
Fn = a + b;
}
}
else
{
int a = Fi;
int b = Fi1;
while (n != i)
{
n = n + 1;
Fn = b - a;
b = a;
a = Fn;
}
}
return Fn;
}
public static void Main(String[] args)
{
int i = 3;
int Fi = 5;
int j = -1;
int Fj = 4;
int n = 5;
Console.WriteLine(determineFn(i, Fi, j, Fj, n));
}
}
|
Javascript
<script>
function fibonacci(k)
{
let a = 0, b = 1, c = 0;
if ( k == 0)
return a;
if (k == 1)
return b;
for (let i = 2; i < k + 1; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
function determineFn(i, Fi, j, Fj, n)
{
if (j < i)
{
i = i + j;
j = i - j;
i = i - j;
Fi = Fi + Fj;
Fj = Fi - Fj;
Fi = Fi - Fj;
}
let Fi1 = parseInt((Fj - fibonacci(j - i - 1) * Fi) /
fibonacci(j - i));
let Fn = 0;
if (n == i)
Fn = Fi;
else if (n > i)
{
let b = Fi;
Fn = Fi1;
n = n - 1;
while (n != i)
{
n = n - 1;
let a = b;
b = Fn;
Fn = a + b;
}
}
else
{
let a = Fi;
let b = Fi1;
while (n != i)
{
n = n + 1;
Fn = b - a;
b = a;
a = Fn;
}
}
return Fn;
}
let i = 3;
let Fi = 5;
let j = -1;
let Fj = 4;
let n = 5;
document.write(determineFn(i, Fi, j, Fj, n));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...