Python 3 , 78 77 75 70 68 62 байт
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)
Дякуємо @xnor за те, що виграли 2 4 байти і проклали шлях до ще 4!
Спробуйте в Інтернеті!
Фон
Нагадаємо, що теорема Вілсона стверджує, що для всіх цілих чисел k> 1 ,
де a ≡ b (mod d) означає, що a - b рівномірно ділиться на d , тобто a і b мають однаковий залишок при поділі на d .
У теоремах Вілсона для подвійних, гіпер-, суб- та суперфабрикантів автори доводять узагальнення для подвійних факторіалів, на яких будується ця відповідь. Подвійний факторіал цілого числа до ^ 0 визначається
У теоремі 4 вищезгаданої роботи зазначено наступне.
Піднімаючи обидві сторони конгрегенцій до четвертої сили, ми виводимо це
для всіх непарних праймерів p . З 1 !! = 1 , еквівалентність також справедлива для p = 2 .
Тепер, те ж саме з теоремою Вілсона, це виявляє
З тих пір
випливає, що
всякий раз, коли p є простим.
Тепер нехай k - непарне, додатне, складене ціле число. За визначенням існують цілі числа a, b> 1 такі, що k = ab .
Оскільки k непарне, то і a і b . Таким чином, обидва трапляються в послідовностях 1, 3,…, k - 2 і
де | вказує на подільність.
Підсумовуючи, для всіх непарних цілих чисел k> 1
де p (k) = 1, якщо k є простим, а p (k) = 0, якщо k є композиційним.
Як це працює
Коли функція f викликається одним аргументом, k , m і j ініціалізуються як 3 , 1 і 0 .
Зауважимо, що ((k - 2) !!) 4 = 1 !! 4 = 1 = m . Насправді рівність m = ((k - 2) !!) 4 буде дотримуватися весь час. j - поплавок і завжди буде дорівнює ((k - 4) !!) 4 % (k - 2) / (k - 2) .
Хоча k <n , правильний аргумент and
буде оцінено. Оскільки j = ((k - 4) !!) 4 % (k - 2) / (k - 2) , як доведено в першому абзаці, j = 1 / (k - 2), якщо k - 2 є простим і j = 0, якщо ні. Так само, оскільки m% k = ((k - 2) !!) 4 дорівнює 1, якщо k є простим, і 0, якщо ні, -m% k = k - 1, якщо k є простим, і -m% k = 0, якщо ні. Тому -m%k*j*2/k
оцінюємо до 2 (k - 1) / (k (k - 2)) = ((k - 2) + k) / (k (k - 2)) = 1 / k + 1 / (k - 2) якщо пара (k - 2, k)складається з близнюків-близнюків і до 0, якщо ні.
Вирахувавши вище, ми додаємо результат до зворотного значення рекурсивного виклику f(n,k+2,m*k**4,m%k/k)
. k збільшується на 2, тому він приймає лише непарні значення ‡ † , ми множимо m на k 4, оскільки mk 4 = ((k - 2) !!) 4 k 4 = (k !!) 4 , і передаємо поточне значення m% k / k - що дорівнює 1 / k, якщо "старий" k є простим, а 0, якщо ні - як параметр j для виклику функції.
Нарешті, коли k дорівнює або більше n , f повернеться False і рекурсія припиниться. Повернене значення f (n) буде сумою всіх 1 / k + 1 / (k - 2), таких (k - 2, k), є парною простою парою і k <n , як бажано.
‡ Результати з абзацу Фонові стосуються лише непарних цілих чисел. Оскільки навіть цілі числа не можуть бути близнюками-близнюками, ми можемо їх безпечно пропустити.