Python 3 , 78 77 75 70 68 62 octets
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)
Merci à @xnor d'avoir joué au golf sur 2 4 octets et ouvert la voie à 4 autres!
Essayez-le en ligne!
Contexte
Rappelons que le théorème de Wilson déclare que pour tous les entiers k> 1 ,
où a ≡ b (mod d) signifie que a - b est divisible par d , c'est-à-dire que a et b ont le même résidu lorsqu'ils sont divisés par d .
Dans Wilson Theorems for Double-, Hyper-, Sub- and Super-factorials , les auteurs prouvent des généralisations pour les doubles factorielles, sur lesquelles cette réponse s'appuie. le double factorielle d'un entier k ≥ 0 est définie par
Le théorème 4 du document susmentionné énonce ce qui suit.
En élevant les deux côtés des congruences à la quatrième puissance, nous déduisons que
pour tous les nombres premiers impairs p . Depuis 1 !! = 1 , l'équivalence vaut également pour p = 2 .
Maintenant, faire la même chose avec le théorème de Wilson révèle que
Puisque
il s'ensuit que
n'importe quand p est premier.
Maintenant, soit k un entier composite impair et positif. Par définition, il existe des entiers a, b> 1 tels que k = ab .
Puisque k est impair, a et b aussi . Ainsi, les deux se produisent dans la séquence 1, 3,…, k - 2 et
où | indique la divisibilité.
En résumé, pour tous les entiers impairs k> 1
où p (k) = 1 si k est premier et p (k) = 0 si k est composite.
Comment ça marche
Lorsque la fonction f est appelée avec un seul argument, k , m et j sont initialisés comme 3 , 1 et 0 .
Notez que ((k - 2) !!) 4 = 1 !! 4 = 1 = m . En fait, l'égalité m = ((k - 2) !!) 4 tiendra à tout moment. j est un flottant et sera toujours égal à ((k - 4) !!) 4 % (k - 2) / (k - 2) .
Alors que k <n , le bon argument de and
sera évalué. Puisque j = ((k - 4) !!) 4 % (k - 2) / (k - 2) , comme prouvé dans le premier paragraphe, j = 1 / (k - 2) si k - 2 est premier et j = 0 sinon. De même, puisque m% k = ((k - 2) !!) 4 est égal à 1 si k est premier et 0 sinon, -m% k = k - 1 si k est premier et -m% k = 0 sinon. Par conséquent, est -m%k*j*2/k
évalué à 2 (k - 1) / (k (k - 2)) = ((k - 2) + k) / (k (k - 2)) = 1 / k + 1 / (k - 2) si la paire (k - 2, k)se compose de nombres premiers jumeaux et à 0 sinon.
Après avoir calculé ce qui précède, nous ajoutons le résultat à la valeur de retour de l'appel récursif f(n,k+2,m*k**4,m%k/k)
. k est incrémenté de 2 donc il ne prend que des valeurs impaires ‡ † , nous multiplions m par k 4 puisque mk 4 = ((k - 2) !!) 4 k 4 = (k !!) 4 , et passons la valeur actuelle m% k / k - qui est égal à 1 / k si le "vieux" k est un nombre premier et 0 sinon - comme paramètre j à l'appel de fonction.
Enfin, une fois que k est égal ou supérieur à n , f renvoie False et la récursivité s'arrête. La valeur de retour de f (n) sera la somme de tous les 1 / k + 1 / (k - 2) tels que (k - 2, k) est une paire principale jumelle et k <n , comme souhaité.
‡ Les résultats du paragraphe Contexte ne s'appliquent qu'aux entiers impairs. Étant donné que même les entiers ne peuvent pas être des nombres premiers jumeaux, nous pouvons les ignorer en toute sécurité.