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 вышеупомянутой статьи утверждает следующее.
Повышая обе стороны сравнений до четвертой степени, мы выводим, что
для всех нечетных простых чисел р . С 1 года !! = 1 , эквивалентность верна и для p = 2 .
Теперь, делая то же самое с теоремой Уилсона,
поскольку
следует, что
всякий раз, когда р простое.
Теперь пусть 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 = ((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 , по желанию.
‡ Результаты из абзаца Background сохраняются только для нечетных целых чисел. Поскольку даже целые числа не могут быть двойными простыми числами, мы можем их безопасно пропустить.