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)
¡Gracias a @xnor por jugar 2 4 bytes y allanar el camino para 4 más!
Pruébalo en línea!
Fondo
Recordemos que el teorema de Wilson establece que para todos los enteros k> 1 ,
donde a ≡ b (mod d) significa que a - b es divisible por d , es decir, a y b tienen el mismo residuo cuando se divide por d .
En Wilson Theorems for Double-, Hyper-, Sub- and Super-factorials , los autores prueban generalizaciones para factoriales dobles, sobre los que se basa esta respuesta. El factorial doble de un entero k ≥ 0 se define por
El teorema 4 del trabajo antes mencionado establece lo siguiente.
Elevando ambos lados de las congruencias al cuarto poder, deducimos que
para todos los números primos impares p . Desde 1 !! = 1 , la equivalencia se cumple también para p = 2 .
Ahora, hacer lo mismo con el teorema de Wilson revela que
Ya que
resulta que
siempre que p es primo.
Ahora, que k sea un número entero extraño, positivo y compuesto. Por definición, existen enteros a, b> 1 tales que k = ab .
Como k es impar, también lo son a y b . Por lo tanto, ambos ocurren en la secuencia 1, 3, ..., k - 2 y
donde | Indica divisibilidad.
Resumiendo, para todos los enteros impares k> 1
donde p (k) = 1 si k es primo y p (k) = 0 si k es compuesto.
Cómo funciona
Cuando se llama a la función f con un único argumento, k , m y j se inicializan como 3 , 1 y 0 .
Tenga en cuenta que ((k - 2) !!) 4 = 1 !! 4 = 1 = m . De hecho, la igualdad m = ((k - 2) !!) 4 se mantendrá en todo momento. j es flotante y siempre será igual a ((k - 4) !!) 4 % (k - 2) / (k - 2) .
Mientras k <n , and
se evaluará el argumento correcto de . Como j = ((k - 4) !!) 4 % (k - 2) / (k - 2) , como se demuestra en el primer párrafo, j = 1 / (k - 2) si k - 2 es primo y j = 0 si no. Del mismo modo, dado que m% k = ((k - 2) !!) 4 es igual a 1 si k es primo y 0 si no, -m% k = k - 1 si k es primo y -m% k = 0 si no. Por lo tanto, se -m%k*j*2/k
evalúa como 2 (k - 1) / (k (k - 2)) = ((k - 2) + k) / (k (k - 2)) = 1 / k + 1 / (k - 2) si el par (k - 2, k)consiste en primos gemelos y en 0 si no.
Después de calcular lo anterior, agregamos el resultado al valor de retorno de la llamada recursiva f(n,k+2,m*k**4,m%k/k)
. k se incrementa en 2, por lo que solo toma valores impares ‡ † , multiplicamos m por k 4 ya que mk 4 = ((k - 2) !!) 4 k 4 = (k !!) 4 y pasamos el valor actual de m% k / k , que es igual a 1 / k si el "viejo" k es primo y 0 si no, como parámetro j para la llamada a la función.
Finalmente, una vez que k es igual o mayor que n , f devolverá False y la recursión se detendrá. El valor de retorno de f (n) será la suma de todos 1 / k + 1 / (k - 2) tal que (k - 2, k) es un par primo gemelo yk <n , según se desee.
‡ Los resultados del párrafo Fondo solo se mantienen para enteros impares. Dado que incluso los enteros no pueden ser primos gemelos, podemos omitirlos de manera segura.