Find the GCD of N Fibonacci Numbers with given Indices

Given indices of N Fibonacci numbers. The task is to find the GCD of the Fibonacci numbers present at the given indices.

The first few Fibonacci numbers are:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…



Note: The indices start from zero. That is, 0th Fibonacci number = 0.

Examples:

Input: Indices = {2, 3, 4, 5}
Output: GCD of the fibonacci numbers = 1

Input: Indices = {3, 6, 9} 
Output: GCD of the fibonacci numbers = 2

Brute force Approach: The brute force solution is to find all the Fibonacci numbers present at the given indices and compute the GCD of all of them, and print the result.

Efficient Approach: An efficient approach is to use the property:

GCD(Fib(M), Fib(N)) = Fib(GCD(M, N))

The idea is to calculate the GCD of all the indices and then find the Fibonacci number at the index gcd_1( where gcd_1 is the GCD of the given indices).

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to Find the GCD of N Fibonacci
// Numbers with given Indices
#include <bits/stdc++.h>
using namespace std;
  
// Function to return n'th
// Fibonacci number
int getFib(int n)
{
    /* Declare an array to store Fibonacci numbers. */
    int f[n + 2]; // 1 extra to handle case, n = 0
    int i;
  
    // 0th and 1st number of the series
    // are 0 and 1
    f[0] = 0;
    f[1] = 1;
  
    for (i = 2; i <= n; i++) {
        // Add the previous 2 numbers in the series
        // and store it
        f[i] = f[i - 1] + f[i - 2];
    }
  
    return f[n];
}
  
// Function to Find the GCD of N Fibonacci
// Numbers with given Indices
int find(int arr[], int n)
{
    int gcd_1 = 0;
    // find the gcd of the indices
    for (int i = 0; i < n; i++) {
        gcd_1 = __gcd(gcd_1, arr[i]);
    }
  
    // find the fibonacci number at
    // index gcd_1
    return getFib(gcd_1);
}
  
// Driver code
int main()
{
    int indices[] = { 3, 6, 9 };
    int N = sizeof(indices) / sizeof(int);
  
    cout << find(indices, N);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to Find the GCD of N Fibonacci
// Numbers with given Indices
import java.io.*;
  
// Function to return n'th
// Fibonacci number
  
public class GFG {
    // Recursive function to return gcd of a and b 
    static int __gcd(int a, int b) 
    
        // Everything divides 0 
        if (a == 0
        return b; 
        if (b == 0
        return a; 
          
        // base case 
        if (a == b) 
            return a; 
          
        // a is greater 
        if (a > b) 
            return __gcd(a-b, b); 
        return __gcd(a, b-a); 
    
  
static int getFib(int n)
{
    /* Declare an array to store Fibonacci numbers. */
    int f[] = new int[n + 2];
    // 1 extra to handle case, n = 0
    int i;
  
    // 0th and 1st number of the series
    // are 0 and 1
    f[0] = 0;
    f[1] = 1;
  
    for (i = 2; i <= n; i++) {
        // Add the previous 2 numbers in the series
        // and store it
        f[i] = f[i - 1] + f[i - 2];
    }
  
    return f[n];
}
  
// Function to Find the GCD of N Fibonacci
// Numbers with given Indices
static int find(int arr[], int n)
{
    int gcd_1 = 0;
    // find the gcd of the indices
    for (int i = 0; i < n; i++) {
        gcd_1 = __gcd(gcd_1, arr[i]);
    }
  
    // find the fibonacci number at
    // index gcd_1
    return getFib(gcd_1);
}
  
// Driver code
    public static void main (String[] args) {
        int indices[] = { 3, 6, 9 };
    int N = indices.length;
  
    System.out.println( find(indices, N));
    }
}

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to Find the
# GCD of N Fibonacci Numbers 
# with given Indices 
from math import *
  
# Function to return n'th 
# Fibonacci number 
def getFib(n) :
  
    # Declare an array to store 
    # Fibonacci numbers.
    f = [0] * (n + 2) # 1 extra to handle case, n = 0 
  
    # 0th and 1st number of the 
    # series are 0 and 1 
    f[0], f[1] = 0, 1
  
    # Add the previous 2 numbers 
    # in the series and store it 
    for i in range(2, n + 1) :
  
        f[i] = f[i - 1] + f[i - 2]
  
    return f[n]
  
# Function to Find the GCD of N Fibonacci 
# Numbers with given Indices
def find(arr, n) :
  
    gcd_1 = 0
  
    # find the gcd of the indices 
    for i in range(n) :
        gcd_1 = gcd(gcd_1, arr[i])
  
    # find the fibonacci number 
    # at index gcd_1 
    return getFib(gcd_1)
  
# Driver code     
if __name__ == "__main__" :
  
    indices = [3, 6, 9]
    N = len(indices)
  
    print(find(indices, N))
  
# This code is contributed by ANKITRAI1

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to Find the GCD 
// of N Fibonacci Numbers with
// given Indices
using System;
  
// Function to return n'th
// Fibonacci number
class GFG 
{
// Recursive function to
// return gcd of a and b 
static int __gcd(int a, int b) 
    // Everything divides 0 
    if (a == 0) 
    return b; 
    if (b == 0) 
    return a; 
      
    // base case 
    if (a == b) 
        return a; 
      
    // a is greater 
    if (a > b) 
        return __gcd(a - b, b); 
    return __gcd(a, b - a); 
  
static int getFib(int n)
{
    /* Declare an array to 
    store Fibonacci numbers. */
    int []f = new int[n + 2];
      
    // 1 extra to handle case, n = 0
    int i;
  
    // 0th and 1st number of 
    // the series are 0 and 1
    f[0] = 0;
    f[1] = 1;
  
    for (i = 2; i <= n; i++) 
    {
        // Add the previous 2 numbers 
        // in the series and store it
        f[i] = f[i - 1] + f[i - 2];
    }
  
    return f[n];
}
  
// Function to Find the GCD 
// of N Fibonacci Numbers 
// with given Indices
static int find(int []arr, int n)
{
    int gcd_1 = 0;
      
    // find the gcd of the indices
    for (int i = 0; i < n; i++) 
    {
        gcd_1 = __gcd(gcd_1, arr[i]);
    }
  
    // find the fibonacci number 
    // at index gcd_1
    return getFib(gcd_1);
}
  
// Driver code
public static void Main () 
{
    int []indices = { 3, 6, 9 };
    int N = indices.Length;
  
    Console.WriteLine(find(indices, N));
}
}
  
// This code is contributed 
// by Shashank

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php 
// PHP program to Find the GCD of 
// N Fibonacci Numbers with given 
// Indices
  
// Function to return n'th
// Fibonacci number
function gcd($a, $b)
{
    return $b ? gcd($b, $a % $b) : $a
}
  
function getFib($n)
{
    /* Declare an array to store 
    Fibonacci numbers. */
      
    // 1 extra to handle case, n = 0
    $f = array_fill(0, ($n + 2), NULL); 
  
    // 0th and 1st number of the
    // series are 0 and 1
    $f[0] = 0;
    $f[1] = 1;
  
    for ($i = 2; $i <= $n; $i++) 
    {
        // Add the previous 2 numbers 
        // in the series and store it
        $f[$i] = $f[$i - 1] + $f[$i - 2];
    }
  
    return $f[$n];
}
  
// Function to Find the GCD of N Fibonacci
// Numbers with given Indices
function find(&$arr, $n)
{
    $gcd_1 = 0;
      
    // find the gcd of the indices
    for ($i = 0; $i < $n; $i++) 
    {
        $gcd_1 = gcd($gcd_1, $arr[$i]);
    }
  
    // find the fibonacci number 
    // at index gcd_1
    return getFib($gcd_1);
}
  
// Driver code
$indices = array(3, 6, 9 );
$N = sizeof($indices);
  
echo find($indices, $N);
  
// This code is contributed 
// by ChitraNayal
?>

chevron_right


Output:

2


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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.