¿Cuál es el método para generar un tamiz para la función Euler Totient?

Es posible, pero poco probable, que esté preguntando sobre el cálculo del valor del paciente para un valor. En ese caso, queremos los factores del número, lo que generalmente significa que usamos un método rápido de factorización de propósito general (generalmente algoritmos múltiples; este es otro tema). La única forma en que un tamiz entra aquí es si está haciendo la división de prueba como su método de factorización y desea usar un tamiz para obtener primos. En ese momento, se ha desviado del tema principal y ha entrado en “¿cómo mejor tamizo los primos?”, Donde la respuesta es típicamente “Tamiz segmentado de Eratóstenes”, ya que sigue siendo el método más rápido en la práctica.

Sin embargo, especialmente si el Proyecto Euler es lo tuyo, estás preguntando cómo calcular todos los clientes en un rango, por ejemplo, todos phi (i) para 0 <i <n, entonces definitivamente estamos en el camino correcto. Podemos usar un tamiz para hacer esto mucho más rápido que calcular individualmente el total de cada valor. Cambia el problema de "para cada número entero menor que n, encuentre los divisores del número" a "para cada número primo, encuentre todos los múltiplos primos menores que n", que es mucho más rápido.

Hacer búsquedas en Google muestra una serie de implementaciones y debates. Por ejemplo, ¿Cómo calcular estas sumas de suma total eficientemente?

Para implementaciones, el tutorial en la función Totient de Euler para todos los números menores o iguales a n – GeeksforGeeks no es tan malo. El código es simple y no requiere espacio adicional. Mi código en danaj / Math-Prime-Util es aproximadamente 20 veces más rápido (phi (n) para todos n hasta 200 millones en 2.6s vs. 55s). Ambos son más rápidos que factorizar individualmente cada número hasta 200 millones (aunque a los 2.5 minutos no es horrible; sin embargo, la tasa de crecimiento es demoledora, ya que hasta 20M solo tomó 10 segundos).

La función Totient de Euler [math] \ phi (x) [/ math] se puede calcular encontrando factores primos de [math] x [/ math]. Si [math] x [/ math] puede factorizarse como [math] x = \ prod_ {i = 1} ^ n p_i ^ {n_i} [/ math] entonces podemos escribir [math] \ phi (x) = \ prod_ {i = 1} ^ n \ phi \ left (p_i ^ {n_i} \ right) [/ math]. Y la función totient para una potencia principal es muy fácil, por lo que la fórmula final (ver Función Totient) se convierte en

[matemáticas] \ phi (x) = x \ prod_ {i = 1} ^ n (1-1 / p) [/ matemáticas]

Entonces, lo que debe hacer es encontrar los factores primos de [matemáticas] x [/ matemáticas]. El resto es fácil. Para factorizar un número hay varias técnicas, una de ellas es usar un tamiz para generar números primos.

Puede buscar Seive of Eratosthenes (para un método antiguo pero fácil de implementar) o Sieve of Atkin (para un método rápido moderno y un poco más complejo).

Puede leer acerca de la factorización prima, para la cual los mejores métodos de hoy también son métodos de tamizado (Tamiz de campo de número general), pero en una configuración más abstracta.