Fondo
La
función totient de Eulerφ(n)
se define como el número de números enteros menores o iguales a los n
que son relativamente primos n
, es decir, el número de valores posibles de x
in 0 < x <= n
para 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, int
en 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
EulerPhi
Respuestas:
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 (
Zd
gcd). Luego, encuentra qué elementos son iguales a 1 y suma el vector para obtener la respuesta.fuente
_Zp
para 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 n
a[1..n]
. En otras palabras, calcula elgcd
conn
de cada número de1
an
:A partir de aquí, la salida deseada es el número de
1
entradas, pero Haskell carece de unacount
función. La forma idiomáticafilter
de quedarse solo1
y tomar el resultadolength
, que es demasiado, es demasiado largo para jugar al golf.En cambio,
filter
se 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 un1
en cada coincidencia de1
, extrayendo efectivamente solo los1
's de la lista original. Invocarlosum
da su longitud.fuente
Python 2, 44 bytes
Menos golfizado:
Utiliza la fórmula que los clientes de Euler de los divisores
n
tienen una suma den
:El valor de
ϕ(n)
se puede calcular recursivamente comon
menos 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
+n
en+1
cada uno de losn
bucles, 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))
gcd
al 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
sum
función le permite asignarle una función antes de sumar, básicamente el equivalente a ejecutarmap
y 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 yor
se ejecuta el siguiente código .Recuerde que
m%k
producirá 1 si m es primo y 0 si no. Esto significa quex%k<m%k
rendirá Verdadero si y solo si k es un número primo yx es divisible por k .En este caso,
(n%k<m%k)*n/k
produce 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/k
produce 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 de1
a$n
y los canaliza en un bucle|%{...}
. Cada iteración que establece dos variables auxiliares$a
y$b
y luego ejecutar un GCDwhile
bucle. Cada iteración estamos comprobando que$b
aún es distinto de cero, y luego salvar$a%$b
a$b
y el valor anterior de$b
que$a
para el próximo ciclo. Luego acumulamos si$a
es igual a1
en nuestra variable de salida$o
. Una vez que se realiza el bucle for, colocamos$o
en la tubería y la salida es implícita.Como un ejemplo de cómo funciona el
while
ciclo, considere$n=20
y estamos en$_=8
. La primera verificación tiene$b=20
, así que entramos en el bucle. Primero calculamos$a%$b
o8%20 = 8
, que se establece$b
en al mismo tiempo que20
se establece en$a
. Verifique8=0
, y entramos en la segunda iteración. Luego calculamos20%8 = 4
y establecemos eso en$b
, luego establecemos$a
en8
. Verifique4=0
, y entramos en la tercera iteración. Calculamos8%4 = 0
y establecemos eso en$b
, luego establecemos$a
en4
. Comprueba0=0
y salimos del bucle, por lo que el GCD (8,20) es$a = 4
. Por!($a-1) = !(4-1) = !(3) = 0
lo tanto, así$o += 0
y 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
.-m
solució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,
5
se 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
ans
que se puede llamar con el enteron
como 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-1
lugar 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
==1
por<2
Lotes,
151145144 bytesEditar: guardado 4 bytes eliminando espacios innecesarios. Guardado 1 byte mediante el uso
+=
. Se guardó 1 byte al borrart
como+=
se interpretará como de0
todos modos. Guardado 1 byte gracias a @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.fuente