Перейти до основного вмісту

Функція Ейлера

Функція Ейлера, також відома як phi-функція ϕ(n)\phi (n), підраховує кількість цілих чисел від 1 до nn включно, які взаємно прості з nn. Два числа є взаємно простими, якщо їхній найбільший спільний дільник дорівнює 11 (11 вважається взаємно простим з будь-яким числом).

Ось значення ϕ(n)\phi(n) для перших кількох додатних цілих чисел:

n123456789101112131415161718192021ϕ(n)11224264641041268816618812\begin{array}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} \hline n & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19 & 20 & 21 \\\\ \hline \phi(n) & 1 & 1 & 2 & 2 & 4 & 2 & 6 & 4 & 6 & 4 & 10 & 4 & 12 & 6 & 8 & 8 & 16 & 6 & 18 & 8 & 12 \\\\ \hline \end{array}

Властивості

Наведених нижче властивостей функції Ейлера достатньо, щоб обчислити її для будь-якого числа:

  • Якщо pp — просте число, то gcd(p,q)=1\gcd(p, q) = 1 для всіх 1q<p1 \le q < p. Тому маємо:
ϕ(p)=p1.\phi (p) = p - 1.
  • Якщо pp — просте число і k1k \ge 1, то між 11 і pkp^k є рівно pk/pp^k / p чисел, що діляться на pp. Звідси отримуємо:
ϕ(pk)=pkpk1.\phi(p^k) = p^k - p^{k-1}.
  • Якщо aa і bb взаємно прості, то:

    ϕ(ab)=ϕ(a)ϕ(b).\phi(a b) = \phi(a) \cdot \phi(b).

    Це співвідношення не очевидне. Воно випливає з китайської теореми про остачі. Китайська теорема про остачі гарантує, що для кожного 0x<a0 \le x < a і кожного 0y<b0 \le y < b існує єдине 0z<ab0 \le z < a b таке, що zx(moda)z \equiv x \pmod{a} і zy(modb)z \equiv y \pmod{b}. Неважко показати, що zz взаємно просте з aba b тоді й лише тоді, коли xx взаємно просте з aa, а yy взаємно просте з bb. Тому кількість цілих чисел, взаємно простих з aba b, дорівнює добутку відповідних кількостей для aa і bb.

  • У загальному випадку, для не взаємно простих aa і bb, виконується рівність

    ϕ(ab)=ϕ(a)ϕ(b)dϕ(d)\phi(ab) = \phi(a) \cdot \phi(b) \cdot \dfrac{d}{\phi(d)}

    де d=gcd(a,b)d = \gcd(a, b).

Отже, користуючись першими трьома властивостями, ми можемо обчислити ϕ(n)\phi(n) через факторизацію числа nn (розклад nn на добуток його простих множників). Якщо n=p1a1p2a2pkakn = {p_1}^{a_1} \cdot {p_2}^{a_2} \cdots {p_k}^{a_k}, де pip_i — прості множники nn, то

ϕ(n)=ϕ(p1a1)ϕ(p2a2)ϕ(pkak)=(p1a1p1a11)(p2a2p2a21)(pkakpkak1)=p1a1(11p1)p2a2(11p2)pkak(11pk)=n(11p1)(11p2)(11pk)\begin{align} \phi (n) &= \phi ({p_1}^{a_1}) \cdot \phi ({p_2}^{a_2}) \cdots \phi ({p_k}^{a_k}) \\\\ &= \left({p_1}^{a_1} - {p_1}^{a_1 - 1}\right) \cdot \left({p_2}^{a_2} - {p_2}^{a_2 - 1}\right) \cdots \left({p_k}^{a_k} - {p_k}^{a_k - 1}\right) \\\\ &= p_1^{a_1} \cdot \left(1 - \frac{1}{p_1}\right) \cdot p_2^{a_2} \cdot \left(1 - \frac{1}{p_2}\right) \cdots p_k^{a_k} \cdot \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) \end{align}

Реалізація

Ось реалізація, що використовує факторизацію за O(n)O(\sqrt{n}):

int phi(int n) {
int result = n;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
while (n % i == 0)
n /= i;
result -= result / i;
}
}
if (n > 1)
result -= result / n;
return result;
}

Функція Ейлера від 11 до nn за O(nloglogn)O(n \log\log{n})

Якщо нам потрібні значення функції Ейлера для всіх чисел від 11 до nn, то факторизувати всі nn чисел неефективно. Можна скористатися тією ж ідеєю, що й у решеті Ератосфена. Вона так само спирається на показану вище властивість, але замість того, щоб оновлювати проміжний результат для кожного простого множника кожного числа, ми знаходимо всі прості числа і для кожного з них оновлюємо проміжні результати всіх чисел, які діляться на це просте число.

Оскільки цей підхід по суті ідентичний решету Ератосфена, складність буде такою ж: O(nloglogn)O(n \log \log n)

void phi_1_to_n(int n) {
vector<int> phi(n + 1);
for (int i = 0; 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;
}
}
}

Знаходження функції Ейлера від LL до RR за допомогою сегментованого решета

Якщо нам потрібні значення функції Ейлера для всіх чисел від LL до RR, ми можемо застосувати підхід сегментованого решета.

Спочатку алгоритм попередньо обчислює всі прості числа до R\sqrt{R} за допомогою лінійного решета за час і пам'ять O(R)O(\sqrt{R}). Потім для кожного числа з відрізка [L,R][L, R] він застосовує формулу для ϕ\phi на основі факторизації, перебираючи ці прості числа. Ми підтримуємо масив остач, щоб відстежувати нерозкладену частину кожного числа. Якщо після обробки всіх малих простих чисел остача все ще більша за 1, це означає наявність великого простого множника, більшого за R\sqrt{R}, який обробляється на завершальному проході. Загальна складність обчислення для відрізка становить O((RL+1)loglogR)+RO((R - L + 1) \log \log R) + \sqrt{R}.

const long long MAX_RANGE = 1e6 + 6;
vector<long long> primes;
long long phi[MAX_RANGE], rem[MAX_RANGE];

vector<int> linear_sieve(int n) {
vector<bool> composite(n + 1, 0);
vector<int> prime;

// 0 і 1 не є складеними (як і простими)
composite[0] = composite[1] = 1;

for(int i = 2; i <= n; i++) {
if(!composite[i]) prime.push_back(i);
for(int j = 0; j < prime.size() && i * prime[j] <= n; j++) {
composite[i * prime[j]] = true;
if(i % prime[j] == 0) break;
}
}
return prime;
}

// Щоб отримати значення phi(x) для L <= x <= R, використовуйте phi[x - L].
void segmented_phi(long long L, long long R) {
for(long long i = L; i <= R; i++) {
rem[i - L] = i;
phi[i - L] = i;
}

for(long long i : primes) {
for(long long j = max(i * i, (L + i - 1) / i * i); j <= R; j += i) {
phi[j - L] -= phi[j - L] / i;
while(rem[j - L] % i == 0) rem[j - L] /= i;
}
}

for(long long i = 0; i < R - L + 1; i++) {
if(rem[i] > 1) phi[i] -= phi[i] / rem[i];
}
}

Властивість суми за дільниками

Цю цікаву властивість встановив Гаусс:

dnϕ(d)=n\sum_{d|n} \phi{(d)} = n

Тут сума береться по всіх додатних дільниках dd числа nn.

Наприклад, дільниками числа 10 є 1, 2, 5 і 10. Тому ϕ(1)+ϕ(2)+ϕ(5)+ϕ(10)=1+1+4+4=10\phi{(1)} + \phi{(2)} + \phi{(5)} + \phi{(10)} = 1 + 1 + 4 + 4 = 10.

Знаходження функції Ейлера від 1 до nn за допомогою властивості суми за дільниками

Властивість суми за дільниками також дозволяє нам обчислити функцію Ейлера для всіх чисел від 1 до nn. Ця реалізація трохи простіша за попередню, що ґрунтувалася на решеті Ератосфена, проте має дещо гіршу складність: O(nlogn)O(n \log n)

void phi_1_to_n(int n) {
vector<int> phi(n + 1);
phi[0] = 0;
phi[1] = 1;
for (int i = 2; i <= n; i++)
phi[i] = i - 1;

for (int i = 2; i <= n; i++)
for (int j = 2 * i; j <= n; j += i)
phi[j] -= phi[i];
}

Застосування у теоремі Ейлера

Найвідоміша і найважливіша властивість функції Ейлера виражається в теоремі Ейлера:

aϕ(m)1(modm)якщо a і m взаємно прості.a^{\phi(m)} \equiv 1 \pmod m \quad \text{якщо } a \text{ і } m \text{ взаємно прості.}

В окремому випадку, коли mm просте, теорема Ейлера перетворюється на малу теорему Ферма:

am11(modm)a^{m - 1} \equiv 1 \pmod m

Теорема Ейлера та функція Ейлера досить часто трапляються у практичних застосуваннях, наприклад, обидві використовуються для обчислення оберненого елемента за модулем.

Як безпосередній наслідок, ми також отримуємо еквівалентність:

ananmodϕ(m)(modm)a^n \equiv a^{n \bmod \phi(m)} \pmod m

Це дозволяє обчислювати xnmodmx^n \bmod m для дуже великих nn, особливо якщо nn є результатом іншого обчислення, оскільки дає змогу обчислювати nn за модулем.

Теорія груп

ϕ(n)\phi(n) — це порядок мультиплікативної групи за модулем n (Z/nZ)×(\mathbb Z / n\mathbb Z)^\times, тобто групи оборотних елементів (елементів, що мають обернений за множенням). Елементи, що мають обернений за множенням, — це саме ті, що взаємно прості з nn.

Мультиплікативний порядок елемента aa за модулем nn, позначається ordn(a)\operatorname{ord}_n(a), — це найменше k>0k>0 таке, що ak1(modm)a^k \equiv 1 \pmod m. ordn(a)\operatorname{ord}_n(a) — це розмір підгрупи, породженої елементом aa, тож за теоремою Лагранжа мультиплікативний порядок будь-якого aa має ділити ϕ(n)\phi(n). Якщо мультиплікативний порядок aa дорівнює ϕ(n)\phi(n), тобто є найбільшим можливим, то aa є первісним коренем, і група за означенням є циклічною.

Узагальнення

Існує менш відома версія останньої еквівалентності, яка дозволяє ефективно обчислювати xnmodmx^n \bmod m для не взаємно простих xx і mm. Для довільних x,mx, m і nlog2mn \geq \log_2 m:

xnxϕ(m)+[nmodϕ(m)]modmx^{n}\equiv x^{\phi(m)+[n \bmod \phi(m)]} \mod m

Доведення:

Нехай p1,,ptp_1, \dots, p_t — спільні прості дільники xx і mm, а kik_i — їхні показники степеня в mm. За їх допомогою визначимо a=p1k1ptkta = p_1^{k_1} \dots p_t^{k_t}, що робить ma\frac{m}{a} взаємно простим з xx. І нехай kk — найменше число, для якого aa ділить xkx^k. За припущення nkn \ge k можемо записати:

xnmodm=xkaaxnkmodm=xka(axnkmodm)modm=xka(axnkmodama)modm=xkaa(xnkmodma)modm=xk(xnkmodma)modm\begin{align}x^n \bmod m &= \frac{x^k}{a}ax^{n-k}\bmod m \\ &= \frac{x^k}{a}\left(ax^{n-k}\bmod m\right) \bmod m \\ &= \frac{x^k}{a}\left(ax^{n-k}\bmod a \frac{m}{a}\right) \bmod m \\ &=\frac{x^k}{a} a \left(x^{n-k} \bmod \frac{m}{a}\right)\bmod m \\ &= x^k\left(x^{n-k} \bmod \frac{m}{a}\right)\bmod m \end{align}

Еквівалентність між третім і четвертим рядками випливає з того факту, що abmodac=a(bmodc)ab \bmod ac = a(b \bmod c). Дійсно, якщо b=cd+rb = cd + r з r<cr < c, то ab=acd+arab = acd + ar з ar<acar < ac.

Оскільки xx і ma\frac{m}{a} взаємно прості, ми можемо застосувати теорему Ейлера й отримати ефективну (оскільки kk дуже мале; насправді klog2mk \le \log_2 m) формулу:

xnmodm=xk(xnkmodϕ(ma)modma)modm.x^n \bmod m = x^k\left(x^{n-k \bmod \phi(\frac{m}{a})} \bmod \frac{m}{a}\right)\bmod m.

Цю формулу важко застосувати, але ми можемо скористатися нею для аналізу поведінки xnmodmx^n \bmod m. Можна побачити, що послідовність степенів (x1modm,x2modm,x3modm,)(x^1 \bmod m, x^2 \bmod m, x^3 \bmod m, \dots) входить у цикл довжини ϕ(ma)\phi\left(\frac{m}{a}\right) після перших kk (або менше) елементів. ϕ(ma)\phi\left(\frac{m}{a}\right) ділить ϕ(m)\phi(m) (оскільки aa і ma\frac{m}{a} взаємно прості, маємо ϕ(a)ϕ(ma)=ϕ(m)\phi(a) \cdot \phi\left(\frac{m}{a}\right) = \phi(m)), тому ми також можемо сказати, що період має довжину ϕ(m)\phi(m). А оскільки ϕ(m)log2mk\phi(m) \ge \log_2 m \ge k, ми можемо зробити висновок про бажану, значно простішу формулу:

xnxϕ(m)x(nϕ(m))modϕ(m)modmxϕ(m)+[nmodϕ(m)]modm.x^n \equiv x^{\phi(m)} x^{(n - \phi(m)) \bmod \phi(m)} \bmod m \equiv x^{\phi(m)+[n \bmod \phi(m)]} \mod m.

Задачі для практики

Відеоматеріали