Python 3 , 78 77 75 70 68 62 bajtów
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)
Dzięki @xnor za grę w golfa z 2 4 bajtami i torowanie drogi dla 4 kolejnych!
Wypróbuj online!
tło
Przypomnijmy, że twierdzenie Wilsona stwierdza, że dla wszystkich liczb całkowitych k> 1 ,
![](https://i.stack.imgur.com/bmCcO.png)
gdzie ≡ b (mod d) środki, a - b jest podzielna przez D , to znaczy i b mają taką samą pozostałości po podzieleniu przez d .
W Twierdzeniach Wilsona dla podwójnych, super-, sub- i superczynnikowych autorzy dowodzą uogólnień dla podwójnych silni, na których opiera się ta odpowiedź. Dwukrotnie silnia liczby całkowitej K ≥ 0 jest określona
![](https://i.stack.imgur.com/iCGD4.png)
Twierdzenie 4 powyższej pracy stwierdza, co następuje.
![](https://i.stack.imgur.com/rhz9x.png)
Podnosząc obie strony przystawek do czwartej potęgi, dedukujemy to
![](https://i.stack.imgur.com/NbNii.png)
dla wszystkich liczb nieparzystych p . Od 1 !! = 1 , równoważność obowiązuje również dla p = 2 .
Teraz uczynienie tego samego z twierdzeniem Wilsona ujawnia to
![](https://i.stack.imgur.com/JPDKa.png)
Od
![](https://i.stack.imgur.com/Zt2g7.png)
wynika, że
![](https://i.stack.imgur.com/MkN6e.png)
ilekroć p jest liczbą pierwszą.
Teraz niech k będzie nieparzystą, dodatnią liczbą całkowitą złożoną. Z definicji istnieją liczby całkowite a, b> 1 takie, że k = ab .
Ponieważ k jest nieparzyste, więc są i b . Zatem oba występują w sekwencji 1, 3,…, k - 2 i
![](https://i.stack.imgur.com/7nyHV.png)
gdzie | wskazuje podzielność.
Podsumowując, dla wszystkich nieparzystych liczb całkowitych k> 1
![](https://i.stack.imgur.com/V4Wzw.png)
gdzie p (k) = 1, jeśli k jest liczbą pierwszą, a p (k) = 0, jeśli k jest złożone.
Jak to działa
Gdy funkcja f jest wywoływana za pomocą jednego argumentu, k , m i j są inicjalizowane jako 3 , 1 i 0 .
Zauważ, że ((k - 2) !!) 4 = 1 !! 4 = 1 = m . W rzeczywistości równość m = ((k - 2) !!) 4 utrzyma się przez cały czas. j jest liczbą zmiennoprzecinkową i zawsze będzie równa ((k - 4) !!) 4 % (k - 2) / (k - 2) .
Podczas gdy k <n , właściwy argument and
zostanie oceniony. Ponieważ j = ((k - 4) !!) 4 % (k - 2) / (k - 2) , jak wykazano w akapicie pierwszym, j = 1 / (k - 2), jeśli k - 2 jest liczbą pierwszą, a j = 0, jeśli nie. Podobnie, ponieważ m% k = ((k - 2) !!) 4 równa się 1, jeśli k jest liczbą pierwszą, a 0, jeśli nie, -m% k = k - 1, jeśli k jest liczbą pierwszą, i -m% k = 0, jeśli nie. Dlatego -m%k*j*2/k
ocenia na 2 (k - 1) / (k (k - 2)) = ((k - 2) + k) / (k (k - 2)) = 1 / k + 1 / (k - 2) jeśli para (k - 2, k)składa się z podwójnych liczb pierwszych i do 0, jeśli nie.
Po obliczeniu powyższego dodajemy wynik do wartości zwracanej wywołania rekurencyjnego f(n,k+2,m*k**4,m%k/k)
. k zostaje zwiększone o 2, więc przyjmuje tylko nieparzyste wartości ‡ † , mnożymy m przez k 4, ponieważ mk 4 = ((k - 2) !!) 4 k 4 = (k !!) 4 , i przekazujemy bieżącą wartość m% k / k - co równa się 1 / k, jeśli „stare” k jest liczbą pierwszą, a 0, jeśli nie - jako parametr j do wywołania funkcji.
W końcu, gdy k będzie równe lub większe niż n , f zwróci False i rekursja się zatrzyma. Zwracana wartość f (n) będzie sumą wszystkich 1 / k + 1 / (k - 2), takich jak (k - 2, k) jest podwójną parą pierwszą i k <n , zależnie od potrzeb.
‡ Wyniki z akapitu Tło zachowują się tylko dla nieparzystych liczb całkowitych. Ponieważ nawet liczby całkowite nie mogą być liczbami podwójnymi, możemy je bezpiecznie pominąć.