Euler’s Totient function ? (n) for an input n is the count of numbers in {1, 2, 3, …, n-1} that are relatively prime to n, i.e., the numbers whose GCD (Greatest Common Divisor) with n is 1.
Examples :
?(1) = 1
gcd(1, 1) is 1
?(2) = 1
gcd(1, 2) is 1, but gcd(2, 2) is 2.
?(3) = 2
gcd(1, 3) is 1 and gcd(2, 3) is 1
?(4) = 2
gcd(1, 4) is 1 and gcd(3, 4) is 1
?(5) = 4
gcd(1, 5) is 1, gcd(2, 5) is 1,
gcd(3, 5) is 1 and gcd(4, 5) is 1
?(6) = 2
gcd(1, 6) is 1 and gcd(5, 6) is 1,
How to compute ?(n) for an input n?
A simple solution is to iterate through all numbers from 1 to n-1 and count numbers with gcd with n as 1. Below is the implementation of the simple method to compute Euler’s Totient function for an input integer n.
C++
#include <iostream>
using namespace std;
int gcd( int a, int b)
{
if (a == 0)
return b;
return gcd(b % a, a);
}
int phi(unsigned int n)
{
unsigned int result = 1;
for ( int i = 2; i < n; i++)
if (gcd(i, n) == 1)
result++;
return result;
}
int main()
{
int n;
for (n = 1; n <= 10; n++)
cout << "phi(" <<n<< ") = " << phi(n) << endl;
return 0;
}
|
C
#include <stdio.h>
int gcd( int a, int b)
{
if (a == 0)
return b;
return gcd(b % a, a);
}
int phi(unsigned int n)
{
unsigned int result = 1;
for ( int i = 2; i < n; i++)
if (gcd(i, n) == 1)
result++;
return result;
}
int main()
{
int n;
for (n = 1; n <= 10; n++)
printf ( "phi(%d) = %d\n" , n, phi(n));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int gcd( int a, int b)
{
if (a == 0 )
return b;
return gcd(b % a, a);
}
static int phi( int n)
{
int result = 1 ;
for ( int i = 2 ; i < n; i++)
if (gcd(i, n) == 1 )
result++;
return result;
}
public static void main(String[] args)
{
int n;
for (n = 1 ; n <= 10 ; n++)
System.out.println( "phi(" + n + ") = " + phi(n));
}
}
|
Python3
def gcd(a, b):
if (a = = 0 ):
return b
return gcd(b % a, a)
def phi(n):
result = 1
for i in range ( 2 , n):
if (gcd(i, n) = = 1 ):
result + = 1
return result
for n in range ( 1 , 11 ):
print ( "phi(" ,n, ") = " ,
phi(n), sep = "")
|
C#
using System;
class GFG {
static int gcd( int a, int b)
{
if (a == 0)
return b;
return gcd(b % a, a);
}
static int phi( int n)
{
int result = 1;
for ( int i = 2; i < n; i++)
if (gcd(i, n) == 1)
result++;
return result;
}
public static void Main()
{
for ( int n = 1; n <= 10; n++)
Console.WriteLine( "phi(" + n + ") = " + phi(n));
}
}
|
PHP
<Φphp
function gcd( $a , $b )
{
if ( $a == 0)
return $b ;
return gcd( $b % $a , $a );
}
function phi( $n )
{
$result = 1;
for ( $i = 2; $i < $n ; $i ++)
if (gcd( $i , $n ) == 1)
$result ++;
return $result ;
}
for ( $n = 1; $n <= 10; $n ++)
echo "phi(" . $n . ") =" . phi( $n ). "\n" ;
Φ>
|
Javascript
<script>
function gcd(a, b)
{
if (a == 0)
return b;
return gcd(b % a, a);
}
function phi(n)
{
let result = 1;
for (let i = 2; i < n; i++)
if (gcd(i, n) == 1)
result++;
return result;
}
for (let n = 1; n <= 10; n++)
document.write(`phi(${n}) = ${phi(n)} <br>`);
</script>
|
Output
phi(1) = 1
phi(2) = 1
phi(3) = 2
phi(4) = 2
phi(5) = 4
phi(6) = 2
phi(7) = 6
phi(8) = 4
phi(9) = 6
phi(10) = 4
The above code calls gcd function O(n) times. The time complexity of the gcd function is O(h) where “h” is the number of digits in a smaller number of given two numbers. Therefore, an upper bound on the time complexity of the above solution is O(N^2 log N) [How? there can be at most Log10n digits in all numbers from 1 to n]
Auxiliary Space: O(log N)
Below is a Better Solution. The idea is based on Euler’s product formula which states that the value of totient functions is below the product overall prime factors p of n.

The formula basically says that the value of ?(n) is equal to n multiplied by-product of (1 – 1/p) for all prime factors p of n. For example value of ?(6) = 6 * (1-1/2) * (1 – 1/3) = 2.
We can find all prime factors using the idea used in this post.
1) Initialize : result = n
2) Run a loop from 'p' = 2 to sqrt(n), do following for every 'p'.
a) If p divides n, then
Set: result = result * (1.0 - (1.0 / (float) p));
Divide all occurrences of p in n.
3) Return result
Below is the implementation of Euler’s product formula.
C++
#include <bits/stdc++.h>
using namespace std;
int phi( int n)
{
float result = n;
for ( int p = 2; p * p <= n; ++p)
{
if (n % p == 0)
{
while (n % p == 0)
n /= p;
result *= (1.0 - (1.0 / ( float )p));
}
}
if (n > 1)
result -= result / n;
return ( int )result;
}
int main()
{
int n;
for (n = 1; n <= 10; n++)
{
cout << "Phi" << "("
<< n << ")" << " = "
<< phi(n) <<endl;
}
return 0;
}
|
C
#include <stdio.h>
int phi( int n)
{
float result = n;
for ( int p = 2; p * p <= n; ++p) {
if (n % p == 0) {
while (n % p == 0)
n /= p;
result *= (1.0 - (1.0 / ( float )p));
}
}
if (n > 1)
result -= result / n;
return ( int )result;
}
int main()
{
int n;
for (n = 1; n <= 10; n++)
printf ( "phi(%d) = %d\n" , n, phi(n));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int phi( int n)
{
float result = n;
for ( int p = 2 ; p * p <= n; ++p) {
if (n % p == 0 ) {
while (n % p == 0 )
n /= p;
result *= ( 1.0 - ( 1.0 / ( float )p));
}
}
if (n > 1 )
result -= result / n;
return ( int )result;
}
public static void main(String args[])
{
int n;
for (n = 1 ; n <= 10 ; n++)
System.out.println( "phi(" + n + ") = " + phi(n));
}
}
|
Python3
def phi(n) :
result = n
p = 2
while p * p< = n :
if n % p = = 0 :
while n % p = = 0 :
n = n / / p
result = result * ( 1.0 - ( 1.0 / float (p)))
p = p + 1
if n > 1 :
result - = result / / n
return int (result)
for n in range ( 1 , 11 ) :
print ( "phi(" , n, ") = " , phi(n))
|
C#
using System;
class GFG {
static int phi( int n)
{
float result = n;
for ( int p = 2; p * p <= n; ++p)
{
if (n % p == 0)
{
while (n % p == 0)
n /= p;
result *= ( float )(1.0 - (1.0 / ( float )p));
}
}
if (n > 1)
result -= result / n;
return ( int )result;
}
public static void Main()
{
int n;
for (n = 1; n <= 10; n++)
Console.WriteLine( "phi(" + n + ") = " + phi(n));
}
}
|
PHP
<Φphp
function phi( $n )
{
$result = $n ;
for ( $p = 2; $p * $p <= $n ; ++ $p )
{
if ( $n % $p == 0)
{
while ( $n % $p == 0)
$n /= $p ;
$result *= (1.0 - (1.0 / $p ));
}
}
if ( $n > 1)
$result -= $result / $n ;
return intval ( $result );
}
for ( $n = 1; $n <= 10; $n ++)
echo "phi(" . $n . ") =" . phi( $n ). "\n" ;
Φ>
|
Javascript
function phi(n)
{
let result = n;
for (let p = 2; p * p <= n; ++p)
{
if (n % p == 0)
{
while (n % p == 0)
n /= p;
result *= (1.0 - (1.0 / p));
}
}
if (n > 1)
result -= result / n;
return parseInt(result);
}
for (let n = 1; n <= 10; n++)
document.write(`phi(${n}) = ${phi(n)} <br>`);
|
Output
Phi(1) = 1
Phi(2) = 1
Phi(3) = 2
Phi(4) = 2
Phi(5) = 4
Phi(6) = 2
Phi(7) = 6
Phi(8) = 4
Phi(9) = 6
Phi(10) = 4
Time Complexity: O(?n log n)
Auxiliary Space: O(1)
We can avoid floating-point calculations in the above method. The idea is to count all prime factors and their multiples and subtract this count from n to get the totient function value (Prime factors and multiples of prime factors won’t have gcd as 1)
1) Initialize result as n
2) Consider every number 'p' (where 'p' varies from 2 to ?n).
If p divides n, then do following
a) Subtract all multiples of p from 1 to n [all multiples of p
will have gcd more than 1 (at least p) with n]
b) Update n by repeatedly dividing it by p.
3) If the reduced n is more than 1, then remove all multiples
of n from result.
Below is the implementation of the above algorithm.
C++
#include <bits/stdc++.h>
using namespace std;
int phi( int n)
{
int result = n;
for ( int p = 2; p * p <= n; ++p)
{
if (n % p == 0)
{
while (n % p == 0)
n /= p;
result -= result / p;
}
}
if (n > 1)
result -= result / n;
return result;
}
int main()
{
int n;
for (n = 1; n <= 10; n++)
{
cout << "Phi" << "("
<< n << ")" << " = "
<< phi(n) << endl;
}
return 0;
}
|
C
#include <stdio.h>
int phi( int n)
{
int result = n;
for ( int p = 2; p * p <= n; ++p) {
if (n % p == 0) {
while (n % p == 0)
n /= p;
result -= result / p;
}
}
if (n > 1)
result -= result / n;
return result;
}
int main()
{
int n;
for (n = 1; n <= 10; n++)
printf ( "phi(%d) = %d\n" , n, phi(n));
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int phi( int n)
{
int result = n;
for ( int p = 2 ; p * p <= n; ++p)
{
if (n % p == 0 )
{
while (n % p == 0 )
n /= p;
result -= result / p;
}
}
if (n > 1 )
result -= result / n;
return result;
}
public static void main (String[] args)
{
int n;
for (n = 1 ; n <= 10 ; n++)
System.out.println( "phi(" + n +
") = " + phi(n));
}
}
|
Python3
def phi(n):
result = n;
p = 2 ;
while (p * p < = n):
if (n % p = = 0 ):
while (n % p = = 0 ):
n = int (n / p);
result - = int (result / p);
p + = 1 ;
if (n > 1 ):
result - = int (result / n);
return result;
for n in range ( 1 , 11 ):
print ( "phi(" ,n, ") =" , phi(n));
|
C#
using System;
class GFG
{
static int phi( int n)
{
int result = n;
for ( int p = 2;
p * p <= n; ++p)
{
if (n % p == 0)
{
while (n % p == 0)
n /= p;
result -= result / p;
}
}
if (n > 1)
result -= result / n;
return result;
}
static public void Main ()
{
int n;
for (n = 1; n <= 10; n++)
Console.WriteLine( "phi(" + n +
") = " +
phi(n));
}
}
|
PHP
<Φphp
function phi( $n )
{
$result = $n ;
for ( $p = 2;
$p * $p <= $n ; ++ $p )
{
if ( $n % $p == 0)
{
while ( $n % $p == 0)
$n = (int) $n / $p ;
$result -= (int) $result / $p ;
}
}
if ( $n > 1)
$result -= (int) $result / $n ;
return $result ;
}
for ( $n = 1; $n <= 10; $n ++)
echo "phi(" , $n , ") =" ,
phi( $n ), "\n" ;
Φ>
|
Javascript
function phi(n)
{
let result = n;
for (let p = 2;
p * p <= n; ++p)
{
if (n % p == 0)
{
while (n % p == 0)
n = parseInt(n / p);
result -= parseInt(result / p);
}
}
if (n > 1)
result -= parseInt(result / n);
return result;
}
for (let n = 1; n <= 10; n++)
document.write(`phi(${n}) = ${phi(n)} <br>`);
|
Output
Phi(1) = 1
Phi(2) = 1
Phi(3) = 2
Phi(4) = 2
Phi(5) = 4
Phi(6) = 2
Phi(7) = 6
Phi(8) = 4
Phi(9) = 6
Phi(10) = 4
Time Complexity: O(?n log n)
Auxiliary Space: O(1)
Let us take an example to understand the above algorithm.
n = 10.
Initialize: result = 10
2 is a prime factor, so n = n/i = 5, result = 5
3 is not a prime factor.
The for loop stops after 3 as 4*4 is not less than or equal
to 10.
After for loop, result = 5, n = 5
Since n > 1, result = result - result/n = 4
Some Interesting Properties of Euler’s Totient Function
1) For a prime number p, 
Proof :
, where p is any prime numberWe know that
where k is any random number and
[Tex]\\[/Tex]Total number from 1 to p = p Number for which
is
, i.e the number p itself, so subtracting 1 from p 
Examples :
[Tex]\\[/Tex]
[Tex]\\[/Tex]
2) For two prime numbers a and b
, used in RSA Algorithm
Proof :
, where a and b are prime numbers
,
[Tex]\\[/Tex]Total number from 1 to ab = ab Total multiples of a from 1 to ab =
=
Total multiples of b from 1 to ab =
=
Example:a = 5, b = 7, ab = 35Multiples of a =
= 7 {5, 10, 15, 20, 25, 30, 35}Multiples of b =
= 5 {7, 14, 21, 28, 35}
Can there be any double counting ?(watch above example carefully, try with other prime numbers also for more grasp)Ofcourse, we have counted
twice in multiples of a and multiples of b so, Total multiples = a + b - 1 (with which
with
)
[Tex]\phi(ab) = ab - (a + b - 1)[/Tex] , removing all number with
with
[Tex]\phi(ab) = (a - 1) \cdot (b - 1)[/Tex]
Examples :
[Tex]\\[/Tex]
[Tex]\\[/Tex]
3) For a prime number p, 
Proof :
, where p is a prime number
Total numbers from 1 to
Total multiples of
Removing these multiples as with them
[Tex]\\[/Tex]Example : p = 2, k = 5,
= 32Multiples of 2 (as with them
) = 32 / 2 = 16 {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32}
[Tex]\phi(p ^ k) = p ^ k - p ^ {k - 1}[/Tex]
Examples :
[Tex]\\[/Tex]
[Tex]\\[/Tex]
4) For two number a and b

Special Case : gcd(a, b) = 1

Examples :
Special Case :
,
[Tex]\\[/Tex]
[Tex]\\[/Tex]
[Tex]\\[/Tex]Normal Case :
,
[Tex]\\[/Tex]
[Tex]\\[/Tex]
[Tex]\\[/Tex]
5) Sum of values of totient functions of all divisors of n is equal to n.

Examples :
n = 6
factors = {1, 2, 3, 6}
n =
= 1 + 1 + 2 + 2 = 6
n = 8factors = {1, 2, 4, 8}n =
= 1 + 1 + 2 + 4 = 8
n = 10factors = {1, 2, 5, 10}n =
= 1 + 1 + 4 + 4 = 10
6) The most famous and important feature is expressed in Euler’s theorem :
The theorem states that if n and a are coprime
(or relatively prime) positive integers, then
a?(n) ? 1 (mod n)
The RSA cryptosystem is based on this theorem:
In the particular case when m is prime say p, Euler’s theorem turns into the so-called Fermat’s little theorem :
ap-1 ? 1 (mod p)
7) Number of generators of a finite cyclic group under modulo n addition is ?(n).
Related Article:
Euler’s Totient function for all numbers smaller than or equal to n
Optimized Euler Totient Function for Multiple Evaluations
References:
http://e-maxx.ru/algo/euler_function
http://en.wikipedia.org/wiki/Euler%27s_totient_function
https://cp-algorithms.com/algebra/phi-function.html
http://mathcenter.oxford.memory.edu/site/math125/chineseRemainderTheorem/
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
25 Jan, 2023
Like Article
Save Article