Sum of Fibonacci Numbers with alternate negatives
Last Updated :
25 Aug, 2022
Given a positive integer n, the task is to find the value of F1 – F2 + F3 -……….+ (-1)n+1Fn where Fi denotes i-th Fibonacci number.
Fibonacci Numbers: The Fibonacci numbers are the numbers in the following integer sequence.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ….
In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation
Fn = Fn-1 + Fn-2
with seed values F0 = 0 and F1 = 1.
Examples
Input: n = 5
Output: 4
Explanation: 1 - 1 + 2 - 3 + 5 = 4
Input: n = 8
Output: -12
Explanation: 1 - 1 + 2 - 3 + 5 - 8 + 13 - 21 = -12
Method 1: (O(n) time Complexity) This method includes solving the problem directly by finding all Fibonacci numbers till n and adding up the alternating sum. But this will require O(n) time complexity.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int calculateAlternateSum( int n)
{
if (n <= 0)
return 0;
int fibo[n + 1];
fibo[0] = 0, fibo[1] = 1;
int sum = pow (fibo[0], 2) + pow (fibo[1], 2);
for ( int i = 2; i <= n; i++) {
fibo[i] = fibo[i - 1] + fibo[i - 2];
if (i % 2 == 0)
sum -= fibo[i];
else
sum += fibo[i];
}
return sum;
}
int main()
{
int n = 8;
cout << "Alternating Fibonacci Sum upto "
<< n << " terms: "
<< calculateAlternateSum(n) << endl;
return 0;
}
|
Java
public class GFG {
static double calculateAlternateSum( int n)
{
if (n <= 0 )
return 0 ;
int fibo[] = new int [n + 1 ];
fibo[ 0 ] = 0 ;
fibo[ 1 ] = 1 ;
double sum = Math.pow(fibo[ 0 ], 2 ) + Math.pow(fibo[ 1 ], 2 );
for ( int i = 2 ; i <= n; i++) {
fibo[i] = fibo[i - 1 ] + fibo[i - 2 ];
if (i % 2 == 0 )
sum -= fibo[i];
else
sum += fibo[i];
}
return sum;
}
public static void main(String args[])
{
int n = 8 ;
System.out.println( "Alternating Fibonacci Sum upto "
+ n + " terms: "
+ calculateAlternateSum(n));
}
}
|
Python 3
def calculateAlternateSum(n):
if (n < = 0 ):
return 0
fibo = [ 0 ] * (n + 1 )
fibo[ 0 ] = 0
fibo[ 1 ] = 1
sum = pow (fibo[ 0 ], 2 ) + pow (fibo[ 1 ], 2 )
for i in range ( 2 , n + 1 ) :
fibo[i] = fibo[i - 1 ] + fibo[i - 2 ]
if (i % 2 = = 0 ):
sum - = fibo[i]
else :
sum + = fibo[i]
return sum
if __name__ = = "__main__" :
n = 8
print ( "Alternating Fibonacci Sum upto "
, n , " terms: "
, calculateAlternateSum(n))
|
C#
using System;
class GFG
{
static double calculateAlternateSum( int n)
{
if (n <= 0)
return 0;
int []fibo = new int [n + 1];
fibo[0] = 0;
fibo[1] = 1;
double sum = Math.Pow(fibo[0], 2) +
Math.Pow(fibo[1], 2);
for ( int i = 2; i <= n; i++)
{
fibo[i] = fibo[i - 1] + fibo[i - 2];
if (i % 2 == 0)
sum -= fibo[i];
else
sum += fibo[i];
}
return sum;
}
public static void Main()
{
int n = 8;
Console.WriteLine( "Alternating Fibonacci Sum upto " +
n + " terms: " + calculateAlternateSum(n));
}
}
|
PHP
<?php
function calculateAlternateSum( $n )
{
if ( $n <= 0)
return 0;
$fibo = array ();
$fibo [0] = 0;
$fibo [1] = 1;
$sum = pow( $fibo [0], 2) +
pow( $fibo [1], 2);
for ( $i = 2; $i <= $n ; $i ++)
{
$fibo [ $i ] = $fibo [ $i - 1] +
$fibo [ $i - 2];
if ( $i % 2 == 0)
$sum -= $fibo [ $i ];
else
$sum += $fibo [ $i ];
}
return $sum ;
}
$n = 8;
echo ( "Alternating Fibonacci Sum upto " );
echo $n ;
echo " terms: " ;
echo (calculateAlternateSum( $n )) ;
?>
|
Javascript
<script>
function calculateAlternateSum(n)
{
if (n <= 0)
return 0;
var fibo = Array(n + 1).fill(0);
fibo[0] = 0;
fibo[1] = 1;
var sum = Math.pow(fibo[0], 2) +
Math.pow(fibo[1], 2);
for (i = 2; i <= n; i++) {
fibo[i] = fibo[i - 1] + fibo[i - 2];
if (i % 2 == 0)
sum -= fibo[i];
else
sum += fibo[i];
}
return sum;
}
var n = 8;
document.write(
"Alternating Fibonacci Sum upto " + n + " terms: "
+ calculateAlternateSum(n)
);
</script>
|
Output:
Alternating Fibonacci Sum upto 8 terms: -12
Time Complexity: O(n)
Auxiliary Space: O(n)
Method 2: (O(log n) Complexity) This method involves the following observation to reduce the time complexity:
- For n = 2,
F1 – F2 = 1 – 1
= 0
= 1 + (-1)3 * F1
- For n = 3,
F1 – F2 + F3
= 1 – 1 + 2
= 2
= 1 + (-1)4 * F2
- For n = 4,
F1 – F2 + F3 – F4
= 1 – 1 + 2 – 3
= -1
= 1 + (-1)5 * F3
- For n = m,
F1 – F2 + F3 -…….+ (-1)m+1 * Fm-1
= 1 + (-1)m+1Fm-1
Assuming this to be true. Now if (n = m+1) is also true, it means that the assumption is correct. Otherwise, it is wrong.
- For n = m+1,
F1 – F2 + F3 -…….+ (-1)m+1 * Fm + (-1)m+2 * Fm+1
= 1 + (-1)m+1 * Fm-1 + (-1)m+2 * Fm+1
= 1 + (-1)m+1(Fm-1 – Fm+1)
= 1 + (-1)m+1(-Fm) = 1 + (-1)m+2(Fm)
which is true as per the assumption for n = m.
Hence the general term for the alternating Fibonacci Sum:
F1 – F2 + F3 -…….+ (-1)n+1 Fn = 1 + (-1)n+1Fn-1
So in order to find an alternate sum, only the n-th Fibonacci term is to be found, which can be done in O(log n) time( Refer to Method 5 or 6 of this article.)
Below is the implementation of method 6 of this:
C++
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1000;
int f[MAX] = { 0 };
int fib( int n)
{
if (n == 0)
return 0;
if (n == 1 || n == 2)
return (f[n] = 1);
if (f[n])
return f[n];
int k = (n & 1) ? (n + 1) / 2 : n / 2;
f[n] = (n & 1) ? (fib(k) * fib(k) + fib(k - 1) * fib(k - 1))
: (2 * fib(k - 1) + fib(k)) * fib(k);
return f[n];
}
int calculateAlternateSum( int n)
{
if (n % 2 == 0)
return (1 - fib(n - 1));
else
return (1 + fib(n - 1));
}
int main()
{
int n = 8;
cout << "Alternating Fibonacci Sum upto "
<< n << " terms : "
<< calculateAlternateSum(n) << endl;
return 0;
}
|
Java
class GFG {
static final int MAX = 1000 ;
static int f[] = new int [MAX];
static int fib( int n) {
if (n == 0 ) {
return 0 ;
}
if (n == 1 || n == 2 ) {
return (f[n] = 1 );
}
if (f[n] > 0 ) {
return f[n];
}
int k = (n % 2 == 1 ) ? (n + 1 ) / 2 : n / 2 ;
f[n] = (n % 2 == 1 ) ? (fib(k) * fib(k) + fib(k - 1 ) * fib(k - 1 ))
: ( 2 * fib(k - 1 ) + fib(k)) * fib(k);
return f[n];
}
static int calculateAlternateSum( int n) {
if (n % 2 == 0 ) {
return ( 1 - fib(n - 1 ));
} else {
return ( 1 + fib(n - 1 ));
}
}
public static void main(String[] args) {
int n = 8 ;
System.out.println( "Alternating Fibonacci Sum upto "
+ n + " terms : "
+ calculateAlternateSum(n));
}
}
|
Python3
MAX = 1000
f = [ 0 ] * MAX
def fib(n):
if (n = = 0 ):
return ( 0 )
if (n = = 1 or n = = 2 ):
f[n] = 1
return (f[n])
if (f[n]):
return (f[n])
if (n & 1 ):
k = (n + 1 ) / / 2
else :
k = n / / 2
if (n & 1 ):
f[n] = (fib(k) * fib(k) +
fib(k - 1 ) * fib(k - 1 ))
else :
f[n] = ( 2 * fib(k - 1 ) + fib(k)) * fib(k)
return (f[n])
def cal(n):
if (n % 2 = = 0 ):
return ( 1 - fib(n - 1 ))
else :
return ( 1 + fib(n - 1 ))
if (__name__ = = "__main__" ):
n = 8
print ( "Alternating Fibonacci Sum upto" ,
n, "terms :" , cal(n))
|
C#
using System;
class GFG
{
static readonly int MAX = 1000;
static int []f = new int [MAX];
static int fib( int n)
{
if (n == 0)
{
return 0;
}
if (n == 1 || n == 2)
{
return (f[n] = 1);
}
if (f[n] > 0)
{
return f[n];
}
int k = (n % 2 == 1) ? (n + 1) / 2 : n / 2;
f[n] = (n % 2 == 1) ? (fib(k) * fib(k) +
fib(k - 1) * fib(k - 1))
: (2 * fib(k - 1) + fib(k)) * fib(k);
return f[n];
}
static int calculateAlternateSum( int n)
{
if (n % 2 == 0)
{
return (1 - fib(n - 1));
} else
{
return (1 + fib(n - 1));
}
}
public static void Main()
{
int n = 8;
Console.WriteLine( "Alternating Fibonacci Sum upto "
+ n + " terms : "
+ calculateAlternateSum(n));
}
}
|
Javascript
<script>
MAX = 1000;
f = new Array(MAX);
f.fill(0);
function fib( n)
{
if (n == 0)
return 0;
if (n == 1 || n == 2)
return (f[n] = 1);
if (f[n])
return f[n];
var k = (n & 1) ? (n + 1) / 2 : n / 2;
f[n] = (n & 1) ? (fib(k) * fib(k) + fib(k - 1) * fib(k - 1))
: (2 * fib(k - 1) + fib(k)) * fib(k);
return f[n];
}
function calculateAlternateSum(n)
{
if (n % 2 == 0)
return (1 - fib(n - 1));
else
return (1 + fib(n - 1));
}
var n = 8;
document.write( "Alternating Fibonacci Sum upto " + n + " terms : "
+ calculateAlternateSum(n) + "<br>" );
getElement(a, n, S);
</script>
|
Output:
Alternating Fibonacci Sum upto 8 terms: -12
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...