--- canonical_url: https://www.scaler.com/topics/eulers-totient-function/ title: Euler's Totient Function | Euler's Theorem - Scaler Topics description: Learn about Eulers Totient Function by Scaler Topics. In this article, we will discuss Euler’s totient function, its applications, examples, etc. author: Aman Kumar category: Data Structures amphtml: https://www.scaler.com/topics/eulers-totient-function/amp/ publish_date: 2022-03-02 --- :::section{.abstract} ## Overview `Totient function` (denoted by $\phi:\mathbb{N} \rightarrow \mathbb{N}$ ), also known as phi-function or Euler's Totient function, is a mathematical function which counts the number of integers in the range $[1, n]$ (both inclusive) that are co-prime to $n$ or we can say whose GCD with n is 1. It has a major application in `Euler's Theorem`. ::: :::section{.tip} **Note:** 1. Two positive integers **a** and **b** are said to be co-prime if their greatest common `factor/divisor` is equal to `1`, that is, $$ \gcd(a, b) = 1 $$ 2. `1` is considered co-prime to all numbers. ::: :::section{.main} ## Example of `Euler's Totient Function` ### Example 1 - For an small example, let's take **$n = 10$**. The numbers less than `10` are as follows: $$ 1, 2, 3, 4, 5, 6, 7, 8, 9 $$ Out of these, - **1** is co-prime to **10** (by definition). - **2** and **5** completely divide **10**, therefore, are not co-prime to **10**. - **4**, **6**, **8** are divisible by **2** (just like **10**), therefore, their greatest common divisor is **2**. Therefore, they are also not coprime to **10**.. - **3**, **7**, **9** neither divide **10** nor share any common factor with it. Therefore, by definition of coprime numbers, we saw earlier, these numbers are coprime to **10**. Therefore, there are **4** numbers less than **10** that are co-prime to it.Therefore, $$ \phi(10) = 4 $$ ### Example 2 - Let's take a bigger `n`, say **24**. In range [1,24] there are total 8 numbers `1,5,7,11,13,17,19,23` are there whose gcd with 24 is equal to 1 (they are coprime to it). Therefore: $$ \phi(n) = 8 $$ ::: :::section{.main} ## How to Compute Φ(n) for an Input `n`? Suppose you're given an integer $n \in \mathbb{N}$. Using the fundamental theorem of arithmetic, we know that $n$ can be decomposed as a product of the positive integral powers of its prime factors. Therefore, $$ n = {p_1^{\alpha_1}} {\cdot} {p_2^{\alpha_2}} \cdots p_k^{\alpha_k}\tag{1} $$ where $p_i$ are `prime factors` of $n$. Now using an interesting property of the `totient function`, which states that $$ \phi(abc) = \phi{a}\cdot\phi(b)\cdot\phi(c) \tag{2} $$ provided that $a, b, c$ are co-prime to each other. Using $(1)$ and $(2)$, we get $$ \phi(n) = \phi({p_1^{\alpha_1}} {\cdot} {p_2^{\alpha_2}} \cdots p_k^{\alpha_k}) = \phi(p_1^{\alpha_1})\cdot\phi(p_2^{\alpha_2})\cdots\phi(p_k^{\alpha_k}) \tag{3} $$ --- Another interesting property of the totient function $\phi(m)$ is that if $m$ is a power of a prime number, say $p^{\alpha}$ where $\alpha \ge 1$, then, $$ \phi(m) = \phi(p^{\alpha}) = p^{\alpha}-p^{\alpha-1} \tag{4} $$ Using $(4)$ and $(3)$, we get $$ \phi(n) = (p_1^{\alpha_1}-p_1^{\alpha_1-1})\cdot(p_2^{\alpha_2}-p_2^{\alpha_2-1})\cdot(p_3^{\alpha_3}-p_3^{\alpha_3-1})\cdots(p_k^{\alpha_k}-p_k^{\alpha_k-1}) \tag{5} $$ --- Taking $p_i^{\alpha_i}$ common from $i^{th}$ term from `RHS` of $(5)$, we get $$ ={p_1^{\alpha_1}} {\cdot} {p_2^{\alpha_2}} \cdots p_k^{\alpha_k}\cdot \left(1 - \frac{1}{p_1}\right) \cdot\left(1 - \frac{1}{p_2}\right) \cdots \left(1 - \frac{1}{p_k}\right) $$ $$ = n \cdot \left(1 - \frac{1}{p_1}\right) \cdot \left(1 - \frac{1}{p_2}\right) \cdots \left(1 - \frac{1}{p_k}\right) $$ **Hence we get** $$ \phi(n) = n \cdot \left(1 - \frac{1}{p_1}\right) \cdot \left(1 - \frac{1}{p_2}\right) \cdots \left(1 - \frac{1}{p_k}\right) $$ The above equation gives us a method to calculate $\phi(n)$ for any desired $n$. ::: :::section{.main} ## Code Implementation Using the result we derived above, it is quite easy to write a program to calculate $\phi(n)$ for an input $n$. ### C++ Implementation 1 ```cpp long long phi(long long n) { long long answer = n; for (long long p = 2; p * p <= n; p++) { if (n % p == 0) { while (n % p == 0) { n = n/p; } answer = answer-(answer / p); } } if (n > 1) { answer = answer-(answer / n); } return answer; } ``` **Explanation:** The algorithm initializes answer with n and iterates through primes up to the square root of n, dividing n by each prime divisor found. It updates answer by multiplying it with (1 - 1/p), ensuring accuracy. If n remains greater than 1 after this process, it accounts for the last prime factor of n. This optimized approach efficiently calculates Euler's Totient function, addressing precision errors by using multiplication instead of division. **Time Complexity:** $\mathcal{O}({\sqrt{n}})$ **Space Complexity:** $\mathcal{O}(1)$ --- ### C++ Implementation 2 ```cpp= vector<long long> phi_n(long long n) { vector<long long> phi(n + 1); phi[0] = 0; phi[1] = 1; for (long long i = 2; i <= n; i++) { phi[i] = i; } for (int i = 2; i <= n; i++) { if (phi[i] == i) { for (int j = i; j <= n; j += i) { phi[j] -= phi[j] / i; } } } return phi; } ``` **Explanation:** - This optimized implementation efficiently computes Euler's totient function ($\phi$) for all integers up to $n$ using the Sieve of Eratosthenes. Rather than factorizing each number individually, it iterates through primes and updates their multiples by subtracting $\phi[j]/i$. For prime numbers, it subtracts 1. This approach ensures efficiency by avoiding redundant computations. **Time Complexity:** $\mathcal{O}(n\log(\log{n}))$ **Space Complexity:** $\mathcal{O}(n)$ --- ### C++ Implementation 3 (Using `Divisor Sum Property`) ```cpp= vector<long long> phi_n(long long n) { vector<long long> phi(n + 1); phi[0] = 0; phi[1] = 1; for (long long i = 2; i <= n; i++) { phi[i] = i - 1; } for (long long i = 2; i <= n; i++) { for (long long j = 2 * i; j <= n; j += i) { phi[j] -= phi[i]; } } return phi; } ``` **Explanation:** This implementation leverages the divisor sum property of the totient function. Initially, subtracting ϕ(1) from all numbers, the ith element of the phi vector initializes as i-1. When processing element i, previous phi values remain unchanged. Subsequently, phi[i] subtracts from multiples of i starting from 2*i up to n. Upon completion, the phi array holds the ϕ values for numbers 1 to n. This optimized approach efficiently computes totient values, exploiting the properties of integer factorization. **Time Complexity:** $\mathcal{O}(n\log{(n)})$ **Space Complexity:** $\mathcal{O}(n)$ ::: :::section{.main} ## Properties of `Euler's Totient Function` In addition to the above-used properties, we also have the following results related to the `Totient function`: 1. If $p$ is a `prime number`, then $$ \phi(p) = p-1 $$ 2. If $p$ is a `prime number` and $m$ is a positive integer (that is, $m \ge 1$), then $$ \phi(p^m) = p^{m}-p^{m-1} $$ 3. For any two positive integers $m$ and $n$ we have $$ \phi(mn) = \phi(m)\cdot\phi(n)\cdot \frac{\gcd(m, n)}{\phi(\gcd(m, n))} $$ Considering the case when $m$ and $n$ are coprime, then $\gcd(m,n)=1$. In such a scenario, the above relation reduces to $$ \phi(mn) = \phi(m)\cdot\phi(n) $$ 4. The sum of values of the totient function over the positive divisors of $n$ equals $n$ itself. In other words: $$ \sum_{k|n} \phi{(k)} = n $$ 5. If $m$ and $n$ are two `prime numbers`, then using (1) and (3), we get: $$ \phi(mn) = \phi(m)\cdot\phi(n) = (m-1)\cdot(n-1) $$ This property is used in the RSA algorithm. ::: :::section{.main} ## Application of `Totient Function` in `Euler's Theorem` `Euler's theorem` (sometimes also called as **Euler's totient theorem**) which makes use of Euler's totient function, states the following: > If $a$, $n$ $\in \mathbb{N}$ are relatively prime, then >$$ >a^{\phi(n)} \equiv 1\mod{n} >$$ The converse of the `Euler's theorem` also holds, which is stated as: > If $a^{\phi(n)} \equiv 1 \mod{n}$, then $a$ and $n$ are relatively prime. A special case of this theorem where $n$ is a prime number is used in the `RSA` encryption algorithm. This special case of the theorem is popularly known as **`Fermat's Little Theorem`** and states that > $a^{n-1} \equiv 1 \mod{n}$ --- Taking an example, suppose $a = 10$ and $n = 9$. Using the methods described above, we get $\phi(9) = 6$. Therefore, $a^{\phi(n)} = 10^{6}$. Applying the $\mod n \ (=\mod 9)$ operator on $10^6$, we get $$ 10^6\mod9= (11111\times9+1)\mod9 = 0 + (1\mod9) = 1 $$ which was the expected result since `10` and `9` don't have any common divisor other than `1`, that is to say, they are co-prime. --- Suppose we had taken a number $n = 2$ which is not co-prime to `10` (since their greatest common divisor is `2`). In this case, $\phi(n)= \phi(2) =1$. Therefore, $a^{\phi(n)} = 10^{1} = 10$. Applying the $\mod n \ (=\mod 2)$ operator on $10$, we get $$ 10\mod2= (5\times2)\mod2 = 0 \neq 1 $$ Thus, we've verified that the **theorem does not hold when $a$ and $n$ are not co-prime**. ::: :::section{.summary} ## Conclusion 1. `Euler's totient function`, $\phi:\mathbb{N} \rightarrow \mathbb{N}$, counts the number of integers between $1$ and $n$ (both inclusive) that are co-prime to $n$. 2. If $p$ is a `prime number`, then $$ \phi(p) = p-1 $$ 3. The sum of values of the totient function over the positive divisors of $n$ equals $n$ itself. 4. Totient Function is used in Euler's theorem, Fermat's Little theorem which is used in the RSA encryption algorithm. 5. The value of `Totient function` for a number $n$ can be implemented in the best time complexity of $\mathcal{O}(n\log{(\log{n})})$ with an associated space complexity of $\mathcal{O}(n)$ :::