A constante de Brun é o valor para o qual a soma dos recíprocos dos pares primos gêmeos ( 1/p
e 1/(p+2)
onde p
e p+2
são ambos primos) converge. É aproximadamente 1.902160583104
.
Dado um número inteiro positivo N
, aproxime a constante de Brun somando os recíprocos dos pares primos gêmeos, em que ambos os números primos no par são menores que N
e produzam a aproximação.
Regras
N
será um número inteiro positivo dentro do intervalo representável para o seu idioma.- A saída deve ser a mais precisa possível do valor real, dentro dos limites da implementação de ponto flutuante do seu idioma, ignorando quaisquer problemas em potencial devido a imprecisões aritméticas de ponto flutuante. Se seu idioma é capaz de aritmética de precisão arbitrária, deve ser pelo menos tão preciso quanto a aritmética de precisão dupla IEEE 754.
- Como alternativa, uma fração exata pode ser impressa em qualquer formato consistente e inequívoco.
- Se um primo aparecer em vários pares primos gêmeos (por exemplo
5
, parte de ambos(3, 5)
e(5, 7)
), seu recíproco contribuirá para a soma de cada vez.
Casos de teste
2 -> 0
6 -> 0.5333333333333333
10 -> 0.8761904761904762
13 -> 0.8761904761904762
100 -> 1.3309903657190867
620 -> 1.4999706034568274
100000 -> 1.67279958482774
Respostas:
Python 3 ,
787775706862 bytesObrigado ao @xnor por jogar
24 bytes e abrir caminho para mais 4!Experimente online!
fundo
Lembre-se de que o teorema de Wilson afirma que, para todos os números inteiros k> 1 ,
onde um ≡ b (d mod) meios que a - b é divisível por d , isto é, um e b têm o mesmo resíduo, quando dividido por d .
Nos teoremas de Wilson para duplo , hiper, sub e super fatorial , os autores provam generalizações para fatoriais duplos, nos quais essa resposta se baseia. O fatorial duplo de um número inteiro k ≥ 0 é definido por
O teorema 4 do artigo mencionado acima afirma o seguinte.
Elevando ambos os lados das congruências para a quarta potência, deduzimos que
para todos os números primos ímpares p . Desde 1 !! = 1 , a equivalência também vale para p = 2 .
Agora, fazer o mesmo com o teorema de Wilson revela que
Desde a
segue que
sempre que p é primo.
Agora, seja k um número inteiro ímpar, positivo e composto. Por definição, existem inteiros a, b> 1 tais que k = ab .
Como k é ímpar, também são a e b . Assim, ambos ocorrem na sequência 1, 3,…, k - 2 e
onde | indica divisibilidade.
Resumindo, para todos os números ímpares k> 1
onde p (k) = 1 se k é primo ep (k) = 0 se k é composto.
Como funciona
Quando a função f é chamado com um único argumento, k , m , e j são inicializados como 3 , 1 e 0 .
Observe que ((k - 2) !!) 4 = 1 !! 4 = 1 = m . De fato, a igualdade m = ((k - 2) !!) 4 será mantida o tempo todo. j é um ponto flutuante e sempre será igual a ((k - 4) !!) 4 % (k - 2) / (k - 2) .
Enquanto k <n , o argumento correto de
and
será avaliado. Como j = ((k - 4) !!) 4 % (k - 2) / (k - 2) , como comprovado no primeiro parágrafo, j = 1 / (k - 2) se k - 2 for primo e j = 0 se não. Da mesma forma, como m% k = ((k - 2) !!) 4 é igual a 1 se k for primo e 0 se não for, -m% k = k - 1 se k for primo e -m% k = 0 se não for. Portanto,-m%k*j*2/k
avalia para 2 (k - 1) / (k (k - 2)) = ((k - 2) + k) / (k (k - 2)) = 1 / k + 1 / (k - 2) se o par (k - 2, k)consiste em primos gêmeos e a 0, se não.Após calcular o acima, adicionamos o resultado ao valor de retorno da chamada recursiva
f(n,k+2,m*k**4,m%k/k)
. k é incrementado por 2, portanto, leva apenas valores ímpares ‡ † , multiplicamos m por k 4, pois mk 4 = ((k - 2) !!) 4 k 4 = (k !!) 4 e passamos o valor atual de m% k / k - que é igual a 1 / k se o "antigo" k for primo e 0 se não - como parâmetro j para a chamada de função.Finalmente, quando k for igual ou maior que n , f retornará Falso e a recursão será interrompida. O valor de retorno de f (n) será a soma de todos 1 / k + 1 / (k - 2), como (k - 2, k) é um par primo duplo e k <n , conforme desejado.
‡ Os resultados do parágrafo Segundo plano são válidos apenas para números inteiros ímpares. Como mesmo números inteiros não podem ser primos gêmeos, podemos ignorá-los com segurança.
fonte
m%k*(j/k+j/(k-2))
.((k-2)!!)^4 = p(k)
módulop
para ímparp
. Eu não trabalhei com seu argumento, mas eis um que eu criei (que pode ser o mesmo em essência). Módulo de trabalhop
no conjunto{1,2,..,p-1}
, os pares são exatamente os negativos das probabilidades. Entãoprod(odds) = ± prod(evens)
,. O Teorema de Wilson nos diz issoprod(all) = - p(k)
. Desde entãoprod(all) = prod(odds) * prod(evens) = prod(odds) * ± prod(evens)
, temosprod(odds)^2 = ±p(k)
e assimprod(odds)^4 = p(k)^2 = p(k)
.Geléia ,
1514 bytesExperimente online!
Como funciona
fonte
Jelly ,
1614 bytes (com uma pequena ajuda de @Dennis)Experimente online!
Ao tentar melhorar minha resposta anterior, pensei em um algoritmo totalmente diferente, e ele é um pouco mais curto. Estou usando um post diferente para isso, como é o padrão aqui para uma resposta que usa uma técnica diferente.
Dennis sugerindo substituir
_/2+$$Ðḟ
porIċ¥Ðf2
; Eu tinha me esquecido completamente da possibilidade de um filtro diádico. Como tal, esse algoritmo agora está vinculado ao usado pela resposta de Dennis.Explicação
fonte
2_/2+$$Ðḟ
pode se tornarIċ¥Ðf2
.Braquilog , 17 bytes
Experimente online!
Esta é a nova versão do Brachylog, com uma página de código brilhante!
Explicação
fonte
MATL , 16 bytes
Experimente online!
Considere a entrada
13
como um exemplo.fonte
Mathematica,
4847 bytesAgradecemos a JungHwan Min por economizar 1 byte!
Função sem nome, recebendo um número inteiro positivo como entrada e retornando uma fração exata; por exemplo,
If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]~Sum~{i,#-1}&[10]
retorna92/105
.If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]
testa se ambosi
ei-2
são primos, retornando a soma de seus recíprocos, se sim e0
se não.~Sum~{i,#-1}&
em seguida, retorna a soma dessas contribuições para todos os valoresi
menores que a entrada.Submissão anterior:
fonte
If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]~Sum~{i,#-1}&
N@
, na frente do código.N
retorna uma aproximação decimal para um número real; no entanto, requer bytes extras para exibir mais de 6 sig figs, aproximadamente, e não importa quantos sig figs sejam exibidos, ainda é menos preciso que a própria fração.Oitava, 45 bytes
Explicação:
Experimente Online!
fonte
JavaScript (ES6),
6766 bytesGuardado 1 byte graças a @Arnauld
Saídas
false
para caso de teste2
, que são permitidas por padrão .Snippet de teste
Mostrar snippet de código
fonte
1/n+++1/++n
salva um byte.+++
isso nem sempre05AB1E ,
1914 bytes (-5 @Emigna)Experimente online!
fonte
<LDpÏÍDpÏDÌ«zO
para salvar 5 bytes.Geléia , 19 bytes
Experimente online!
Sinto que isso é improvável, mas não consigo ver imediatamente como.
Explicação
Eles
µ
conectam todas essas partes ao estilo de pipeline, cada uma tendo como entrada a saída da anterior.fonte
Pitão -
222117 bytesEu acho que a refatoração vai ajudar.
Conjunto de Teste .
fonte
Perl 6 ,
5951 bytes{sum 1 «/»grep((*-(2&0)).is-prime,^$_).flatmap:{$_-2,$_}}
-2..* Z ^$_
fecha a lista infinita-2, -1, 0, 1, ...
com a lista0, 1, ... $_-1
($_
sendo o argumento para a função), produzindo a lista(-2, 0), (-1, 1), (0, 2), ..., ($_-3, $_-1)
. (Obviamente, nenhum desses números menores que 3 pode estar em um par primo, mas3..* Z 5..^$_
possui alguns bytes a mais e nenhum dos números extras é primo.)Ele
grep
seleciona apenas os pares em que todos os números (ou seja, ambos) são primos e osflat
nivela em uma lista simples de números.«/»
é o hiperoperador da divisão; com a lista à direita e1
à esquerda, transforma a lista de pares primos em seus recíprocos, que são então somados porsum
.fonte
Clojure, 147 bytes
E Clojure morre por último, como sempre.
Ungolfed:
fonte
Julia 0.4 ,
4846 bytesExperimente online!
fonte
Utilitários Bash + GNU,
8685 bytesExperimente online!
Constrói uma grande expressão aritmética e a alimenta
bc -l
para avaliá-la.Editar: deixado erradamente em um par $ (...) de uma versão antiga com substituição de comando aninhada; alterado para backticks para salvar um byte.
fonte
NARS APL, 216 bytes, 108 caracteres
isso usaria o "Crivello di Eratostene" para encontrar a sub-lista em 1..arg de primos de solicitação. Teste:
fonte