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)
Vielen Dank an @xnor für das Abschlagen von 2 bis 4 Bytes und das Vorbereiten des Weges für weitere 4 Bytes!
Probieren Sie es online!
Hintergrund
Erinnern wir uns, dass Wilsons Satz besagt, dass für alle ganzen Zahlen k> 1 ,
wobei a ≡ b (mod d) bedeutet, dass a - b gleichmäßig durch d teilbar ist , dh a und b haben den gleichen Rest, wenn sie durch d geteilt werden .
In Wilson Theorems for Double-, Hyper-, Sub- und Super-Fakultäten beweisen die Autoren Verallgemeinerungen für Double Factorials, auf denen diese Antwort aufbaut. Die doppelte Fakultät einer ganzen Zahl k ≥ 0 ist definiert durch
Satz 4 der oben genannten Arbeit besagt Folgendes.
Indem wir beide Seiten der Kongruenzen zur vierten Potenz erheben, schließen wir daraus
für alle ungeraden Primzahlen p . Schon seit 1 !! = 1 gilt die Äquivalenz auch für p = 2 .
Das Gleiche gilt für Wilsons Theorem
Schon seit
es folgt dem
wann immer p prime ist.
Nun sei k eine ungerade, positive, zusammengesetzte ganze Zahl. Per Definition existieren ganze Zahlen a, b> 1, so dass k = ab ist .
Da k ungerade ist, sind auch a und b ungerade . Somit treten beide in der Reihenfolge 1, 3,…, k - 2 und auf
wo | zeigt die Teilbarkeit an.
Zusammenfassend gilt für alle ungeraden ganzen Zahlen k> 1
wobei p (k) = 1 ist, wenn k prim ist, und p (k) = 0 ist, wenn k zusammengesetzt ist.
Wie es funktioniert
Wenn die Funktion f mit einem einzelnen Argument aufgerufen wird, werden k , m und j als 3 , 1 und initialisiert 0 .
Beachten Sie, dass ((k - 2) !!) 4 = 1 !! 4 = 1 = m . Tatsächlich gilt immer die Gleichheit m = ((k - 2) !!) 4 . j ist ein float und wird immer gleich ((k - 4) !!) 4 % (k - 2) / (k - 2) sein .
Während k <n ist , wird das richtige Argument von and
ausgewertet. Da j = ((k - 4) !!) 4 % (k - 2) / (k - 2) ist , wie im ersten Absatz bewiesen, gilt j = 1 / (k - 2), wenn k - 2 eine Primzahl ist und j = 0 wenn nicht. Da m% k = ((k - 2) !!) 4 gleich 1 ist, wenn k eine Primzahl ist, und 0, wenn nicht, ist -m% k = k - 1, wenn k eine Primzahl ist, und -m% k = 0, wenn nicht. Wertet daher aus, dass -m%k*j*2/k
er 2 (k - 1) / (k (k - 2)) = ((k - 2) + k) / (k (k - 2)) = 1 / k + 1 / (k - 2) wenn das Paar (k - 2, k)besteht aus zwei Primzahlen und 0, wenn nicht.
Nach der Berechnung des oben genannten addieren wir das Ergebnis zum Rückgabewert des rekursiven Aufrufs f(n,k+2,m*k**4,m%k/k)
. k wird um 2 inkrementiert, sodass nur ungerade Werte ‡ † verwendet werden. Wir multiplizieren m mit k 4, da mk 4 = ((k - 2) !!) 4 k 4 = (k !!) 4 und übergeben den aktuellen Wert von m% k / k - entspricht 1 / k, wenn das "alte" k eine Primzahl ist, und 0, wenn nicht - als Parameter j für den Funktionsaufruf.
Schließlich, wenn k gleich oder größer ist , als n , f kehrt Falsch und die Rekursion stoppt. Der Rückgabewert von f (n) ist die Summe aller 1 / k + 1 / (k - 2), so dass (k - 2, k) ein Doppelprimuspaar ist und k <n , wie gewünscht.
‡ Die Ergebnisse aus dem Hintergrund- Absatz gelten nur für ungerade ganze Zahlen. Da auch ganze Zahlen keine Doppelprimzahlen sein können, können wir sie sicher überspringen.