Introducción
La teoría de números está llena de maravillas, en forma de conexiones inesperadas. Aquí hay uno de ellos.
Dos enteros son co-prime si no tienen factores en común distinto de 1. Dado un número N , tenga en cuenta todos los números enteros de 1 a N . Dibuje dos de estos enteros al azar (todos los enteros tienen la misma probabilidad de ser seleccionados en cada sorteo; los sorteos son independientes y con reemplazo). Supongamos que p denota la probabilidad de que los dos enteros seleccionados sean coprimos. Entonces p tiende a 6 / π 2 ≈ 0.6079 ... como N tiende a infinito.
El reto
El propósito de este reto es calcular p como una función de N .
Como ejemplo, considere N = 4. Hay 16 pares posibles obtenidos de los enteros 1,2,3,4. 11 de esos pares son primos, a saber (1,1), (1,2), (1,3), (1,4), (2,1), (3,1), (4,1 ), (2,3), (3,2), (3,4), (4,3). Por lo tanto, p es 16/11 = 0.6875 para N = 4.
El valor exacto de p debe calcularse con al menos cuatro decimales. Esto implica que el cálculo tiene que ser determinista (a diferencia de Monte Carlo). Pero no es necesario que sea una enumeración directa de todos los pares como se indicó anteriormente; Se puede utilizar cualquier método.
Se pueden usar argumentos de función o stdin / stdout. Si se muestra la salida, se pueden omitir los ceros finales. Entonces, por ejemplo, 0.6300
se puede mostrar como 0.63
. Debe mostrarse como un número decimal, no como una fracción ( 63/100
no se permite mostrar la cadena ).
El criterio ganador es la menor cantidad de bytes. No hay restricciones en el uso de funciones integradas.
Casos de prueba
Entrada / salida (solo cuatro decimales son obligatorios, como se indicó anteriormente):
1 / 1.000000000000000
2 / 0.750000000000000
4 / 0.687500000000000
10 / 0.630000000000000
100 / 0.608700000000000
1000 / 0.608383000000000
fuente
63/100
es un literal válido, utilizable en computación. (Langs estoy hablando de: Factor , Racket )Respuestas:
Jalea ,
128 bytesPruébalo en línea!
El siguiente código binario funciona con esta versión del intérprete Jelly .
Idea
Claramente, el número de pares (j, k) tal que j ≤ k y j y k son primos iguales es igual al número de pares (k, j) que satisfacen las mismas condiciones. Además, si j = k , j = 1 = k .
Por lo tanto, para contar el número de pares de co-prime con coordenadas entre 1 y n , es suficiente para calcular la cantidad m de pares (j, k) que tal j ≤ k , entonces compute 2m - 1 .
Por último, ya que la función totient de Euler φ (k) se obtienen los números enteros entre números entre 1 y k que son co-prime a k , podemos calcular m como φ (1) + ... + φ (n) .
Código
fuente
Mathematica
4342 bytesEncontré que los puntos de celosía visibles desde el origen , de los cuales se toma la siguiente imagen, son útiles para replantear el problema a través de las siguientes preguntas con respecto a una región cuadrada dada de la red de unidades:
Ejemplos
Los ceros finales se omiten.
Sincronización
El tiempo, en segundos, precede a la respuesta.
fuente
Pyth -
1311 bytesTest Suite .
fuente
Mathematica,
4232 bytesFunción anónima, utiliza fuerza bruta simple. El último caso se ejecuta en aproximadamente .37 segundos en mi máquina. Explicación:
fuente
Count[Array[GCD,{#, #}],1,2]/#^2.&
Sé mi invitado.Dyalog APL, 15 bytes
Muy claro. Es un tren de funciones monádicas. Iota son los números del 1 a la entrada, por lo que tomamos el producto externo por mcd, luego contamos la proporción de unos.
fuente
Octava,
4947 bytesSimplemente calculando el
gcd
de todos los pares y contando.fuente
kron
! ¡Buena idea!meshgrid
, ¡pero luego noté que podía hacer lo mismo conkron
inline! (-> función anónima)JavaScript (ES6), 88 bytes
Explicación
Prueba
Toma un tiempo para
>100
valores grandes ( ) den
.Mostrar fragmento de código
fuente
En serio, 15 bytes
Hex Dump:
Pruébalo en línea
No me voy a molestar en explicarlo, ya que literalmente usa exactamente el mismo algoritmo que la solución Jelly de Dennis (aunque lo deduje de forma independiente).
fuente
J,
1917 bytesUso:
Explicación:
La solución de Dennis da una buena explicación de cómo podemos usar la función totient.
Pruébelo en línea aquí.
fuente
Mathematica, 35 bytes
Implementa el algoritmo de @ Dennis.
Calcule la suma del totient (función phi de Euler) en el rango de 1 al valor de entrada. Multiplique por coma flotante dos (con cuatro dígitos de precisión) y reste uno. (Se puede retener más precisión usando en su lugar "
2
" y "1`4
".) Este es el número total de pares coprimos, así que divídalo por el cuadrado de la entrada para obtener la fracción deseada. Debido a que los dos son un número aproximado, también lo es el resultado.Pruebas (con datos de tiempo en la columna de la izquierda ya que al menos uno de nosotros piensa que es interesante), con la función asignada para
f
que la línea de prueba se lea más fácilmente .:Editar: Mostrar la extensión del rango de entradas (intercambiando la precisión a una en lugar de las dos porque de lo contrario los resultados se vuelven bastante monótonos) y desafiando a otros a hacer lo mismo ...
RepeatedTiming[]
realiza el cálculo varias veces y toma un promedio de las veces, intentando ignorar los cachés fríos y otros efectos que causan valores atípicos de tiempo. El límite asintótico esentonces, para argumentos> 10 ^ 4, podemos simplemente devolver "0.6079" y cumplir con los requisitos de precisión y exactitud especificados.
fuente
Julia, 95 bytes
Solo el enfoque directo por ahora; Buscaré soluciones más cortas / más elegantes pronto. Esta es una función anónima que acepta un entero y devuelve un flotante. Para llamarlo, asígnelo a una variable.
Sin golf:
fuente
collect
un objeto perezoso para tomarlolength
.length
no tiene un método definido, que es el caso aquí para el iterador de combinaciones filtradas. Del mismo modoendof
, no funcionaría porque no hay un método para ese tipogetindex
.range
no devuelve el mismo tipo de objeto quecombinations
. Este último devuelve un iterador sobre combinaciones que es un tipo separado sin unlength
método definido . Ver aquí . (También:
se prefiere la sintaxis sobre larange
construcción de rangos;))Sabio, 55 bytes
Gracias a Sage que computa todo simbólicamente, los problemas de épsilon de máquina y punto flotante no surgen. La compensación es, para seguir la regla del formato de salida,
n()
se necesita una llamada adicional a (la función de aproximación decimal).Pruébalo en línea
fuente
MATL ,
2017 bytesEsto usa la versión actual (5.0.0) del idioma.
Enfoque basado en la respuesta de @ flawr .
Editar (28 de abril de 2015) : ¡ Pruébelo en línea! Después de que se publicó esta respuesta,
Y)
se cambió el nombre de la función aX:
; El enlace incluye ese cambio.Ejemplo
Explicación
Respuesta anterior: 20 bytes
Explicación
fuente
PARI / GP , 25 bytes
Hacer que la función sea anónima ahorraría un byte, pero luego tendría que usar para
self
hacerla más costosa en general.fuente
Factor,
120113 bytesHe pasado clase jugando al golf y no puedo acortarlo.
Traducción de: Julia .
El ejemplo se ejecuta en los primeros 5 casos de prueba (un valor de 1000 hace que congele el editor, y no puedo molestarme en compilar un ejecutable en este momento):
fuente
Samau , 12 bytes
Descargo de responsabilidad: No estoy compitiendo porque actualicé el idioma después de que se publicó la pregunta.
Volcado hexadecimal (Samau utiliza la codificación CP737):
Usando el mismo algoritmo que la respuesta de Dennis en Jelly.
fuente
Python2 / Pypy, 178 bytes
El
x
archivo:Corriendo:
El código cuenta los pares co-prime dos
(n,m) for m<n
veces (c+=2
). Esto ignora(i,i) for i=1..n
cuál está bien, excepto por(1,1)
lo que se corrige inicializando el contador con1
(1.0
para prepararse para la división de flotación más adelante) para compensar.fuente