Codegolf – Приблизительная Константа Бруна

  • Автор темы Чингис Саганов
  • Обновлено
  • 22, Oct 2024
  • #1

Константа Бруна — это значение, которому равна сумма обратных величин Твин Прайм пары (

 2 -> 0
6 -> 0.5333333333333333
10 -> 0.8761904761904762
13 -> 0.8761904761904762
100 -> 1.3309903657190867
620 -> 1.4999706034568274
100000 -> 1.67279958482774
 
и (5, 7) где (3, 5) and 5 оба простые) сходится. Это примерно N .

Учитывая положительное целое число N , approximate Brun's constant by summing the reciprocals of the twin prime pairs where both primes in the pair are less than N и выведите приближение.

Правила

  • 1.902160583104 will be a positive integer within the representable range for your language.
  • Вывод должен быть максимально точным относительно истинного значения в пределах реализации вашего языка с плавающей запятой, игнорируя любые потенциальные проблемы, связанные с неточностями арифметических операций с плавающей запятой. Если ваш язык поддерживает арифметику произвольной точности, он должен быть по крайней мере столь же точным, как арифметика двойной точности IEEE 754.
  • Альтернативно, точная дробь может быть выведена в любом согласованном однозначном формате.
  • Если простое число встречается в нескольких парах простых чисел-близнецов (например, p+2 , part of both p and 1/(p+2) ), its reciprocal contributes to the sum each time.

Тестовые случаи

1/p

#код-гольф #математика #теория чисел #простые числа #приближение

Чингис Саганов


Рег
23 Oct, 2020

Тем
95

Постов
199

Баллов
704
  • 26, Oct 2024
  • #2

Питон 3, 78 77 75 70 68 62 байта

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 bc -l 

Спасибо @xnor за то, что он украл 2 4 байта и проложил путь для еще 4!

Попробуйте онлайн!

Фон

Напомним, что теорема Вильсона утверждает, что для всех целых чисел к > 1,

где а ≡ б (по модулю d) означает, что а - б делится нацело на д, то есть, а и б имеют одинаковый остаток при делении на д.

В Теоремы Вильсона для двойных, гипер-, суб- и суперфакториалов, авторы доказывают обобщения для двойных факториалов, на которых строится этот ответ. двойной факториал целого числа к ≥ 0 определяется

Теорема 4 указанной статьи гласит следующее.

Возводя обе части сравнений в четвертую степень, приходим к выводу, что

для всех нечетных простых чисел п. С 1!! = 1эквивалентность справедлива и для р = 2.

Теперь, проделав то же самое с теоремой Вильсона, мы обнаруживаем, что

С

отсюда следует, что

в любое время п является простым.

Теперь позвольте к быть нечетным положительным составным целым числом. По определению существуют целые числа а, б > 1 такой, что к = аб.

С к странно, как и а и б. Таким образом, оба происходят в последовательности 1, 3, …, к - 2 и

где | указывает на делимость.

Подводя итог, для всех нечетных целых чисел к > 1

где р(к) = 1 если к является простым и р(к) = 0 если к является составным.

Как это работает

Когда функция ж вызывается с одним аргументом, к, м, и дж инициализируются как 3, 1, и 0.

Обратите внимание, что ((к - 2)!!)4 = 1!!4 = 1 = м. В самом деле, равенство м = ((к - 2)!!)4 будет держаться всегда. дж это плавать и всегда будет равен ((к - 4)!!)4 % (к - 2) / (к - 2).

Пока \$k < n\$, правый аргумент for((k=4;k<$1;k++,j=k-2)){ [ `factor $k $j|wc -w` = 4 ]&&x=$x+1/$k+1/$j;};bc -l<<<0$x will get evaluated. Since \$j = \frac{\mod(\left(\left(k - 4\right)!!\right)^4 , k - 2)}{k - 2}\$, as proven in the first paragraph, \$j = \frac{1}{k - 2}\$ if \$k - 2\$ is prime and \$j = 0\$ if not. Likewise, since \$\mod(m,k) = \left(\left(k - 2\right)!!\right)^4\$ equals \$1\$ if \$k\$ is prime and \$0\$ if not, \$\mod(-m,k) = k - 1\$ if \$k\$ is prime and \$\mod(-m , k) = 0\$ if not. Therefore, ʁ # Range from 0, n-1 ~ # Filter by: æ # Is prime 2l # Get the overlapping groups of 2 ' ; # Filter those by: ÷ε # Absolute difference of the list 2= # Equals 2 f # Flatten to make one list Ė # Take the reciprocal of each # Sum with the s flag # Convert to decimal format with the ḋ flag # Implicitly print оценивается как \$\frac{2\left(k - 1\right)}{k\left(k - 2\right)} = \frac{\left(k - 2\right) + k}{k(k - 2)} = \frac{1}{k} + \frac{1}{k - 2}\$, если пара \$\left(k - 2, k\right)\$ состоит из простых чисел-близнецов и \$0\$, если нет.

После вычисления вышеизложенного мы добавляем результат к возвращаемому значению рекурсивного вызова. ʁ~æ2l'÷ε2=;fĖ . \$k\$ gets incremented by \$2\$ so it only takes odd values‡†, мы умножаем \$m\$ на \$k^4\$, поскольку \$mk^4 = \left(\left(k - 2\right)!!\right)^4k^4 = \left(k! !\right)^4\$ и передайте текущее значение \$\frac{\mod(m,k)}{k}\$ – которое равно \$\frac{1}{k}\$, если «старый» \$k\$ является простым числом, а \$0\$ — в качестве параметра \$j\$ для вызова функции.

Наконец, как только \$k\$ станет равным или больше, чем \$n\$, \$f\$ вернет ЛОЖЬ и рекурсия останавливается. Возвращаемое значение \$f(n)\$ будет суммой всех \$\frac{1}{k} + \frac{1}{k - 2}\$ таких \$\left(k - 2 , k\right)\$ — пара простых чисел-близнецов и \$k < n\$, как и хотелось.


Результаты Фон абзац сохраняется только для нечетных целых чисел. Поскольку даже целые числа не могут быть простыми числами-близнецами, мы можем их безопасно пропустить.

 

Fuero


Рег
15 Feb, 2014

Тем
84

Постов
190

Баллов
640
  • 26, Oct 2024
  • #3

Желе, 15 14 байт

sḋ

Попробуйте онлайн!

Как это работает

ṁ\Σfo=2F-Ẋefṗŀ ŀ lowered range, 0..n-1 fṗ filter primes Ẋe get each consecutive pair f F- filter where difference o=2 equals 2 Σ concat, list of pairs to flattened list ṁ\ map 1/n and then sum ||answer||

Желе, 16 14 байт (с небольшой помощью @Dennis)

ṁ\Σfo=2F-Ẋefṗŀ

Попробуйте онлайн!

Пытаясь улучшить свой предыдущий ответ, я придумал совершенно другой алгоритм, и он оказался несколько короче. Я использую для этого другой пост, как это принято здесь для ответа, использующего другую технику.

Денис, предлагаю заменить. z¨2 6 10 13 100 620 0 0.5333333333 0.8761904762 0.8761904762 1.330990366 1.499970603 z 100000 1.672799585 with r←z n;h;i;k;v i←0⋄n-←1⋄h←1+⍳n-1⋄→B A:k←i⊃h⋄h←k∪(0≠k∣h)/h B:→A×⍳(⍴h)≥i+←1 r←+/÷(v-2),v←(h=1⌽h+2)/h ; Я совершенно забыл о возможности диадного фильтра. Таким образом, этот алгоритм теперь связан с тем, который использовал ответ Денниса.

Объяснение

; Returns the primality of a number. (defn prime? [n] (if (> n 2) (< (.indexOf (for [a (range 2 n)] (mod n a)) 0) 0))) ; Calculates the actual Brun's Constant. ' (Stupid highlighter) (defn brunsconst [n] ; Adds all of the entries together (reduce + ; For a in range(2, n): (for [a (range 2 n)] (let [b (- a 2)] ; If both a and a-2 are prime: (if (and (prime? a) (prime? b)) ; Place (1/a + 1/a-2) on the array, else 0 (+ (/ 1 a) (/ 1 b)) 0))))) ||answer||

Брахилог, 17 байты

(fn[n](let[p #(if(> % 2)(<(.indexOf(for[a(range 2 %)](mod % a))0)0))](reduce +(for[a(range 2 n)](if(and(p a)(p(- a 2)))(+(/ 1 a)(/ 1(- a 2)))0)))))

Попробуйте онлайн!

Это совершенно новая версия Brachylog с блестящей кодовой страницей!

Объяснение

sum ||answer||

МАТЛ, 16 байт

1

Попробуйте онлайн!

Рассмотрите ввод «/» as an example.

flat ||answer||

05AB1E, 19 14 байт (-5 @Emigna)

grep

Попробуйте онлайн!

 

Серега5443


Рег
09 Mar, 2014

Тем
67

Постов
209

Баллов
554
  • 26, Oct 2024
  • #4

Математика, 48 47 байт

Спасибо JungHwan Min за сохранение 1 байта!

3..* Z 5..^$_

Безымянная функция, принимающая на вход положительное целое число и возвращающая точную дробь; например, (-2, 0), (-1, 1), (0, 2), ..., ($_-3, $_-1) returns $_ .

0, 1, ... $_-1 tests whether both -2, -1, 0, 1, ... и -2..* Z ^$_ are prime, returning the sum of their reciprocals if so and {sum 1 «/»grep(*.all.is-prime,(-2..*Z ^$_)).flat} если не. {sum 1 «/»grep((*-(2&0)).is-prime,^$_).flatmap:{$_-2,$_}} then returns the sum of those contributions for all values of !n=sum(1./[(p=n-1|>primes)∩(p-2);p∩(p+2)]) меньше, чем вход.

Предыдущая подача:

scL1sf.APM_MTm,tt ||answer||

Октава, 45 байт

µ

Объяснение:

’ÆRḊµ_Æp=2Tịµ_2;µİS ÆR Generate all primes from 2 to n inclusive ’ Subtract 1 Ḋ Remove first element ’ÆRḊ Generate all primes from 3 to n-1 exclusive _Æp Subtract the previous prime (i.e. calculate the prime gap) =2 Compare to 2 Tị Take elements of the input where the comparison is true _Æp=2Tị Filter a list of primes to the latter halves of prime pairs _2 Subtract 2 ; Append _2; Append the list to the list with 2 subtracted from it İ Take reciprocals S Sum İS Take the sum of the reciprocals

Попробуйте онлайн!

 

Valeri 65


Рег
28 Oct, 2006

Тем
57

Постов
191

Баллов
516
  • 26, Oct 2024
  • #5

JavaScript (ES6), 67 66 байт

Сэкономлен 1 байт благодаря @Arnauld

’ÆRḊµ_Æp=2Tịµ_2;µİS

Выходы n->forprime(p=s=0.,n,isprime(q=p-2)&&s+=1/p+1/q);s for test case f=n=>--n>1&&((p=x=>n%--x?p(x):x==1)(n)&&p(n-=2)&&1/n+++1/++n)+f(n) g=n=>console.log("Input:",n,"Output:",f(n)) g(2) g(6) g(10) g(13) g(100) g(620) , что разрешено по умолчанию.

Тестовый фрагмент

2 ||answer||

Париж/GP, 50 байт

false

Попробуйте онлайн!

 

Dimanoid


Рег
09 Nov, 2004

Тем
82

Постов
198

Баллов
618
  • 26, Oct 2024
  • #6

Желе, 19 байт

f=n=>--n>1&&((p=x=>n%--x?p(x):x==1)(n)&&p(n-=2)&&1/n+++1/++n)+f(n)

Попробуйте онлайн!

У меня такое чувство, что это невозможно улучшить, но я не сразу понимаю, как это сделать.

Объяснение

m=[h=3:n-1;h-2] generate an concatenate two ranges 3:n-1 and 1:n-3 rec=m'.^-1 transpose and reciprocal idx=all(isprime(m)) create a logical [0 1 ..] array if both ranges are prime set 1 else set 0 sum1 = idx * rec matrix multiplication(extrat elements with logical index and sum along the first dimension) sum(sum1) sum along the second dimension

@(n)sum(all(isprime(m=[h=3:n-1;h-2]))*m'.^-1) connect all these portions together pipeline-style, with each taking the output of the one before as its input.

 

K.perminov


Рег
03 Dec, 2004

Тем
85

Постов
190

Баллов
655
  • 26, Oct 2024
  • #9

Перл 6, 59 51 байт

~Sum~{i,#-1}&

0

i-2 zips the infinite list i со списком If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0] ( 92/105 являющийся аргументом функции), создавая список If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]~Sum~{i,#-1}&[10] . (Obviously none of these numbers less than 3 can be in a prime pair, but If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]~Sum~{i,#-1}& на несколько байт длиннее, и ни одно из дополнительных чисел не является простым.)

<LDpÏÍDpÏDÌ«zO selects only those pairs where all (that is, both) numbers are prime, and the l % Push 1 % STACK: 1 i % Input N % STACK: 1, 13 q % Subtract 1 % STACK: 1, 12 Zq % Primes up to that % STACK: 1, [2 3 5 7 11] t % Duplicate % STACK: 1, [2 3 5 7 11], [2 3 5 7 11] d % Consecutive differences % STACK: 1, [2 3 5 7 11], [1 2 2 4] 2= % Compare with 2, element-wise % STACK: 1, [2 3 5 7 11], [0 1 1 0] ) % Use as logical index to select elements from array % STACK: 1, [3 5] t % Duplicate % STACK: 1, [3 5], [3 5] 2+ % Add 2, element-wise % STACK: 1, [3 5], [5 7] h % Concatenate horizontally % STACK: 1, [3 5 5 7] / % Divide, element-wise % STACK: [0.3333 0.2 0.2 0.1429] s % Sum of array. Implicitly display % STACK: 0.8762 сглаживает их в простой список чисел.

13 is the division hyperoperator; with the list on the right and liqZqtd2=)t2+h/s слева, он превращает список пар простых чисел в их обратные значения, которые затем суммируются по формуле { }ᶠ Find all valid outputs of the predicate in brackets c+ Output is the sum of that list after flattening it >I Input > I -₂:I The list [I-2, I] { }ᵐ Map: ṗ/₁ Must be prime and the output is its inverse .

 

Лариса1975


Рег
22 Sep, 2011

Тем
98

Постов
208

Баллов
728
  • 26, Oct 2024
  • #10

Кложур, 147 байт

{>I-₂:I{ṗ/₁}ᵐ}ᶠc+

И Clojure, как обычно, выходит последним.

Не в гольфе:

’ÆRṡ2Iċ¥Ðf2FİS ’ Decrement. ÆR Primes from 2 to the argument inclusive (i.e. 2 to the original input exclusive). ṡ2 Take overlapping slices of size 2. Ðf Keep only elements where the following is true: ¥ {the second parse of, which parses like this} Iċ 2 the differences (I) contain (ċ) 2 F Flatten. İ Take 1/x {for every list element}. S Sum. ||answer||

APL NARS, 216 байт, 108 символов

Iċ¥Ðf2

это будет использовать «Crivello di Eratostene» для поиска подсписка в 1..arg простых чисел запроса. Тест:

_/2+$$Ðḟ ||answer||

Шелуха, 14 байт

’ÆRṡ2_/2+$$ÐḟFİS

Попробуйте онлайн!

Объяснение

’ÆRµ_2fµ+2;µİS Main link. Argument: n ’ Decrement; yield n-1. ÆR Prime range; yield all primes in [1, ..., n-1]. µ New chain. Argument: r (prime range) _2 Subtract 2 from all primes. f Filter; keep all p-2 that appear in r. µ New chain. Argument: t (filtered range) +2 Add 2 to all primes in s. ; Concatenate with s. µ New chain. Argument: t (twin primes) İ Take the inverses. S Sum. ||answer||

Виксал ’ÆRµ_2fµ+2;µİS , 13 bytes

f(n,k+2,m*k**4,m%k/k)

Попробуйте онлайн или проверить все тестовые случаи.

Объяснение:

-m%k*j*2/k ||answer||

Баш + Утилиты GNU, 86 85 байт

and

Попробуйте онлайн!

Создает большое арифметическое выражение и затем передает его в 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) to evaluate it.

Изменить: по ошибке оставлена ​​пара $(...) из старой версии с подстановкой вложенных команд; изменено на обратные кавычки, чтобы сохранить байт.

 

Teugen


Рег
18 Apr, 2010

Тем
81

Постов
179

Баллов
594
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно