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