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

Second year Department of Information Technology Jadavpur University

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.



Improved By : AnkitRai01, Ita_c, Shashank12