Euler's Totient Function - GeeksforGeeks

13 Mar, 2022
Euler’s Totient function Φ (n) for an input n is the count of numbers in {1, 2, 3, ..., n} 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++
C
Java
Python3
C#
PHP
Javascript
// A simple C++ program to calculate// Euler's Totient Function#include <iostream>using namespace std; // Function to return gcd of a and bint gcd(int a, int b){    if (a == 0)        return b;    return gcd(b % a, a);} // A simple method to evaluate Euler Totient Functionint phi(unsigned int n){    unsigned int result = 1;    for (int i = 2; i < n; i++)        if (gcd(i, n) == 1)            result++;    return result;} // Driver program to test above functionint main(){    int n;    for (n = 1; n <= 10; n++)        cout << "phi("<<n<<") = " << phi(n) << endl;    return 0;} // This code is contributed by SHUBHAMSINGH10
// A simple C program to calculate Euler's Totient Function#include <stdio.h> // Function to return gcd of a and bint gcd(int a, int b){    if (a == 0)        return b;    return gcd(b % a, a);} // A simple method to evaluate Euler Totient Functionint phi(unsigned int n){    unsigned int result = 1;    for (int i = 2; i < n; i++)        if (gcd(i, n) == 1)            result++;    return result;} // Driver program to test above functionint main(){    int n;    for (n = 1; n <= 10; n++)        printf("phi(%d) = %d\n", n, phi(n));    return 0;}
// A simple java program to calculate// Euler's Totient Functionimport java.io.*; class GFG {     // Function to return GCD of a and b    static int gcd(int a, int b)    {        if (a == 0)            return b;        return gcd(b % a, a);    }     // A simple method to evaluate    // Euler Totient Function    static int phi(int n)    {        int result = 1;        for (int i = 2; i < n; i++)            if (gcd(i, n) == 1)                result++;        return result;    }     // Driver code    public static void main(String[] args)    {        int n;         for (n = 1; n <= 10; n++)            System.out.println("phi(" + n + ") = " + phi(n));    }} // This code is contributed by sunnusingh
# A simple Python3 program# to calculate Euler's# Totient Function # Function to return# gcd of a and bdef gcd(a, b):     if (a == 0):        return b    return gcd(b % a, a) # A simple method to evaluate# Euler Totient Functiondef phi(n):     result = 1    for i in range(2, n):        if (gcd(i, n) == 1):            result+=1    return result # Driver Codefor n in range(1, 11):    print("phi(",n,") = ",           phi(n), sep = "")            # This code is contributed# by Smitha
// A simple C# program to calculate// Euler's Totient Functionusing System; class GFG {     // Function to return GCD of a and b    static int gcd(int a, int b)    {        if (a == 0)            return b;        return gcd(b % a, a);    }     // A simple method to evaluate    // Euler Totient Function    static int phi(int n)    {        int result = 1;        for (int i = 2; i < n; i++)            if (gcd(i, n) == 1)                result++;        return result;    }     // Driver code    public static void Main()    {        for (int n = 1; n <= 10; n++)        Console.WriteLine("phi(" + n + ") = " + phi(n));    }} // This code is contributed by nitin mittal
<Φphp// PHP program to calculate// Euler's Totient Function // Function to return// gcd of a and bfunction gcd($a, $b){    if ($a == 0)        return $b;    return gcd($b % $a, $a);} // A simple method to evaluate// Euler Totient Functionfunction phi($n){    $result = 1;    for ($i = 2; $i < $n; $i++)        if (gcd($i, $n) == 1)            $result++;    return $result;} // Driver Codefor ($n = 1; $n <= 10; $n++)    echo "phi(" .$n. ") =" . phi($n)."\n"; // This code is contributed by Sam007Φ>
<script>// Javascript program to calculate// Euler's Totient Function // Function to return// gcd of a and bfunction gcd(a, b){    if (a == 0)        return b;    return gcd(b % a, a);} // A simple method to evaluate// Euler Totient Functionfunction phi(n){    let result = 1;    for (let i = 2; i < n; i++)        if (gcd(i, n) == 1)            result++;    return result;} // Driver Codefor (let n = 1; n <= 10; n++)    document.write(`phi(${n}) = ${phi(n)} <br>`); // This code is contributed by _saurabh_jaiswal </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 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++
C
Java
Python3
C#
PHP
Javascript
// C++ program to calculate Euler's// Totient Function using Euler's// product formula#include <bits/stdc++.h>using namespace std; int phi(int n){         // Initialize result as n    float result = n;      // Consider all prime factors of n    // and for every prime factor p,    // multiply result with (1 - 1/p)    for(int p = 2; p * p <= n; ++p)    {                 // Check if p is a prime factor.        if (n % p == 0)        {                         // If yes, then update n and result            while (n % p == 0)                n /= p;                             result *= (1.0 - (1.0 / (float)p));        }    }      // If n has a prime factor greater than sqrt(n)    // (There can be at-most one such prime factor)    if (n > 1)        result *= (1.0 - (1.0 / (float)n));      return (int)result;}  // Driver codeint main(){    int n;         for(n = 1; n <= 10; n++)    {        cout << "Phi" << "("             << n << ")" << " = "             << phi(n) <<endl;    }    return 0;} // This code is contributed by koulick_sadhu
// C program to calculate Euler's Totient Function// using Euler's product formula#include <stdio.h> int phi(int n){    float result = n; // Initialize result as n     // Consider all prime factors of n and for every prime    // factor p, multiply result with (1 - 1/p)    for (int p = 2; p * p <= n; ++p) {                 // Check if p is a prime factor.        if (n % p == 0) {                         // If yes, then update n and result            while (n % p == 0)                n /= p;            result *= (1.0 - (1.0 / (float)p));        }    }     // If n has a prime factor greater than sqrt(n)    // (There can be at-most one such prime factor)    if (n > 1)        result *= (1.0 - (1.0 / (float)n));     return (int)result;} // Driver program to test above functionint main(){    int n;    for (n = 1; n <= 10; n++)        printf("phi(%d) = %d\n", n, phi(n));    return 0;}
// Java program to calculate Euler's Totient// Function using Euler's product formulaimport java.io.*; class GFG {    static int phi(int n)    {        // Initialize result as n        float result = n;         // Consider all prime factors of n and for        // every prime factor p, multiply result        // with (1 - 1/p)        for (int p = 2; p * p <= n; ++p) {            // Check if p is a prime factor.            if (n % p == 0) {                // If yes, then update n and result                while (n % p == 0)                    n /= p;                result *= (1.0 - (1.0 / (float)p));            }        }         // If n has a prime factor greater than sqrt(n)        // (There can be at-most one such prime factor)        if (n > 1)            result *= (1.0 - (1.0 / (float)n));         return (int)result;    }     // Driver program to test above function    public static void main(String args[])    {        int n;        for (n = 1; n <= 10; n++)            System.out.println("phi(" + n + ") = " + phi(n));    }} // This code is contributed by Nikita Tiwari.
# Python 3 program to calculate# Euler's Totient Function# using Euler's product formula def phi(n) :     result = n   # Initialize result as n          # Consider all prime factors    # of n and for every prime    # factor p, multiply result with (1 - 1 / p)    p = 2    while p * p<= n :         # Check if p is a prime factor.        if n % p == 0 :             # If yes, then update n and result            while n % p == 0 :                n = n // p            result = result * (1.0 - (1.0 / float(p)))        p = p + 1                      # If n has a prime factor    # greater than sqrt(n)    # (There can be at-most one    # such prime factor)    if n > 1 :        result = result * (1.0 - (1.0 / float(n)))      return int(result)          # Driver program to test above functionfor n in range(1, 11) :    print("phi(", n, ") = ", phi(n))     # This code is contributed# by Nikita Tiwari.
// C# program to calculate Euler's Totient// Function using Euler's product formulausing System; class GFG {         static int phi(int n)    {                 // Initialize result as n        float result = n;         // Consider all prime factors        // of n and for every prime        // factor p, multiply result        // with (1 - 1 / p)        for (int p = 2; p * p <= n; ++p)        {                         // Check if p is a prime factor.            if (n % p == 0)            {                                 // If yes, then update                // n and result                while (n % p == 0)                    n /= p;                result *= (float)(1.0 - (1.0 / (float)p));            }        }         // If n has a prime factor        // greater than sqrt(n)        // (There can be at-most        // one such prime factor)        if (n > 1)            result *= (float)(1.0 - (1.0 / (float)n));         return (int)result;    }     // Driver Code    public static void Main()    {        int n;        for (n = 1; n <= 10; n++)            Console.WriteLine("phi(" + n + ") = " + phi(n));    }} // This code is contributed by nitin mittal.
<Φphp// PHP program to calculate// Euler's Totient Function// using Euler's product formulafunction phi($n){    // Initialize result as n    $result = $n;     // Consider all prime factors    // of n and for every prime    // factor p, multiply result    // with (1 - 1/p)    for ($p = 2; $p * $p <= $n; ++$p)    {                 // Check if p is        // a prime factor.        if ($n % $p == 0)        {                         // If yes, then update            // n and result            while ($n % $p == 0)                $n /= $p;            $result *= (1.0 - (1.0 / $p));        }    }     // If n has a prime factor greater    // than sqrt(n) (There can be at-most    // one such prime factor)    if ($n > 1)        $result *= (1.0 - (1.0 / $n));     return intval($result);} // Driver Codefor ($n = 1; $n <= 10; $n++)echo "phi(" .$n. ") =" . phi($n)."\n";     // This code is contributed by Sam007Φ>
// Javascript program to calculate// Euler's Totient Function// using Euler's product formulafunction phi(n){    // Initialize result as n    let result = n;     // Consider all prime factors    // of n and for every prime    // factor p, multiply result    // with (1 - 1/p)    for (let p = 2; p * p <= n; ++p)    {                 // Check if p is        // a prime factor.        if (n % p == 0)        {                         // If yes, then update            // n and result            while (n % p == 0)                n /= p;            result *= (1.0 - (1.0 / p));        }    }     // If n has a prime factor greater    // than sqrt(n) (There can be at-most    // one such prime factor)    if (n > 1)        result *= (1.0 - (1.0 / n));     return parseInt(result);} // Driver Codefor (let n = 1; n <= 10; n++) document.write(`phi(${n}) = ${phi(n)} <br>`);     // This code is contributed by _saurabh_jaiswal
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^(1/2) 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++
C
Java
Python3
C#
PHP
Javascript
// C++ program to calculate Euler's// Totient Function#include <bits/stdc++.h>using namespace std; int phi(int n){    // Initialize result as n    int result = n;      // Consider all prime factors of n    // and subtract their multiples    // from result    for(int p = 2; p * p <= n; ++p)    {                 // Check if p is a prime factor.        if (n % p == 0)        {                         // If yes, then update n and result            while (n % p == 0)                n /= p;                             result -= result / p;        }    }      // If n has a prime factor greater than sqrt(n)    // (There can be at-most one such prime factor)    if (n > 1)        result -= result / n;             return result;}  // Driver codeint main(){    int n;    for(n = 1; n <= 10; n++)    {        cout << "Phi" << "("             << n << ")" << " = "             << phi(n) << endl;    }    return 0;} // This code is contributed by koulick_sadhu
// C program to calculate Euler's Totient Function#include <stdio.h> int phi(int n){    int result = n; // Initialize result as n     // Consider all prime factors of n and subtract their    // multiples from result    for (int p = 2; p * p <= n; ++p) {                 // Check if p is a prime factor.        if (n % p == 0) {                         // If yes, then update n and result            while (n % p == 0)                n /= p;            result -= result / p;        }    }     // If n has a prime factor greater than sqrt(n)    // (There can be at-most one such prime factor)    if (n > 1)        result -= result / n;    return result;} // Driver program to test above functionint main(){    int n;    for (n = 1; n <= 10; n++)        printf("phi(%d) = %d\n", n, phi(n));    return 0;}
// Java program to calculate// Euler's Totient Functionimport java.io.*; class GFG{static int phi(int n){    // Initialize result as n    int result = n;     // Consider all prime factors    // of n and subtract their    // multiples from result    for (int p = 2; p * p <= n; ++p)    {                 // Check if p is        // a prime factor.        if (n % p == 0)        {                         // If yes, then update            // n and result            while (n % p == 0)                n /= p;            result -= result / p;        }    }     // If n has a prime factor    // greater than sqrt(n)    // (There can be at-most    // one such prime factor)    if (n > 1)        result -= result / n;    return result;} // Driver Codepublic static void main (String[] args){    int n;    for (n = 1; n <= 10; n++)        System.out.println("phi(" + n +                           ") = " + phi(n));}} // This code is contributed by ajit
# Python3 program to calculate# Euler's Totient Functiondef phi(n):         # Initialize result as n    result = n;     # Consider all prime factors    # of n and subtract their    # multiples from result    p = 2;    while(p * p <= n):                 # Check if p is a        # prime factor.        if (n % p == 0):                         # If yes, then            # update n and result            while (n % p == 0):                n = int(n / p);            result -= int(result / p);        p += 1;     # If n has a prime factor    # greater than sqrt(n)    # (There can be at-most    # one such prime factor)    if (n > 1):        result -= int(result / n);    return result; # Driver Codefor n in range(1, 11):    print("phi(",n,") =", phi(n));     # This code is contributed# by mits
// C# program to calculate// Euler's Totient Functionusing System; class GFG{     static int phi(int n){// Initialize result as nint result = n; // Consider all prime // factors of n and// subtract their// multiples from resultfor (int p = 2;         p * p <= n; ++p){         // Check if p is    // a prime factor.    if (n % p == 0)    {                 // If yes, then update        // n and result        while (n % p == 0)            n /= p;        result -= result / p;    }} // If n has a prime factor// greater than sqrt(n)// (There can be at-most// one such prime factor)if (n > 1)    result -= result / n;return result;} // Driver Codestatic public void Main (){    int n;    for (n = 1; n <= 10; n++)        Console.WriteLine("phi(" + n +                              ") = " +                              phi(n));}} // This code is contributed// by akt_mit
<Φphp// PHP program to calculate// Euler's Totient Function function phi($n){    // Initialize    // result as n    $result = $n;     // Consider all prime    // factors of n and subtract    // their multiples from result    for ($p = 2;         $p * $p <= $n; ++$p)    {                 // Check if p is        // a prime factor.        if ($n % $p == 0)        {                         // If yes, then            // update n and result            while ($n % $p == 0)                $n = (int)$n / $p;            $result -= (int)$result / $p;        }    }     // If n has a prime factor    // greater than sqrt(n)    // (There can be at-most    // one such prime factor)    if ($n > 1)        $result -= (int)$result / $n;    return $result;} // Driver Codefor ($n = 1; $n <= 10; $n++)    echo "phi(", $n,") =",          phi($n), "\n";     // This code is contributed// by ajitΦ>
// Javascript program to calculate// Euler's Totient Function function phi(n){    // Initialize    // result as n    let result = n;     // Consider all prime    // factors of n and subtract    // their multiples from result    for (let p = 2;         p * p <= n; ++p)    {                 // Check if p is        // a prime factor.        if (n % p == 0)        {                         // If yes, then            // update n and result            while (n % p == 0)                n = parseInt(n / p);            result -= parseInt(result / p);        }    }     // If n has a prime factor    // greater than sqrt(n)    // (There can be at-most    // one such prime factor)    if (n > 1)        result -= parseInt(result / n);    return result;} // Driver Codefor (let n = 1; n <= 10; n++)    document.write(`phi(${n}) = ${phi(n)} <br>`);     // This code is contributed// by _saurabh_jaiswal
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^(1/2) 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
1) For a prime number p, 
Proof :
 , where p is any prime number
We know that  where k is any random number and 

Total number from 1 to p = p 
Number for which  is , i.e the number p itself, so subtracting 1 from p 

Examples :  





2) For two prime numbers a and b, used in RSA Algorithm
Proof :
, where a and b are prime numbers
 , 

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 = 35
Multiples 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 )

 , removing all number with  with  



Examples :





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 

Example : 
p = 2, k = 5,  = 32
Multiples of 2 (as with them ) = 32 / 2 = 16 {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32}


Examples : 





4) For two number a and b   
Special Case : gcd(a, b) = 1
Examples :
Special Case : ,  




 


Normal Case : , 

  




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 = 8
factors = {1, 2, 4, 8}
n =  = 1 + 1 + 2 + 4 = 8

n = 10
factors = {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_functionhttp://en.wikipedia.org/wiki/Euler%27s_totient_function
https://cp-algorithms.com/algebra/phi-function.html
http://mathcenter.oxford.memory.edu/site/math125/chineseRemainderTheorem/This article is contributed by Ankur. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
nitin mittal
Sam007
jit_t
Smitha Dinesh Semwal
Mithun Kumar
SHUBHAMSINGH10
lalitvavdara2016
koulick_sadhu
_saurabh_jaiswal
tridib_samanta
anshkush92
varshagumber28
prophet1999
euler-totient
GCD-LCM
Modular Arithmetic
number-theory
Numbers
Prime Number
sieve
Mathematical
number-theory
Mathematical
Prime Number
Numbers
sieve
Modular Arithmetic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Modulo Operator (%) in C/C++ with Examples
Prime Numbers
Print all possible combinations of r elements in a given array of size n
Operators in C / C++
The Knight's tour problem | Backtracking-1
Program for factorial of a number
Find minimum number of coins that make a given value
Program to find sum of elements in a given array
Program to print prime numbers from 1 to N.