# 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
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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++

 `// C++ program to Find the GCD of N Fibonacci ` `// Numbers with given Indices ` `#include ` `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; ` `    ``f = 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; ` `} `

## Java

 `// 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)); ` `    ``} ` `} `

## Python 3

 `# 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 `

## C#

 `// 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; ` `    ``f = 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 `

## PHP

 ` `

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.