Sum of Fibonacci Numbers in a range
Last Updated :
09 Jun, 2022
Given a range [l, r], the task is to find the sum fib(l) + fib(l + 1) + fib(l + 2) + ….. + fib(r) where fib(n) is the nth Fibonacci number.
Examples:
Input: l = 2, r = 5
Output: 11
fib(2) + fib(3) + fib(4) + fib(5) = 1 + 2 + 3 + 5 = 11
Input: l = 4, r = 8
Output: 50
Naive approach: Simply calculate fib(l) + fib(l + 1) + fib(l + 2) + ….. + fib(r) in O(r – l) time complexity.
In order to find fib(n) in O(1) we will take the help of the Golden Ratio.
Fibonacci’s calculation using Binet’s Formula
fib(n) = phin – psin) / ?5
Where,
phi = (1 + sqrt(5)) / 2 which is roughly equal to 1.61803398875
psi = 1 – phi = (1 – sqrt(5)) / 2 which is roughly equal to 0.61803398875
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
int fib( int n)
{
double phi = (1 + sqrt (5)) / 2;
return round( pow (phi, n) / sqrt (5));
}
ll calculateSum( int l, int r)
{
ll sum = 0;
for ( int i = l; i <= r; i++)
sum += fib(i);
return sum;
}
int main()
{
int l = 4, r = 8;
cout << calculateSum(l, r);
return 0;
}
|
Java
import java.lang.Math;
class GFG
{
static int fib( int n)
{
double phi = ( 1 + Math.sqrt( 5 )) / 2 ;
return ( int )Math.round(Math.pow(phi, n) / Math.sqrt( 5 ));
}
static int calculateSum( int l, int r)
{
int sum = 0 ;
for ( int i = l; i <= r; i++)
sum += fib(i);
return sum;
}
public static void main(String[] args)
{
int l = 4 , r = 8 ;
System.out.println(calculateSum(l, r));
}
}
|
Python3
def fib(n):
phi = (( 1 + ( 5 * * ( 1 / 2 ))) / 2 );
return round ((phi * * n) / ( 5 * * ( 1 / 2 )));
def calculateSum(l, r):
sum = 0 ;
for i in range (l, r + 1 ):
sum + = fib(i);
return sum ;
if __name__ = = '__main__' :
l, r = 4 , 8 ;
print (calculateSum(l, r));
|
C#
using System;
class GFG
{
static int fib( int n)
{
double phi = (1 + Math.Sqrt(5)) / 2;
return ( int )Math.Round(Math.Pow(phi, n) / Math.Sqrt(5));
}
static int calculateSum( int l, int r)
{
int sum = 0;
for ( int i = l; i <= r; i++)
sum += fib(i);
return sum;
}
public static void Main()
{
int l = 4, r = 8;
Console.WriteLine(calculateSum(l, r));
}
}
|
PHP
<?php
function fib( $n )
{
$phi = (1 + sqrt(5)) / 2;
return (int) round (pow( $phi , $n ) / sqrt(5));
}
function calculateSum( $l , $r )
{
$sum = 0;
for ( $i = $l ; $i <= $r ; $i ++)
$sum += fib( $i );
return $sum ;
}
$l = 4;
$r = 8;
echo calculateSum( $l , $r );
?>
|
Javascript
<script>
function fib(n) {
var phi = (1 + Math.sqrt(5)) / 2;
return parseInt( Math.round
(Math.pow(phi, n)/ Math.sqrt(5))
);
}
function calculateSum(l , r) {
var sum = 0;
for (i = l; i <= r; i++)
sum += fib(i);
return sum;
}
var l = 4, r = 8;
document.write(calculateSum(l, r));
</script>
|
Efficient approach: The idea is to find the relationship between the sum of Fibonacci numbers and nth Fibonacci number and use Binet’s Formula to calculate its value.
Relationship Deduction
- F(i) refers to the ith Fibonacci number.
- S(i) refers to the sum of Fibonacci numbers till F(i).
We can rewrite the relation F(n + 1) = F(n) + F(n – 1) as below:
F(n – 1) = F(n + 1) – F(n)
Similarly,
F(n – 2) = F(n) – F(n – 1)
…
…
…
F(0) = F(2) – F(1)
Adding all the equations, on left side, we have
F(0) + F(1) + … + F(n – 1) which is S(n – 1)
Therefore,
S(n – 1) = F(n + 1) – F(1)
S(n – 1) = F(n + 1) – 1
S(n) = F(n + 2) – 1
In order to find S(n), simply calculate the (n + 2)th Fibonacci number and subtract 1 from the result.
Therefore,
S(l, r) = S(r) – S(l – 1)
S(l, r) = F(r + 2) – 1 – (F(l + 1) – 1)
S(l, r) = F(r + 2) – F(l + 1)
C++
#include <bits/stdc++.h>
using namespace std;
int fib( int n)
{
double phi = (1 + sqrt (5)) / 2;
return round( pow (phi, n) / sqrt (5));
}
int calculateSum( int l, int r)
{
int sum = fib(r + 2) - fib(l + 1);
return sum;
}
int main()
{
int l = 4, r = 8;
cout << calculateSum(l, r);
return 0;
}
|
Java
class GFG
{
static int fib( int n)
{
double phi = ( 1 + Math.sqrt( 5 )) / 2 ;
return ( int ) Math.round(Math.pow(phi, n) / Math.sqrt( 5 ));
}
static int calculateSum( int l, int r)
{
int sum = fib(r + 2 ) - fib(l + 1 );
return sum;
}
public static void main(String[] args)
{
int l = 4 , r = 8 ;
System.out.println(calculateSum(l, r));
}
}
|
Python3
import math
def fib(n):
phi = ( 1 + math.sqrt( 5 )) / 2 ;
return int ( round ( pow (phi, n) /
math.sqrt( 5 )));
def calculateSum(l, r):
sum = fib(r + 2 ) - fib(l + 1 );
return sum ;
l = 4 ;
r = 8 ;
print (calculateSum(l, r));
|
C#
using System;
class GFG
{
static int fib( int n)
{
double phi = (1 + Math.Sqrt(5)) / 2;
return ( int ) Math.Round(Math.Pow(phi, n) /
Math.Sqrt(5));
}
static int calculateSum( int l, int r)
{
int sum = fib(r + 2) - fib(l + 1);
return sum;
}
public static void Main()
{
int l = 4, r = 8;
Console.WriteLine(calculateSum(l, r));
}
}
|
PHP
<?php
function fib( $n )
{
$phi = (1 + sqrt(5)) / 2;
return (int) round (pow( $phi , $n ) / sqrt(5));
}
function calculateSum( $l , $r )
{
$sum = fib( $r + 2) - fib( $l + 1);
return $sum ;
}
$l = 4; $r = 8;
echo (calculateSum( $l , $r ));
?>
|
Javascript
<script>
function fib(n) {
var phi = (1 + Math.sqrt(5)) / 2;
return parseInt( Math.round(Math.pow(phi, n) / Math.sqrt(5)));
}
function calculateSum(l , r) {
var sum = fib(r + 2) - fib(l + 1);
return sum;
}
var l = 4, r = 8;
document.write(calculateSum(l, r));
</script>
|
Time Complexity: O(log r)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...