Grade 9 · Divisibility and prime numbersCitește în română
Euler's totient function
Original: Indicatorul lui Euler
The idea
φ(n) is the number of values in 1..n that are coprime with n. If p1, p2, ... are the prime divisors of n, then φ(n) = n · (1 - 1/p1) · (1 - 1/p2) · ... For every prime factor p found during factorization we do rez = rez / p * (p - 1), so that we only work with integers.
Original description (Romanian)
φ(n) este numărul valorilor din 1..n prime cu n. Dacă p1, p2, ... sunt divizorii primi ai lui n, atunci φ(n) = n · (1 - 1/p1) · (1 - 1/p2) · ... Pentru fiecare factor prim p găsit la descompunere facem rez = rez / p * (p - 1), ca să lucrăm doar cu numere întregi.
- Complexity
- O(√n)
- Grade
- Grade 9 (Clasa a IX-a)
Examples
Input
12
Expected output
4
Input
13
Expected output
12
The code
Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.
/*
* Titlu: Indicatorul lui Euler
* Clasa: 9
* Capitol: Divizibilitate și numere prime
* Descriere: φ(n) este numărul valorilor din 1..n prime cu n. Dacă p1, p2, ...
* sunt divizorii primi ai lui n, atunci φ(n) = n · (1 - 1/p1) · (1 - 1/p2) · ...
* Pentru fiecare factor prim p găsit la descompunere facem
* rez = rez / p * (p - 1), ca să lucrăm doar cu numere întregi.
* Complexitate: O(√n)
*
* Exemplu
* Intrare: 12
* Ieșire: 4
*
* Exemplu
* Intrare: 13
* Ieșire: 12
*/
#include <iostream>
using namespace std;
int main()
{
long long n, rez;
cin >> n;
rez = n;
for (long long p = 2; p * p <= n; p++)
{
if (n % p == 0)
{
rez = rez / p * (p - 1);
while (n % p == 0)
{
n = n / p;
}
}
}
if (n > 1)
{
rez = rez / n * (n - 1);
}
cout << rez << '\n';
return 0;
}
Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.