Introdução
A teoria dos números está cheia de maravilhas, na forma de conexões inesperadas. Aqui está um deles.
Dois inteiros são co-prime se eles não têm fatores em comum que não seja 1. Dado um número N , considere todos os inteiros de 1 a N . Desenhe dois números inteiros aleatoriamente (todos os números inteiros têm a mesma probabilidade de serem selecionados a cada sorteio; os sorteios são independentes e com substituição). Vamos p denotar a probabilidade de que os dois números inteiros selecionados sejam co-primos. Então p tende a 6 / π 2 ≈ 0,6079 ... como N tende ao infinito.
O desafio
O objectivo deste desafio é calcular p como uma função de N .
Como exemplo, considere N = 4. Existem 16 pares possíveis obtidos dos números inteiros 1,2,3,4. 11 desses pares são co-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). Assim, p é 11/16 = 0,6875 para N = 4.
O valor exato de p precisa ser calculado com pelo menos quatro casas decimais. Isso implica que o cálculo deve ser determinístico (em oposição a Monte Carlo). Mas não precisa ser uma enumeração direta de todos os pares como acima; qualquer método pode ser usado.
Argumentos de função ou stdin / stdout podem ser usados. Se exibir a saída, zeros à direita podem ser omitidos. Por exemplo, 0.6300
pode ser exibido como 0.63
. Ele deve ser exibido como um número decimal, não como uma fração (exibir a sequência 63/100
não é permitido).
O critério de vitória é o menor número de bytes. Não há restrições no uso de funções internas.
Casos de teste
Entrada / saída (apenas quatro casas decimais são obrigatórias, como indicado acima):
1 / 1.000000000000000
2 / 0.750000000000000
4 / 0.687500000000000
10 / 0.630000000000000
100 / 0.608700000000000
1000 / 0.608383000000000
fonte
63/100
é um literal válido, utilizável em computação. (Langs que estou falando: Fator , Racket )Respostas:
Gelatina ,
128 bytesExperimente online!
O código binário a seguir funciona com esta versão do interpretador Jelly .
Idéia
Claramente, o número de pares (j, k), de tal modo que j ≤ k e j e k são co-primo é igual ao número de pares (k, j) que satisfazem as mesmas condições. Além disso, se j = k , j = 1 = k .
Assim, para contar o número de pares co-primos com coordenadas entre 1 e n , basta calcular a quantidade m de pares (j, k) de modo que j ≤ k , depois computar 2m - 1 .
Finalmente, como a função totiente de Euler φ (k) produz o número inteiro entre 1 e k que são co-primos para k , podemos calcular m como φ (1) +… + φ (n) .
Código
fonte
Mathematica
4342 bytesEu achei os pontos de rede visíveis desde a origem , a partir dos quais a foto abaixo foi tirada, para ajudar a reformular o problema através das seguintes perguntas sobre uma determinada região quadrada da rede de unidades:
Exemplos
Zeros à direita são omitidos.
Cronometragem
O tempo, em segundos, precede a resposta.
fonte
Pitão -
1311 bytesConjunto de Teste .
fonte
Mathematica,
4232 bytesFunção anônima, usa força bruta simples. O último caso ocorre em cerca de 0,37 segundos na minha máquina. Explicação:
fonte
Count[Array[GCD,{#, #}],1,2]/#^2.&
Seja meu convidado.Dyalog APL, 15 bytes
Bem direto. É um trem monádico. Iota são os números de 1 a entrada, por isso pegamos o produto externo por mcd e depois contamos a proporção de um.
fonte
Oitava,
4947 bytesApenas calculando o
gcd
de todos os pares e contando.fonte
kron
! Boa ideia!meshgrid
, mas depois notei que podia fazer o mesmo com okron
inline! (-> função anônima)JavaScript (ES6), 88 bytes
Explicação
Teste
Demora um pouco para
>100
valores grandes ( ) den
.Mostrar snippet de código
fonte
Sério, 15 bytes
Hex Dump:
Experimente Online
Não vou me incomodar em explicá-lo, pois ele literalmente usa exatamente o mesmo algoritmo da solução Jelly de Dennis (embora eu o tenha derivado de forma independente).
fonte
J,
1917 bytesUso:
Explicação:
A solução de Dennis fornece uma boa explicação de como podemos usar a função totiente.
Experimente online aqui.
fonte
Mathematica, 35 bytes
Implementa o algoritmo de @ Dennis.
Calcule a soma do totiente (função phi de Euler) no intervalo de 1 ao valor de entrada. Multiplique pelo ponto flutuante dois (com quatro dígitos de precisão) e subtraia um. (É possível reter mais precisão usando "
2
" e "1`4
".) Este é o número total de pares de coprimes, portanto divida pelo quadrado da entrada para obter a fração desejada. Como os dois são um número aproximado, o mesmo ocorre com o resultado.Teste (com dados de temporização na coluna da esquerda, pois pelo menos um de nós acha isso interessante), com a função atribuída para
f
que a linha de teste seja mais facilmente lida .:Edit: Mostrando a extensão do intervalo de entradas (trocando a precisão por uma em vez das duas porque, caso contrário, os resultados ficam bastante monótonos) e desafiando outras pessoas a fazer o mesmo ...
RepeatedTiming[]
realiza o cálculo várias vezes e leva uma média dos tempos, tentando ignorar caches frios e outros efeitos, causando discrepâncias de tempo. O limite assintótico éportanto, para argumentos> 10 ^ 4, podemos retornar "0,6079" e atender aos requisitos de precisão e exatidão especificados.
fonte
Julia, 95 bytes
Apenas a abordagem direta por enquanto; Analisarei soluções mais curtas / elegantes em breve. Esta é uma função anônima que aceita um número inteiro e retorna um número flutuante. Para chamá-lo, atribua-o a uma variável.
Ungolfed:
fonte
collect
um objeto preguiçoso para pegá-lolength
.length
não há um método definido, como é o caso aqui para o iterador de combinações filtradas. Da mesma formaendof
, não funcionaria porque não há método para esse tipogetindex
.range
não retorna o mesmo tipo de objeto quecombinations
. O último retorna um iterador sobre combinações, que é um tipo separado, semlength
método definido . Veja aqui . (Também a:
sintaxe é preferido em relaçãorange
para a construção de intervalos;))Sábio, 55 bytes
Graças à Sage computando tudo simbolicamente, os problemas de epsilon e ponto flutuante da máquina não surgem. A compensação é que, para seguir a regra do formato de saída,
n()
é necessária uma chamada adicional para (a função de aproximação decimal).Experimente online
fonte
MATL ,
2017 bytesIsso usa a versão atual (5.0.0) do idioma.
Abordagem baseada na resposta de @ flawr .
Editar (28 de abril de 2015) : Experimente online! Depois que essa resposta foi postada, a função
Y)
foi renomeada paraX:
; o link inclui essa alteração.Exemplo
Explicação
Resposta antiga: 20 bytes
Explicação
fonte
PARI / GP , 25 bytes
Tornar a função anônima salvaria um byte, mas então eu teria que usá-
self
la, tornando-a mais cara em geral.fonte
Fator,
120113 bytesPassei aulas jogando golfe e não posso ficar mais curto.
Tradução de: Julia .
O exemplo é executado nos 5 primeiros casos de teste (um valor de 1000 faz com que congele o editor, e não posso me incomodar em compilar um executável agora):
fonte
Samau , 12 bytes
Isenção de responsabilidade: não competindo porque atualizei o idioma após a publicação da pergunta.
Dump hexadecimal (a Samau usa a codificação CP737):
Usando o mesmo algoritmo da resposta de Dennis no Jelly.
fonte
Python2 / Pypy, 178 bytes
O
x
arquivo:Corrida:
O código conta os pares co-prime duas
(n,m) for m<n
vezes (c+=2
). Isso ignora o(i,i) for i=1..n
que está ok, exceto(1,1)
, sendo assim corrigido inicializando o contador com1
(1.0
para preparar a divisão de flutuação posteriormente) para compensar.fonte