Check if Euler Totient Function is same for a given number and twice of that number
Last Updated :
07 May, 2021
Given an integer N, the task is to check whether the Euler’s Totient Function of N and 2 * N are the same or not. If they are found to be the same, then print “Yes”. Otherwise, print “No”.
Examples:
Input: N = 9
Output: Yes
Explanation:
Let phi() be the Euler Totient function
Since 1, 2, 4, 5, 7, 8 have GCD 1 with 9. Therefore, phi(9) = 6.
Since 1, 5, 7, 11, 13, 17 have GCD 1 with 18. Therefore, phi(18) = 6.
Therefore, phi(9) and phi(18) are equal.
Input: N = 14
Output: No
Explanation:
Let phi() be the Euler Totient function, then
Since 1, 3 have GCD 1 with 4. Therefore, phi(4) = 2.
Since 1, 3, 5, 7 have GCD 1 with 8. Therefore, phi(8) = 4.
Therefore, phi(4) and phi(8) are not the same.
Naive Approach: The simplest approach is to find Euler’s Totient Function of N and 2 * N. If they are the same, then print “Yes”. Otherwise, print “No”.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int phi( int n)
{
int result = 1;
for ( int p = 2; p < n; p++) {
if (__gcd(p, n) == 1) {
result++;
}
}
return result;
}
bool sameEulerTotient( int n)
{
return phi(n) == phi(2 * n);
}
int main()
{
int N = 13;
if (sameEulerTotient(N))
cout << "Yes" ;
else
cout << "No" ;
}
|
Java
import java.util.*;
class GFG{
static int phi( int n)
{
int result = 1 ;
for ( int p = 2 ; p < n; p++)
{
if (__gcd(p, n) == 1 )
{
result++;
}
}
return result;
}
static boolean sameEulerTotient( int n)
{
return phi(n) == phi( 2 * n);
}
static int __gcd( int a, int b)
{
return b == 0 ? a :__gcd(b, a % b);
}
public static void main(String[] args)
{
int N = 13 ;
if (sameEulerTotient(N))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
}
|
Python3
def phi(n):
result = 1
for p in range ( 2 , n):
if (__gcd(p, n) = = 1 ):
result + = 1
return result
def sameEulerTotient(n):
return phi(n) = = phi( 2 * n)
def __gcd(a, b):
return a if b = = 0 else __gcd(b, a % b)
if __name__ = = '__main__' :
N = 13
if (sameEulerTotient(N)):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG{
static int phi( int n)
{
int result = 1;
for ( int p = 2; p < n; p++)
{
if (__gcd(p, n) == 1)
{
result++;
}
}
return result;
}
static bool sameEulerTotient( int n)
{
return phi(n) == phi(2 * n);
}
static int __gcd( int a, int b)
{
return b == 0 ? a : __gcd(b, a % b);
}
public static void Main(String[] args)
{
int N = 13;
if (sameEulerTotient(N))
Console.Write( "Yes" );
else
Console.Write( "No" );
}
}
|
Javascript
<script>
function phi(n)
{
let result = 1;
for (let p = 2; p < n; p++)
{
if (__gcd(p, n) == 1)
{
result++;
}
}
return result;
}
function sameEulerTotient(n)
{
return phi(n) == phi(2 * n);
}
function __gcd( a, b)
{
return b == 0 ? a :__gcd(b, a % b);
}
let N = 13;
if (sameEulerTotient(N))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Efficient Approach: To optimize the above approach, the key observation is that there is no need to calculate the Euler’s Totient Function as only odd numbers follow the property phi(N) = phi(2*N), where phi() is the Euler’s Totient Function.
Therefore, the idea is to check if N is odd or not. If found to be true, print “Yes”. Otherwise, print “No”.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool sameEulerTotient( int N)
{
return (N & 1);
}
int main()
{
int N = 13;
if (sameEulerTotient(N))
cout << "Yes" ;
else
cout << "No" ;
}
|
Java
class GFG{
static int sameEulerTotient( int N)
{
return (N & 1 );
}
public static void main(String[] args)
{
int N = 13 ;
if (sameEulerTotient(N) == 1 )
System.out.print( "Yes" );
else
System.out.print( "No" );
}
}
|
Python3
def sameEulerTotient(N):
return (N & 1 );
if __name__ = = '__main__' :
N = 13 ;
if (sameEulerTotient(N) = = 1 ):
print ( "Yes" );
else :
print ( "No" );
|
C#
using System;
class GFG{
static int sameEulerTotient( int N)
{
return (N & 1);
}
public static void Main(String[] args)
{
int N = 13;
if (sameEulerTotient(N) == 1)
Console.Write( "Yes" );
else
Console.Write( "No" );
}
}
|
Javascript
<script>
function sameEulerTotient(N)
{
return (N & 1);
}
var N = 13;
if (sameEulerTotient(N))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity: O(1)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...