Open In App

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

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

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




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


Java




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


Python3




# 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


C#




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


PHP




<?php
// PHP implementation of the above approach
 
// Function to calculate gcd of two number
function gcd($a, $b)
{
    if ($b == 0)
        return $a;
    else
        return gcd($b, $a % $b);
}
 
// Function to check if two numbers
// are coprime or not
function 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
function largestCoprime($N)
{
    $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
$n = 50;
echo largestCoprime($n);
 
// This code is contributed
// by Akanksha Rai


Javascript




// Javascript implementation of the above approach
 
// Function to calculate gcd of two number
function gcd(a, b)
{
    if (b == 0)
        return a;
    else
        return gcd(b, a % b);
}
 
// Function to check if two numbers
// are coprime or not
function 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
function largestCoprime(N)
{
    let half = Math.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
let n = 50;
document.write(largestCoprime(n));
 
// This code is contributed
// by gfgking


Output: 

23

 

Time Complexity : O(nlogn)

Auxiliary Space: O(logn)

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




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


Java




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


Python3




# 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


C#




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


PHP




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


Javascript




<script>
 
// Javascript implementation of the 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
var n = 50;
 
document.write(largestCoprime(n));
 
// This code is contributed by Khushboogoyal499
     
</script>


Output: 

23

 

Time Complexity : O(1), since there are only basic arithmetic operations that take constant time.

Auxiliary Space: O(1), since no extra space has been required.



Last Updated : 23 Jun, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads