Орієнтовна константа Бруна


25

Константа Бруна - це значення, до якого сходиться сума зворотних простих парних пар ( 1/pа 1/(p+2)де pі p+2обидва є простими). Це приблизно 1.902160583104.

Давши додатне ціле число N, апроксимуйте константу Бруна шляхом підсумовування зворотних простей парних простих пар, де обидва простих числа в парі менше N, і вивести наближення.

Правила

  • N буде цілим числом в межах репрезентативного діапазону для вашої мови.
  • Вихід повинен бути максимально точним до справжнього значення, в межах реалізації вашої мови з плаваючою комою, ігноруючи будь-які потенційні проблеми через арифметичні неточності з плаваючою комою. Якщо ваша мова здатна до арифметики довільної точності, вона повинна бути не менш точною, як арифметика подвійної точності IEEE 754.
  • Крім того, точна частка може виводитися в будь-якому послідовному, однозначному форматі.
  • Якщо простір з’являється у кількох парних простих парах (наприклад 5, частина обох (3, 5)і (5, 7)), то її зворотний внесок щоразу вносить до суми.

Випробування

2 -> 0
6 -> 0.5333333333333333
10 -> 0.8761904761904762
13 -> 0.8761904761904762
100 -> 1.3309903657190867
620 -> 1.4999706034568274
100000 -> 1.67279958482774

Чи може бути виведена точна частка?
LegionMammal978

@ LegionMammal978 Так, уточню.
Мего

Побічна примітка: значення 1,902160583104 ... для константи Бруна лише здогадується; навіть перша значна цифра не була жорстко обчислена (тобто навіть невідомо, чи більша вона, чи менша за 2).
Грег Мартін

@GregMartin Хоча це правда, це також найкраще наближення, яке ми маємо на даний момент.
Mego

5 - це єдиний прем'єр-міністр, який з'являється у двох перших пар
Крістіан Сіверс,

Відповіді:


25

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 , як бажано.


Результати з абзацу Фонові стосуються лише непарних цілих чисел. Оскільки навіть цілі числа не можуть бути близнюками-близнюками, ми можемо їх безпечно пропустити.


Я думаю, що ваш вираз такий самий, як m%k*(j/k+j/(k-2)).
xnor

Так, це працює. Спасибі!
Денніс


Приємне спостереження, що ((k-2)!!)^4 = p(k)модуль pдля непарних p. Я не працював над вашим аргументом, але ось я придумав (це може бути те саме по суті). Модуль роботи pв наборі {1,2,..,p-1}, евенс - це саме негативи шансів. Так, prod(odds) = ± prod(evens). Теорема Вілсона говорить нам про це prod(all) = - p(k). Оскільки prod(all) = prod(odds) * prod(evens) = prod(odds) * ± prod(evens)ми маємо prod(odds)^2 = ±p(k)і так prod(odds)^4 = p(k)^2 = p(k).
xnor

Приємно! Я намагався виразити суму як один дріб, але обчислити її частину в j мені не прийшло в голову. Знову дякую! Ваш доказ набагато простіший, ніж той, який є з паперу.
Денніс

7

Желе , 15 14 байт

’ÆRµ_2fµ+2;µİ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.

5

Желе , 16 14 байт (за невеликої допомоги від @Dennis)

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

Спробуйте в Інтернеті!

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

Денніс пропонує замінити _/2+$$Ðḟна Iċ¥Ðf2; Я повністю забув про можливість діадіачного фільтра. Отже, цей алгоритм пов'язаний з тим, який використовував відповідь Денніса.

Пояснення

’Æ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.

2_/2+$$Ðḟможе стати Iċ¥Ðf2.
Денніс


3

MATL , 16 байт

liqZqtd2=)t2+h/s

Спробуйте в Інтернеті!

Розглянемо вклад 13як приклад.

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

2

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

Дякуємо JungHwan Min за економію 1 байта!

If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]~Sum~{i,#-1}&

Безіменна функція, що приймає вхідне ціле число і повертає точний дріб; наприклад, If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]~Sum~{i,#-1}&[10]повертає 92/105.

If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]перевіряє, чи є обидва, iі чи i-2є вони простими, повертаючи суму їх взаємних, якщо так, 0чи ні. ~Sum~{i,#-1}&потім повертає суму цих внесків на всі значення iменші за вхідні.

Попереднє подання:

If[And@@PrimeQ@{i,g=i-2},1/i+1/g,0]~Sum~{i,#-1}&

Тепер це просто моторошно. Я здаюся. ⚐
LegionMammal978

Мені було цікаво, чи означає "точна частка" Mathematica :)
Грег Мартін,

-1 байт:If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]~Sum~{i,#-1}&
JungHwan Min

Можна отримати довільне точне число, додавши два N@коду, перед кодом.
JungHwan Min

Приємного гольфу за умовою! Це правда, що Nповертає десяткове наближення до реального числа; однак для його отримання потрібні додаткові байти, щоб відобразити більше 6 сиг-фіг або так, і незалежно від того, скільки сиг-фіг відображається, він все ще менш точний, ніж сам дріб.
Грег Мартін

2

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

@(n)sum(all(isprime(m=[h=3:n-1;h-2]))*m'.^-1)

Пояснення:

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  

Спробуйте в Інтернеті!


2

JavaScript (ES6), 67 66 байт

Збережено 1 байт завдяки @Arnauld

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

Виходи falseдля тестового випадку 2, який дозволено за замовчуванням .

Фрагмент тесту


Я думаю, що 1/n+++1/++nекономить байт.
Арнольд

@Arnauld Дякую Я чомусь не знав, що +++не завжди призводить до помилки ...
ETHproductions


1

Желе , 19 байт

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

Спробуйте в Інтернеті!

У мене таке відчуття, що це неможливо, але я не можу відразу зрозуміти, як.

Пояснення

’Æ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

У µЗ'єднайте всі ці частини разом трубопроводу типу, з кожен з яких приймає вихід один перед тим, як його вхід.



1

Perl 6 , 59 51 байт

{sum 1 «/»grep((*-(2&0)).is-prime,^$_).flatmap:{$_-2,$_}}

{sum 1 «/»grep(*.all.is-prime,(-2..*Z ^$_)).flat}

-2..* Z ^$_переносить нескінченний список -2, -1, 0, 1, ...зі списком 0, 1, ... $_-1( $_є аргументом функції), створюючи список (-2, 0), (-1, 1), (0, 2), ..., ($_-3, $_-1). (Очевидно, що жодне з цих чисел, менших від 3, не може бути в простій парі, але 3..* Z 5..^$_на кілька байт довше, і жодне з зайвих чисел не є простим.)

В grepвибирає тільки ті пари , де все (тобто обидва) числа є простими, і flatзгладжує їх в звичайний список номерів.

«/»- гіпероператор відділу; зі списком праворуч і 1ліворуч перетворює список простих пар у їхні взаємні відповіді, які потім підсумовуються sum.


1

Clojure, 147 байт

(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)))))

І Clojure приходить мертвим останнім, як завжди.

Безголівки:

; 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)))))


0

Утиліти Bash + GNU, 86 85 байт

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

Спробуйте в Інтернеті!

Побудує великий арифметичний вираз, а потім подає його bc -lна оцінку.

Редагувати: Помилка залишилася в $ (...) парі зі старої версії з вкладеною підстановою команд; змінено на задній план, щоб зберегти байт.


0

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

  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

це використовує "Crivello di Eratostene" для пошуку підспілу в 1..arg праймерів запиту. Тест:

  z¨2 6 10 13 100 620
0 0.5333333333 0.8761904762 0.8761904762 1.330990366 1.499970603 
  z 100000
1.672799585
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.