Clasa a IX-a · Divizibilitate și numere primeRead in English
Indicatorul lui Euler în C++
În engleză: Euler's totient function
Ideea
φ(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.
Descrierea în engleză
φ(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.
- Complexitate
- O(√n)
- Clasa
- Clasa a IX-a (Grade 9)
Exemple
Intrare
12
Ieșire așteptată
4
Intrare
13
Ieșire așteptată
12
Codul C++
Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.
/*
* 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;
}
Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.