Fondo
La
función totient de Eulerφ(n) se define como el número de números enteros menores o iguales a los nque son relativamente primos n, es decir, el número de valores posibles de xin 0 < x <= npara los cuales
gcd(n, x) == 1. Hemos tenido
un
poco totient - relacionados retos
antes, pero nunca uno que se acaba de calcularlo.
El mapeo de la función totient sobre los números enteros es OEIS A000010 .
Reto
Dado un número entero n > 0, calcular φ(n). Puede recibir información a través de argumentos de línea de comandos, entrada estándar, argumentos de función o cualquier otra cosa razonable. Puede dar salida a través de salida estándar, valores de retorno o cualquier otra cosa razonable. Las funciones anónimas son aceptables. Puede suponer que la entrada no desbordará su método natural de almacenamiento de enteros, por ejemplo, inten C, pero debe admitir entradas de hasta 255.
Si su lenguaje tiene una función totient incorporada, no puede usarla.
Ejemplos
φ(1) => 1
φ(2) => 1
φ(3) => 2
φ(8) => 4
φ(9) => 6
φ(26) => 12
φ(44) => 20
φ(105) => 48
La respuesta más corta en bytes gana. Si su idioma usa una codificación que no sea UTF-8, mencione en su respuesta.
fuente

EulerPhiRespuestas:
Mathematica,
2722 bytesUna función sin nombre que toma y devuelve un entero.
No hay mucho que explicar aquí, excepto que
@es la notación de prefijo para las llamadas a funciones y~...~la notación de infijo (asociativo a la izquierda), por lo que lo anterior es lo mismo que:fuente
MATL, 7 bytes
Puedes TryItOnline . La idea más simple es hacer un vector de 1 a N y tomar mcd de cada elemento con N (
Zdgcd). Luego, encuentra qué elementos son iguales a 1 y suma el vector para obtener la respuesta.fuente
_Zppara aquellos que se preguntan.J, 9 bytes
Esto se basa en el ensayo de Jsoftware sobre funciones totient.
Dado n = p 1 e 1 ∙ p 2 e 2 ∙∙∙ p k e k donde p k es un factor primo de n , la función totient φ ( n ) = φ ( p 1 e 1 ) ∙ φ ( p 2 e 2 ) ∙∙∙ φ ( p k e k ) = ( p 1 - 1) p 1 e 1 - 1 ∙ ( p 2 - 1) p 2e 2 - 1 ∙∙∙ ( p k - 1) p k e k - 1 .
Uso
Explicación
fuente
[:*/@({.(^-(^<:)){:)2&p:necesita 24 bytes, incluso usar el incorporado para obtener los primos y sus exponentes. O tal vez hay un camino más corto y no lo veo.Jalea, 4 bytes
Pruébalo en línea!
Explicación
Con incorporado
Pruébalo en línea!
Explicación
fuente
Haskell, 28 bytes
Utiliza la coincidencia de patrones de constantes de Haskell . Los trucos aquí son bastante estándar para el golf, pero lo explicaré a una audiencia general.
La expresión se
gcd n<$>[1..n]asignagcd na[1..n]. En otras palabras, calcula elgcdconnde cada número de1an:A partir de aquí, la salida deseada es el número de
1entradas, pero Haskell carece de unacountfunción. La forma idiomáticafilterde quedarse solo1y tomar el resultadolength, que es demasiado, es demasiado largo para jugar al golf.En cambio,
filterse simula mediante una comprensión de la lista[1|1<-l]con la lista resultantel. Por lo general, las comprensiones de listas enlazan valores en variables como en[x*x|x<-l], pero Haskell permite comparar un patrón, en este caso la constante1.Entonces,
[1|1<-l]generando un1en cada coincidencia de1, extrayendo efectivamente solo los1's de la lista original. Invocarlosumda su longitud.fuente
Python 2, 44 bytes
Menos golfizado:
Utiliza la fórmula que los clientes de Euler de los divisores
ntienen una suma den:El valor de
ϕ(n)se puede calcular recursivamente comonmenos la suma sobre divisores no triviales. Efectivamente, esto está haciendo una inversión de Möbius en la función de identidad. Utilicé el mismo método en un golf para calcular la función de Möbius .Gracias a Dennis por guardar 1 byte con un mejor caso base, distribuyendo el valor inicial de
+nen+1cada uno de losnbucles, hecho como-~.fuente
Pyke, 5 bytes
Pruébalo aquí!
fuente
J, 11 bytes
Uso
donde
>>es STDIN y<<es STDOUT.Explicación
fuente
Python> = 3.5,
766458 bytesGracias a LeakyNun por jugar 12 bytes (!).
Gracias a Sp3000 por jugar golf en 6 bytes.
Me encanta lo legible que es Python. Esto tiene sentido, incluso a través del golf.
fuente
lambda n:sum(gcd(n,x)<2for x in range(n))gcdal módulo matemático! No lo sabia.Regex (ECMAScript), 131 bytes
Al menos -12 bytes gracias a Deadcode (en el chat)
Pruébalo en línea!
La salida es la duración del partido.
Las expresiones regulares ECMAScript hacen que sea extremadamente difícil contar algo. Cualquier reflujo definido fuera de un bucle será constante durante el bucle, cualquier reflujo definido dentro de un bucle se restablecerá durante el bucle. Por lo tanto, la única forma de llevar el estado a través de iteraciones de bucle es usar la posición de coincidencia actual. Es un número entero único, y solo puede disminuir (bueno, la posición aumenta, pero la longitud de la cola disminuye, y eso es lo que podemos hacer con las matemáticas).
Dadas esas restricciones, simplemente contar los números coprimos parece imposible. En cambio, usamos la fórmula de Euler para calcular el totient.
Así es como se ve en pseudocódigo:
Hay dos cosas dudosas sobre esto.
Primero, no guardamos la entrada, solo el producto actual, entonces, ¿cómo podemos llegar a los factores primos de la entrada? El truco es que (N - (N / P)) tiene los mismos factores primos> P que N. Puede obtener nuevos factores primos <P, pero los ignoramos de todos modos. Tenga en cuenta que esto solo funciona porque iteramos sobre los factores primos de menor a mayor, de lo contrario fallaría.
En segundo lugar, tenemos que recordar dos números en las iteraciones de bucle (P y N, Z no cuenta ya que es constante), ¡y acabo de decir que era imposible! Afortunadamente, podemos mezclar esos dos números en uno solo. Tenga en cuenta que, al comienzo del ciclo, N siempre será un múltiplo de Z, mientras que P siempre será menor que Z. Por lo tanto, podemos recordar N + P y extraer P con un módulo.
Aquí está el pseudocódigo un poco más detallado:
Y aquí está la expresión regular comentada:
Y como un bono ...
Regex (ECMAScript 2018, número de coincidencias), 23 bytes
Pruébalo en línea!
La salida es el número de coincidencias. ECMAScript 2018 presenta una retrospectiva de longitud variable (evaluada de derecha a izquierda), que hace posible contar simplemente todos los números coprimos con la entrada.
Resulta que este es independientemente el mismo método utilizado por la solución Retina de Leaky Nun , y la expresión regular es incluso de la misma longitud ( e intercambiable ). Lo dejo aquí porque puede ser interesante que este método funcione en ECMAScript 2018 (y no solo .NET).
fuente
Perl 6 ,
26 2422 bytesExplicación:
Ejemplo:
fuente
Julia, 25 bytes
Es simple: la
sumfunción le permite asignarle una función antes de sumar, básicamente el equivalente a ejecutarmapy luegosum. Esto cuenta directamente el número de números primos relativamente menores quen.fuente
Python 2, 57 bytes
Pruébalo en Ideone .
Fondo
Por la fórmula del producto de Euler ,
donde φ denota la función totient de Euler y p varía solo sobre los números primos.
Para identificar números primos, usamos un corolario del teorema de Wilson :
Cómo funciona
En todo momento, la variable m será igual al cuadrado del factorial de k - 1 . De hecho, hemos llamado defecto argumentos para k = 1 y m = 0! 2 = 1 .
Mientras k ≤ n , se
n*(k>n)evalúa a 0 yorse ejecuta el siguiente código .Recuerde que
m%kproducirá 1 si m es primo y 0 si no. Esto significa quex%k<m%krendirá Verdadero si y solo si k es un número primo yx es divisible por k .En este caso,
(n%k<m%k)*n/kproduce n / k , y restarlo de n reemplaza su valor anterior con n (1 - 1 / k) , como en la fórmula del producto de Euler. De lo contrario,(n%k<m%k)*n/kproduce 0 y n se mantiene sin cambios.Después de calcular lo anterior, incrementamos k y multiplicamos m por el valor "antiguo" de k 2 , manteniendo así la relación deseada entre k y m , luego llamamos f recursivamente con los argumentos actualizados.
Una vez que k excede n , se
n*(k>n)evalúa como n , que es devuelto por la función.fuente
Ruby, 32 bytes
una lambda que toma un número entero n, y devuelve los recuentos de cuántos enteros en el rango (1..n) son coprimos con n.
fuente
Brachylog , 25 bytes
Explicación
Brachylog todavía no tiene un GCD incorporado, por lo que verificamos que los dos números no tengan factores primos en común.
Predicado principal:
Predicado 1:
fuente
Pyth, 6 bytes
Pruébalo en línea!
Pruébalo en línea!
Explicación
fuente
PowerShell v2 +, 72 bytes
PowerShell no tiene una función GCD disponible, así que tuve que rodar la mía.
Esto toma la entrada
$n, luego varía de1a$ny los canaliza en un bucle|%{...}. Cada iteración que establece dos variables auxiliares$ay$by luego ejecutar un GCDwhilebucle. Cada iteración estamos comprobando que$baún es distinto de cero, y luego salvar$a%$ba$by el valor anterior de$bque$apara el próximo ciclo. Luego acumulamos si$aes igual a1en nuestra variable de salida$o. Una vez que se realiza el bucle for, colocamos$oen la tubería y la salida es implícita.Como un ejemplo de cómo funciona el
whileciclo, considere$n=20y estamos en$_=8. La primera verificación tiene$b=20, así que entramos en el bucle. Primero calculamos$a%$bo8%20 = 8, que se establece$ben al mismo tiempo que20se establece en$a. Verifique8=0, y entramos en la segunda iteración. Luego calculamos20%8 = 4y establecemos eso en$b, luego establecemos$aen8. Verifique4=0, y entramos en la tercera iteración. Calculamos8%4 = 0y establecemos eso en$b, luego establecemos$aen4. Comprueba0=0y salimos del bucle, por lo que el GCD (8,20) es$a = 4. Por!($a-1) = !(4-1) = !(3) = 0lo tanto, así$o += 0y no contamos ese.fuente
Factor, 50 bytes
Hace un rango ( iota ) n , y curry n en una función que obtiene mcd xn para todos los valores de 0 <= x <= n , comprueba si el resultado es 1 . Filtrar el rango original para determinar si el resultado de gcd xn fue 1 , y tome su longitud .
fuente
[ dup iota swap '[ _ gcd nip 1 = ] map sum ]ahorra 6 bytes (creo que no tengo mucha experiencia con Factor).t/f(símbolos) en Factor, por lo que la única forma de implementarlo sería con[ dup iota swap '[ _ gcd nip 1 = 1 0 ? ] map sum ], que tiene la misma longitud exacta que la solución actual.TYPED:en código de factor real : PJapt
-mx,75 bytesEjecútalo en línea
-2 bytes gracias a Shaggy
fuente
-mx.-msolución pero me olvidé-x. ¡Gracias!Retina,
3629 bytes7 bytes gracias a Martin Ender.
Pruébalo en línea!
Explicación
Hay dos etapas (comandos).
Primera etapa
Es una simple sustitución de expresiones regulares, que convierte la entrada a esa cantidad.
Por ejemplo,
5se convertiría a11111.Segunda etapa
Esta expresión regular intenta hacer coincidir las posiciones que satisfacen la condición (primo con entrada) y luego devuelve el número de coincidencias.
fuente
Lisp común, 58 bytes
Este es un bucle simple que cuenta 1 hasta el n dado e incrementa la suma si gcd = 1. Uso el nombre de la función o ya que t es el verdadero valor booleano. No es el más corto, sino bastante simple.
fuente
MATLAB / Octave, 21 bytes
Crea una función anónima llamada
ansque se puede llamar con el enteroncomo la única entrada:ans(n)Demo en línea
fuente
Python 2 , 44 bytes
Esto utiliza el mismo método para identificar coprimes como mi respuesta a "Coprimes hasta N" .
Pruébalo en línea!
fuente
n-1lugar de1, lo que hace que funcionen==1.JavaScript (ES6), 53 bytes
Pruébalo en línea!
fuente
En realidad, 11 bytes
Pruébalo en línea!
Explicación
Con incorporado
Pruébalo en línea!
fuente
;╗R`╜g1=`MΣpara el mismo recuento de bytesJavaScript (ES6), 67 bytes
fuente
05AB1E, 7 bytes
Explicado
Pruébalo en línea
fuente
L€¿1¢;Lʒ¿}g;L€¿ΘO.APL, 7 bytes
Este es un tren de funciones monádicas que toma un número entero a la derecha. El enfoque aquí es obvio: suma (
+/) el número de veces que el MCD de la entrada y los números del 1 a la entrada (⊢∨⍳) es igual a 1 (1=).Pruébalo aquí
fuente
Haskell,
3130 bytes1 byte guardado, gracias a @Damien.
Selecciona valores con gcd = 1, asigna cada uno a 1, luego toma la suma.
fuente
==1por<2Lotes,
151145144 bytesEditar: guardado 4 bytes eliminando espacios innecesarios. Guardado 1 byte mediante el uso
+=. Se guardó 1 byte al borrartcomo+=se interpretará como de0todos modos. Guardado 1 byte gracias a @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.fuente