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

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
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;
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


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


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 : VirusBuddah_