Skip to Content

Función φ de Euler

La función φ de Euler, también conocida como función phi ϕ(n)\phi (n), cuenta la cantidad de enteros entre 1 y nn inclusive que son coprimos con nn. Dos números son coprimos si su máximo común divisor es igual a 11 (se considera que 11 es coprimo con cualquier número).

Estos son los valores de ϕ(n)\phi(n) para los primeros enteros positivos:

n123456789101112131415161718192021ϕ(n)11224264641041268816618812namp;1amp;2amp;3amp;4amp;5amp;6amp;7amp;8amp;9amp;10amp;11amp;12amp;13amp;14amp;15amp;16amp;17amp;18amp;19amp;20amp;21ϕ(n)amp;1amp;1amp;2amp;2amp;4amp;2amp;6amp;4amp;6amp;4amp;10amp;4amp;12amp;6amp;8amp;8amp;16amp;6amp;18amp;8amp;12\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}

Propiedades

Las siguientes propiedades de la función φ de Euler bastan para calcularla para cualquier número:

  • Si pp es un número primo, entonces gcd(p,q)=1\gcd(p, q) = 1 para todo 1q<p1 \le q < p. Por lo tanto tenemos:

ϕ(p)=p1.\phi (p) = p - 1.

  • Si pp es un número primo y k1k \ge 1, entonces hay exactamente pk/pp^k / p números entre 11 y pkp^k que son divisibles por pp. Lo que nos da:

ϕ(pk)=pkpk1.\phi(p^k) = p^k - p^{k-1}.

  • Si aa y bb son coprimos, entonces:

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

    Esta relación no es trivial de ver. Se sigue del Teorema Chino del Resto. El Teorema Chino del Resto garantiza que, para cada 0x<a0 \le x < a y cada 0y<b0 \le y < b, existe un único 0z<ab0 \le z < a b con zx(moda)z \equiv x \pmod{a} y zy(modb)z \equiv y \pmod{b}. No es difícil mostrar que zz es coprimo con aba b si y solo si xx es coprimo con aa e yy es coprimo con bb. Por lo tanto, la cantidad de enteros coprimos con aba b es igual al producto de las cantidades correspondientes a aa y a bb.

  • En general, cuando aa y bb no son coprimos, la ecuación

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

    con d=gcd(a,b)d = \gcd(a, b) se cumple.

Así, usando las primeras tres propiedades, podemos calcular ϕ(n)\phi(n) a través de la factorización de nn (descomposición de nn en un producto de sus factores primos). Si n=p1a1p2a2pkakn = {p_1}^{a_1} \cdot {p_2}^{a_2} \cdots {p_k}^{a_k}, donde pip_i son factores primos de nn,

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

Implementación

Esta es una implementación que usa factorización en 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; }

Función φ de Euler de 11 a nn en O(nloglogn)O(n \log\log{n}) { #etf_1_to_n data-toc-label=“Función φ de Euler de 1 a n en <script type=“math/tex”>O(n log log n)” }

Si necesitamos ϕ\phi de todos los números entre 11 y nn, entonces factorizar los nn números no es eficiente. Podemos usar la misma idea que la Criba de Eratóstenes. Sigue basándose en la propiedad mostrada más arriba, pero en lugar de actualizar el resultado temporal para cada factor primo de cada número, encontramos todos los números primos y, para cada uno, actualizamos los resultados temporales de todos los números que son divisibles por ese número primo.

Como este enfoque es básicamente idéntico a la Criba de Eratóstenes, la complejidad también será la misma: 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; } } }

Calcular φ de LL a RR usando la criba segmentada { data-toc-label=“Calcular φ de L a R usando la criba segmentada” }

Si necesitamos ϕ\phi de todos los números entre LL y RR, podemos usar el enfoque de la criba segmentada.

El algoritmo primero precalcula todos los primos hasta R\sqrt{R} usando una criba lineal en tiempo y espacio O(R)O(\sqrt{R}). Para cada número del rango [L,R][L, R], aplica después la fórmula de ϕ\phi basada en la factorización iterando sobre estos primos. Mantenemos un arreglo de restos para rastrear la parte no factorizada de cada número. Si un resto sigue siendo mayor que 1 después de procesar todos los primos chicos, indica un factor primo grande mayor que R\sqrt{R}, que se trata en una pasada final. La complejidad total del cálculo sobre el rango es 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 y 1 no son compuestos (ni primos) 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; } // Para obtener el valor de phi(x) con L <= x <= R, usar 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]; } }

Propiedad de la suma de divisores { #divsum}

Esta propiedad interesante la estableció Gauss:

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

Aquí la suma recorre todos los divisores positivos dd de nn.

Por ejemplo, los divisores de 10 son 1, 2, 5 y 10. De ahí ϕ(1)+ϕ(2)+ϕ(5)+ϕ(10)=1+1+4+4=10\phi{(1)} + \phi{(2)} + \phi{(5)} + \phi{(10)} = 1 + 1 + 4 + 4 = 10.

Calcular φ de 1 a nn usando la propiedad de la suma de divisores { data-toc-label=“Calcular φ de 1 a n usando la propiedad de la suma de divisores” }

La propiedad de la suma de divisores también nos permite calcular ϕ\phi de todos los números entre 1 y nn. Esta implementación es un poco más simple que la implementación anterior basada en la Criba de Eratóstenes; sin embargo, también tiene una complejidad un poco peor: 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]; }

Aplicación en el teorema de Euler { #application }

La propiedad más famosa e importante de la función φ de Euler se expresa en el teorema de Euler:

aϕ(m)1(modm)if a and m are relatively prime.a^{\phi(m)} \equiv 1 \pmod m \quad \text{if } a \text{ and } m \text{ are relatively prime.}

En el caso particular en que mm es primo, el teorema de Euler se convierte en el pequeño teorema de Fermat:

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

El teorema de Euler y la función φ de Euler aparecen con bastante frecuencia en aplicaciones prácticas; por ejemplo, ambos se usan para calcular el inverso multiplicativo modular.

Como consecuencia inmediata también obtenemos la equivalencia:

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

Esto permite calcular xnmodmx^n \bmod m para nn muy grandes, especialmente si nn es el resultado de otro cálculo, ya que permite calcular nn bajo un módulo.

Teoría de grupos

ϕ(n)\phi(n) es el orden del grupo multiplicativo módulo n  (Z/nZ)×(\mathbb Z / n\mathbb Z)^\times, es decir, el grupo de unidades (elementos con inversos multiplicativos). Los elementos con inversos multiplicativos son precisamente los coprimos con nn.

El orden multiplicativo  de un elemento aa módulo nn, denotado ordn(a)\operatorname{ord}_n(a), es el menor k>0k>0 tal que ak1(modn)a^k \equiv 1 \pmod n. ordn(a)\operatorname{ord}_n(a) es el tamaño del subgrupo generado por aa, así que, por el teorema de Lagrange, el orden multiplicativo de cualquier aa debe dividir a ϕ(n)\phi(n). Si el orden multiplicativo de aa es ϕ(n)\phi(n), el mayor posible, entonces aa es una raíz primitiva y el grupo es cíclico por definición.

Generalización

Hay una versión menos conocida de la última equivalencia, que permite calcular xnmodmx^n \bmod m de forma eficiente cuando xx y mm no son coprimos. Para x,mx, m arbitrarios y nlog2mn \geq \log_2 m:

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

Demostración:

Sean p1,,ptp_1, \dots, p_t los divisores primos comunes de xx y mm, y kik_i sus exponentes en mm. Con ellos definimos a=p1k1ptkta = p_1^{k_1} \dots p_t^{k_t}, lo que hace que ma\frac{m}{a} sea coprimo con xx. Y sea kk el menor número tal que aa divide a xkx^k. Asumiendo nkn \ge k, podemos escribir:

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

La equivalencia entre la tercera y la cuarta línea se sigue del hecho de que abmodac=a(bmodc)ab \bmod ac = a(b \bmod c). En efecto, si b=cd+rb = cd + r con r<cr < c, entonces ab=acd+arab = acd + ar con ar<acar < ac.

Como xx y ma\frac{m}{a} son coprimos, podemos aplicar el teorema de Euler y obtener la fórmula eficiente (ya que kk es muy chico; de hecho 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.

Esta fórmula es difícil de aplicar, pero podemos usarla para analizar el comportamiento de xnmodmx^n \bmod m. Podemos ver que la sucesión de potencias (x1modm,x2modm,x3modm,)(x^1 \bmod m, x^2 \bmod m, x^3 \bmod m, \dots) entra en un ciclo de longitud ϕ(ma)\phi\left(\frac{m}{a}\right) después de los primeros kk (o menos) elementos. ϕ(ma)\phi\left(\frac{m}{a}\right) divide a ϕ(m)\phi(m) (porque aa y ma\frac{m}{a} son coprimos tenemos ϕ(a)ϕ(ma)=ϕ(m)\phi(a) \cdot \phi\left(\frac{m}{a}\right) = \phi(m)), por lo tanto también podemos decir que el período tiene longitud ϕ(m)\phi(m). Y como ϕ(m)log2mk\phi(m) \ge \log_2 m \ge k, podemos concluir la fórmula deseada, mucho más simple:

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.

Problemas de práctica