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


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

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

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


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

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

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

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.