Largest number less than or equal to N/2 which is coprime to N

Given a number N, the task is to find the largest positive integer less than or equal to N/2 which is coprime to N.
Note: Two number A and B are considered to coprime if gcd(A, B) = 1. It is also given that 2 < N < 10^18.

Examples:

Input: N = 50
Output: 23
GCD(50, 23) = 1 

Input: N = 100
Output: 49

Naive Approach: Start from N/2 and find the number smaller than or equal to N/2 which is coprime to N.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the above approacdh
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
  
// Function to calculate gcd of two number
ll gcd(ll a, ll b)
{
    if (b == 0)
        return a;
    else
        return gcd(b, a % b);
}
  
// Function to check if two numbers are coprime or not
bool coPrime(ll n1, ll n2)
{
    // two numbers are coprime if their gcd is 1
    if (gcd(n1, n2) == 1)
        return true;
    else
        return false;
}
  
// Function to find largest integer less
// than or equal to N/2 and coprime with N
ll largestCoprime(ll N)
{
    ll half = floor(N / 2);
  
    // Check one by one all numbers
    // less than or equal to N/2
    while (coPrime(N, half) == false)
        half--;
  
    return half;
}
  
// Driver code
int main()
{
  
    ll n = 50;
    cout << largestCoprime(n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the above approacdh
import java.util.*;
  
class GFG
{
  
// Function to calculate gcd of two number
static int gcd(int a, int b)
{
    if (b == 0)
        return a;
    else
        return gcd(b, a % b);
}
  
// Function to check if two 
// numbers are coprime or not
static boolean coPrime(int n1, int n2)
{
    // two numbers are coprime
    // if their gcd is 1
    if (gcd(n1, n2) == 1)
        return true;
    else
        return false;
}
  
// Function to find largest integer less
// than or equal to N/2 and coprime with N
static int largestCoprime(int N)
{
    int half = (int)(N / 2);
  
    // Check one by one all numbers
    // less than or equal to N/2
    while (coPrime(N, half) == false)
        half--;
  
    return half;
}
  
// Driver code
public static void main(String args[])
{
    int n = 50;
    System.out.println(largestCoprime(n));
}
}
  
// This code is contributed by
// Surendra_Gangwar

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the above approacdh
import math as mt
  
# Function to calculate gcd of two number
def gcd( a, b):
  
    if (b == 0):
        return a
    else:
        return gcd(b, a % b)
  
  
# Function to check if two numbers are coprime or not
def coPrime( n1, n2):
  
    # two numbers are coprime if their gcd is 1
    if (gcd(n1, n2) == 1):
        return True
    else:
        return False
  
  
# Function to find largest integer less
# than or equal to N/2 and coprime with N
def largestCoprime( N):
  
    half = mt.floor(N / 2)
  
    # Check one by one a numbers
    # less than or equal to N/2
    while (coPrime(N, half) == False):
        half -= 1
  
    return half
  
  
# Driver code
  
n = 50
print( largestCoprime(n))
  
#This code is contributed by Mohit kumar 29

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the above approacdh
using System;
  
class GFG
{
  
// Function to calculate gcd of two number
static int gcd(int a, int b)
{
    if (b == 0)
        return a;
    else
        return gcd(b, a % b);
}
  
// Function to check if two 
// numbers are coprime or not
static bool coPrime(int n1, int n2)
{
    // two numbers are coprime
    // if their gcd is 1
    if (gcd(n1, n2) == 1)
        return true;
    else
        return false;
}
  
// Function to find largest integer less
// than or equal to N/2 and coprime with N
static int largestCoprime(int N)
{
    int half = (int)(N / 2);
  
    // Check one by one all numbers
    // less than or equal to N/2
    while (coPrime(N, half) == false)
        half--;
  
    return half;
}
  
// Driver code
static void Main()
{
    int n = 50;
    Console.WriteLine(largestCoprime(n));
}
}
  
// This code is contributed by chandan_jnu

chevron_right


PHP

Output:

23

Efficient Approach: To observe the pattern:

  • If the given number is odd, the largest coprime number will be (N-1)/2.
  • If the given number is divisible by 4, the largest coprime number will be (N)/2 – 1.
  • If the given number is divisible by 2, the largest coprime number will be (N)/2 – 2.

Note: There is a special case 6, for which greatest coprime number less than N / 2 will be 1.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to find largest integer less than
// or equal to N/2 and is coprime with N
long long largestCoprime(long long N)
{
    // Handle the case for N = 6
    if (N == 6)
        return 1;
  
    else if (N % 4 == 0)
        return (N / 2) - 1;
  
    else if (N % 2 == 0)
        return (N / 2) - 2;
  
    else
        return ((N - 1) / 2);
}
  
// Driver code
int main()
{
  
    long long int n = 50;
    cout << largestCoprime(n) << endl;
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the above approach 
class GfG
{
  
    // Function to find largest integer less than 
    // or equal to N/2 and is coprime with N 
    static int largestCoprime(int N) 
    
          
        // Handle the case for N = 6 
        if (N == 6
            return 1
      
        else if (N % 4 == 0
            return (N / 2) - 1
      
        else if (N % 2 == 0
            return (N / 2) - 2
      
        else
            return ((N - 1) / 2); 
    
  
    // Driver code
    public static void main(String []args)
    {
        int n = 50
        System.out.println(largestCoprime(n));
    }
}
      
// This code is contributed by Rituraj Jain

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the above approach 
  
# Function to find largest integer less than 
# or equal to N/2 and is coprime with N 
def largestCoprime(N): 
  
    # Handle the case for N = 6 
    if N == 6
        return 1 
    
    elif N % 4 == 0:
        return N // 2 - 1 
    
    elif N % 2 == 0:
        return N // 2 - 2 
    
    else:
        return (N - 1) // 2 
  
# Driver code 
if __name__ == "__main__"
    
    n = 50 
    print(largestCoprime(n))
    
# This code is contributed by Rituraj Jain

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the above approach 
using System;
  
class GfG 
  
    // Function to find largest 
    // integer less than or equal 
    // to N/2 and is coprime with N 
    static int largestCoprime(int N) 
    
          
        // Handle the case for N = 6 
        if (N == 6) 
            return 1; 
      
        else if (N % 4 == 0) 
            return (N / 2) - 1; 
      
        else if (N % 2 == 0) 
            return (N / 2) - 2; 
      
        else
            return ((N - 1) / 2); 
    
  
    // Driver code 
    public static void Main() 
    
        int n = 50; 
        Console.WriteLine(largestCoprime(n)); 
    
      
// This code is contributed by Ryuga

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the above approach
  
// Function to find largest integer less than
// or equal to N/2 and is coprime with N
function largestCoprime($N)
{
    // Handle the case for N = 6
    if ($N == 6)
        return 1;
  
    else if ($N % 4 == 0)
        return ($N / 2) - 1;
  
    else if ($N % 2 == 0)
        return ($N / 2) - 2;
  
    else
        return (($N - 1) / 2);
}
  
// Driver code
$n = 50;
echo largestCoprime($n);
  
// This code is contributed by
// chandan_jnu
?>

chevron_right


Output:

23


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.