Clasa a IX-a · Divizibilitate și numere primeRead in English

Indicatorul lui Euler în C++

În engleză: Euler's totient function

O(√n)C++1745 de linii2 exemple

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

Exemplul 1

Intrare

12

Ieșire așteptată

4
Exemplul 2

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.

indicatorul-lui-euler.cpp
/*
 * 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.