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)
Terima kasih kepada @xnor karena bermain golf 2 4 byte dan membuka jalan untuk 4 lainnya!
Cobalah online!
Latar Belakang
Ingat bahwa teorema Wilson menyatakan bahwa untuk semua bilangan bulat k> 1 ,
di mana a ≡ b (mod d) berarti bahwa a - b dapat dibagi habis oleh d , yaitu a dan b memiliki residu yang sama ketika dibagi dengan d .
Dalam Wilson Theorems for Double, Hyper-, Sub-, dan Super-factorials , penulis membuktikan generalisasi untuk faktorial ganda, yang menjadi dasar jawaban ini. Faktor ganda bilangan bulat k ≥ 0 didefinisikan oleh
Teorema 4 dari makalah tersebut menyatakan sebagai berikut.
Mengangkat kedua sisi kongruensi ke kekuatan keempat, kami menyimpulkan itu
untuk semua bilangan prima ganjil p . Sejak 1 !! = 1 , persamaan juga berlaku untuk p = 2 .
Sekarang, melakukan hal yang sama pada teorema Wilson mengungkapkan hal itu
Sejak
mengikuti itu
setiap kali p adalah prima.
Sekarang, biarkan k menjadi bilangan bulat yang aneh, positif, dan komposit. Menurut definisi, ada bilangan bulat a, b> 1 sehingga k = ab .
Karena k aneh, begitu juga a dan b . Dengan demikian, keduanya terjadi pada urutan 1, 3,…, k - 2 dan
dimana | menunjukkan keterbagian.
Ringkasnya, untuk semua bilangan bulat ganjil k> 1
di mana p (k) = 1 jika k adalah prime dan p (k) = 0 jika k adalah komposit.
Bagaimana itu bekerja
Ketika fungsi f dipanggil dengan argumen tunggal, k , m , dan j diinisialisasi sebagai 3 , 1 , dan 0 .
Perhatikan bahwa ((k - 2) !!) 4 = 1 !! 4 = 1 = m . Bahkan, kesetaraan m = ((k - 2) !!) 4 akan berlaku setiap saat. j adalah pelampung dan akan selalu sama dengan ((k - 4) !!) 4 % (k - 2) / (k - 2) .
Sementara k <n , argumen yang benar and
akan dievaluasi. Karena j = ((k - 4) !!) 4 % (k - 2) / (k - 2) , sebagaimana dibuktikan pada paragraf pertama, j = 1 / (k - 2) jika k - 2 adalah prima dan j = 0 jika tidak. Demikian juga, karena m% k = ((k - 2) !!) 4 sama dengan 1 jika k adalah prima dan 0 jika tidak, -m% k = k - 1 jika k adalah prime dan -m% k = 0 jika tidak. Karenanya, -m%k*j*2/k
dievaluasi menjadi 2 (k - 1) / (k (k - 2)) = ((k - 2) + k) / (k (k - 2)) = 1 / k + 1 / (k - 2) jika pasangan (k - 2, k)terdiri dari bilangan prima kembar dan 0 jika tidak.
Setelah menghitung di atas, kami menambahkan hasilnya ke nilai kembali panggilan rekursif f(n,k+2,m*k**4,m%k/k)
. k bertambah 2 sehingga hanya membutuhkan nilai ganjil ‡ † , kita mengalikan m dengan k 4 karena mk 4 = ((k - 2) !!) 4 k 4 = (k !!) 4 , dan meneruskan nilai saat ini dari m% k / k - yang sama dengan 1 / k jika "lama" k adalah bilangan prima dan 0 jika tidak - sebagai parameter j ke pemanggilan fungsi.
Akhirnya, begitu k sama dengan atau lebih besar dari n , f akan mengembalikan False dan rekursi berhenti. Nilai pengembalian f (n) akan menjadi jumlah dari semua 1 / k + 1 / (k - 2) seperti (k - 2, k) adalah pasangan kembar utama dan k <n , seperti yang diinginkan.
‡ Hasil dari paragraf Latar Belakang hanya berlaku untuk bilangan bulat ganjil. Karena bahkan bilangan bulat tidak bisa menjadi bilangan prima kembar, kita dapat melewatkannya dengan aman.