Python 3 , 78 77 75 70 68 62 bytes
f=lambda n,k=3,m=1,j=0:k<n and-m%k*j*2/k+f(n,k+2,m*k**4,m%k/k)
Obrigado ao @xnor por jogar 2 4 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.