Python 3 , 78 77 75 70 68 62 byte
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)
Grazie a @xnor per il golf off 2 4 byte e spianando la strada per altri 4!
Provalo online!
sfondo
Ricordiamo che il teorema di Wilson afferma che per tutti gli interi k> 1 ,
dove a ≡ b (mod d) significa che a - b è uniformemente divisibile per d , ovvero a e b hanno lo stesso residuo se diviso per d .
Nei teoremi di Wilson per doppio, iper-, sotto- e super fattoriale , gli autori dimostrano generalizzazioni per doppi fattoriali, su cui si basa questa risposta. Il doppio fattoriale di un intero k ≥ 0 è definito da
Il teorema 4 del suddetto articolo afferma quanto segue.
Elevando entrambi i lati delle congruenze al quarto potere, lo deduciamo
per tutti i numeri primi dispari p . Dal 1 !! = 1 , l'equivalenza vale anche per p = 2 .
Ora, fare lo stesso con il teorema di Wilson lo rivela
Da
ne consegue che
ogni volta che p è primo.
Ora, lascia che k sia un numero intero dispari, positivo e composito. Per definizione, esistono numeri interi a, b> 1 tali che k = ab .
Poiché k è dispari, quindi sono un e b . Pertanto, entrambi si verificano nella sequenza 1, 3, ..., k - 2 e
dove | indica divisibilità.
Riassumendo, per tutti gli interi dispari k> 1
dove p (k) = 1 se k è primo e p (k) = 0 se k è composto.
Come funziona
Quando la funzione f viene chiamata con un singolo argomento, k , m e j vengono inizializzati come 3 , 1 e 0 .
Nota che ((k - 2) !!) 4 = 1 !! 4 = 1 = m . In effetti, l'uguaglianza m = ((k - 2) !!) 4 manterrà sempre. j è un float e sarà sempre uguale a ((k - 4) !!) 4 % (k - 2) / (k - 2) .
Mentre k <n , and
verrà valutato l'argomento giusto di . Poiché j = ((k - 4) !!) 4 % (k - 2) / (k - 2) , come dimostrato nel primo paragrafo, j = 1 / (k - 2) se k - 2 è primo e j = 0 in caso contrario. Allo stesso modo, poiché m% k = (((k - 2) !!) 4 è uguale a 1 se k è primo e 0 in caso contrario, -m% k = k - 1 se k è primo e -m% k = 0 in caso contrario. Pertanto, -m%k*j*2/k
valuta 2 (k - 1) / (k (k - 2)) = ((k - 2) + k) / (k (k - 2)) = 1 / k + 1 / (k - 2) se la coppia (k - 2, k)è composto da numeri primi gemelli e da 0 in caso contrario.
Dopo aver calcolato quanto sopra, aggiungiamo il risultato al valore restituito della chiamata ricorsiva f(n,k+2,m*k**4,m%k/k)
. k viene incrementato di 2, quindi richiede solo valori dispari ‡ † , moltiplichiamo m per k 4 poiché mk 4 = ((k - 2) !!) 4 k 4 = (k !!) 4 e passiamo il valore corrente di m% k / k - che equivale a 1 / k se il "vecchio" k è un numero primo e 0 in caso contrario - come parametro j alla chiamata della funzione.
Alla fine, una volta che k è uguale o maggiore di n , f restituirà False e la ricorsione si interrompe. Il valore di ritorno di f (n) sarà la somma di tutti 1 / k + 1 / (k - 2) tale (k - 2, k) è una prima coppia gemella e k <n , come desiderato.
‡ I risultati del paragrafo Sfondo valgono solo per numeri dispari. Poiché anche i numeri interi non possono essere numeri primi gemelli, possiamo saltarli in modo sicuro.