# Find M such that GCD of M and given number N is maximum

Given an integer N greater than 2, the task is to find an element M such that GCD(N, M) is maximum.

Examples:

Input: N = 10
Output: 5
Explanation:
gcd(1, 10), gcd(3, 10), gcd(7, 10), gcd(9, 10) is 1,
gcd(2, 10), gcd(4, 10), gcd(6, 10), gcd(8, 10) is 2,
gcd(5, 10) is 5 which is maximum.

Input: N = 21
Output: 7
Explanation:
gcd(7, 21) is maximum among all the integers from 1 to 21.

Naive Approach: The simplest approach is to loop through all the numbers in the range [1, N-1] and find GCD of each number with N. The number which given maximum GCD with N is the required result.

Time Complexity: O(N)
Auxiliary Space: O(1)

Efficient Approach: To optimize the above approach, we observe that the GCD of two numbers will be definitely one of its divisors in the range [1, N-1]. And, GCD will be maximum if the divisor is maximum.
Therefore, the idea is to find all the divisors of N and store a maximum of those divisors which is the required result.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach` `#include ` `using` `namespace` `std;`   `// Function to find the integer M` `// such that gcd(N, M) is maximum` `int` `findMaximumGcd(``int` `n)` `{` `    ``// Initialize a variable` `    ``int` `max_gcd = 1;`   `    ``// Find all the divisors of N and` `    ``// return the maximum divisor` `    ``for` `(``int` `i = 1; i * i <= n; i++) {`   `        ``// Check if i is divisible by N` `        ``if` `(n % i == 0) {`   `            ``// Update max_gcd` `            ``if` `(i > max_gcd)` `                ``max_gcd = i;`   `            ``if` `((n / i != i)` `                ``&& (n / i != n)` `                ``&& ((n / i) > max_gcd))` `                ``max_gcd = n / i;` `        ``}` `    ``}`   `    ``// Return the maximum value` `    ``return` `max_gcd;` `}`   `// Driver Code` `int` `main()` `{` `    ``// Given Number` `    ``int` `N = 10;`   `    ``// Function Call` `    ``cout << findMaximumGcd(N);` `    ``return` `0;` `}`

## Java

 `// Java program for the above approach` `import` `java.util.*;`   `class` `GFG{`   `// Function to find the integer M` `// such that gcd(N, M) is maximum` `static` `int` `findMaximumGcd(``int` `n)` `{` `    `  `    ``// Initialize a variable` `    ``int` `max_gcd = ``1``;`   `    ``// Find all the divisors of N and` `    ``// return the maximum divisor` `    ``for``(``int` `i = ``1``; i * i <= n; i++) ` `    ``{` `        `  `        ``// Check if i is divisible by N` `        ``if` `(n % i == ``0``) ` `        ``{` `            `  `            ``// Update max_gcd` `            ``if` `(i > max_gcd)` `                ``max_gcd = i;`   `            ``if` `((n / i != i) && ` `                ``(n / i != n) &&` `               ``((n / i) > max_gcd))` `                ``max_gcd = n / i;` `        ``}` `    ``}`   `    ``// Return the maximum value` `    ``return` `max_gcd;` `}`   `// Driver Code` `public` `static` `void` `main(String[] args)` `{` `    `  `    ``// Given Number` `    ``int` `N = ``10``;`   `    ``// Function Call` `    ``System.out.print(findMaximumGcd(N));` `}` `}`   `// This code is contributed by Amit Katiyar`

## Python3

 `# Python3 program for the above approach`   `# Function to find the integer M ` `# such that gcd(N, M) is maximum` `def` `findMaximumGcd(n):` `    `  `    ``# Initialize variables ` `    ``max_gcd ``=` `1` `    ``i ``=` `1` `    `  `    ``# Find all the divisors of N and ` `    ``# return the maximum divisor ` `    ``while` `(i ``*` `i <``=` `n):` `        `  `        ``# Check if i is divisible by N` `        ``if` `n ``%` `i ``=``=` `0``:` `            `  `            ``# Update max_gcd ` `            ``if` `(i > max_gcd):` `                ``max_gcd ``=` `i` `                `  `            ``if` `((n ``/` `i !``=` `i) ``and` `                ``(n ``/` `i !``=` `n) ``and` `               ``((n ``/` `i) > max_gcd)):` `                ``max_gcd ``=` `n ``/` `i` `        ``i ``+``=` `1` `        `  `    ``# Return the maximum value ` `    ``return` `(``int``(max_gcd))`   `# Driver Code ` `if` `__name__ ``=``=` `'__main__'``:` `    `  `    ``# Given number ` `    ``n ``=` `10` `    `  `    ``# Function call` `    ``print``(findMaximumGcd(n))` `    `  `# This code is contributed by virusbuddah_`

## C#

 `// C# program for the ` `// above approach` `using` `System;` `class` `GFG{`   `// Function to find the ` `// integer M such that ` `// gcd(N, M) is maximum` `static` `int` `findMaximumGcd(``int` `n)` `{    ` `  ``// Initialize a variable` `  ``int` `max_gcd = 1;`   `  ``// Find all the divisors of ` `  ``// N and return the maximum ` `  ``// divisor` `  ``for``(``int` `i = 1; ` `          ``i * i <= n; i++) ` `  ``{` `    ``// Check if i is ` `    ``// divisible by N` `    ``if` `(n % i == 0) ` `    ``{` `      ``// Update max_gcd` `      ``if` `(i > max_gcd)` `        ``max_gcd = i;`   `      ``if` `((n / i != i) && ` `          ``(n / i != n) &&` `          ``((n / i) > max_gcd))` `        ``max_gcd = n / i;` `    ``}` `  ``}`   `  ``// Return the maximum ` `  ``// value` `  ``return` `max_gcd;` `}`   `// Driver Code` `public` `static` `void` `Main(String[] args)` `{    ` `  ``// Given Number` `  ``int` `N = 10;`   `  ``// Function Call` `  ``Console.Write(findMaximumGcd(N));` `}` `}`   `// This code is contributed by Rajput-Ji`

Output:

```5

```

Time Complexity: O(log2N)
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up fond of logical thinking and mathematics

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.

Article Tags :
Practice Tags :

2

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.