Przybliżona stała Bruna


25

Stała Bruna to wartość, z którą sumuje się odwrotność podwójnych par liczb pierwszych ( 1/pi 1/(p+2)gdzie pi p+2obie są liczbami pierwszymi). Jest w przybliżeniu 1.902160583104.

Biorąc pod uwagę dodatnią liczbę całkowitą N, przybliż przybliżoną stałą Bruna, sumując odwrotności podwójnych par liczb pierwszych, gdzie obie liczby pierwsze w parze są mniejsze N, i wyprowadzaj przybliżenie.

Zasady

  • N będzie dodatnią liczbą całkowitą w reprezentatywnym zakresie dla twojego języka.
  • Dane wyjściowe muszą być możliwie dokładne z prawdziwą wartością, w granicach implementacji zmiennoprzecinkowej języka, ignorując wszelkie potencjalne problemy wynikające z niedokładności arytmetycznych zmiennoprzecinkowych. Jeśli twój język jest zdolny do arytmetyki o dowolnej precyzji, musi być co najmniej tak dokładny jak arytmetyka o podwójnej precyzji IEEE 754.
  • Alternatywnie, dokładna część może być wyprowadzona w dowolnym spójnym, jednoznacznym formacie.
  • Jeśli liczba pierwsza występuje w wielu podwójnych parach liczby pierwszej (np. Jako 5część obu (3, 5)i (5, 7)), jej wzajemność przyczynia się do sumy za każdym razem.

Przypadki testowe

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

Czy można podać dokładną część?
LegionMammal978

@ LegionMammal978 Tak, wyjaśnię.
Mego

Uwaga dodatkowa: wartość 1,902160583104 ... dla stałej Bruna jest tylko przypuszczeniem; nawet pierwsza znacząca liczba nie została rygorystycznie obliczona (to znaczy nie wiadomo nawet, czy jest większa czy mniejsza niż 2).
Greg Martin

@GregMartin Chociaż to prawda, jest to również najlepsze przybliżenie, jakie obecnie mamy.
Mego

5 jest jedyną liczbą pierwszą, która występuje w dwóch parach pierwszych
Christian Sievers

Odpowiedzi:


25

Python 3 , 78 77 75 70 68 62 bajtów

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)

Dzięki @xnor za grę w golfa z 2 4 bajtami i torowanie drogi dla 4 kolejnych!

Wypróbuj online!

tło

Przypomnijmy, że twierdzenie Wilsona stwierdza, że ​​dla wszystkich liczb całkowitych k> 1 ,

gdzie ≡ b (mod d) środki, a - b jest podzielna przez D , to znaczy i b mają taką samą pozostałości po podzieleniu przez d .

W Twierdzeniach Wilsona dla podwójnych, super-, sub- i superczynnikowych autorzy dowodzą uogólnień dla podwójnych silni, na których opiera się ta odpowiedź. Dwukrotnie silnia liczby całkowitej K ≥ 0 jest określona

Twierdzenie 4 powyższej pracy stwierdza, co następuje.

Podnosząc obie strony przystawek do czwartej potęgi, dedukujemy to

dla wszystkich liczb nieparzystych p . Od 1 !! = 1 , równoważność obowiązuje również dla p = 2 .

Teraz uczynienie tego samego z twierdzeniem Wilsona ujawnia to

Od

wynika, że

ilekroć p jest liczbą pierwszą.

Teraz niech k będzie nieparzystą, dodatnią liczbą całkowitą złożoną. Z definicji istnieją liczby całkowite a, b> 1 takie, że k = ab .

Ponieważ k jest nieparzyste, więc są i b . Zatem oba występują w sekwencji 1, 3,…, k - 2 i

gdzie | wskazuje podzielność.

Podsumowując, dla wszystkich nieparzystych liczb całkowitych k> 1

gdzie p (k) = 1, jeśli k jest liczbą pierwszą, a p (k) = 0, jeśli k jest złożone.

Jak to działa

Gdy funkcja f jest wywoływana za pomocą jednego argumentu, k , m i j są inicjalizowane jako 3 , 1 i 0 .

Zauważ, że ((k - 2) !!) 4 = 1 !! 4 = 1 = m . W rzeczywistości równość m = ((k - 2) !!) 4 utrzyma się przez cały czas. j jest liczbą zmiennoprzecinkową i zawsze będzie równa ((k - 4) !!) 4 % (k - 2) / (k - 2) .

Podczas gdy k <n , właściwy argument andzostanie oceniony. Ponieważ j = ((k - 4) !!) 4 % (k - 2) / (k - 2) , jak wykazano w akapicie pierwszym, j = 1 / (k - 2), jeśli k - 2 jest liczbą pierwszą, a j = 0, jeśli nie. Podobnie, ponieważ m% k = ((k - 2) !!) 4 równa się 1, jeśli k jest liczbą pierwszą, a 0, jeśli nie, -m% k = k - 1, jeśli k jest liczbą pierwszą, i -m% k = 0, jeśli nie. Dlatego -m%k*j*2/kocenia na 2 (k - 1) / (k (k - 2)) = ((k - 2) + k) / (k (k - 2)) = 1 / k + 1 / (k - 2) jeśli para (k - 2, k)składa się z podwójnych liczb pierwszych i do 0, jeśli nie.

Po obliczeniu powyższego dodajemy wynik do wartości zwracanej wywołania rekurencyjnego f(n,k+2,m*k**4,m%k/k). k zostaje zwiększone o 2, więc przyjmuje tylko nieparzyste wartości ‡ † , mnożymy m przez k 4, ponieważ mk 4 = ((k - 2) !!) 4 k 4 = (k !!) 4 , i przekazujemy bieżącą wartość m% k / k - co równa się 1 / k, jeśli „stare” k jest liczbą pierwszą, a 0, jeśli nie - jako parametr j do wywołania funkcji.

W końcu, gdy k będzie równe lub większe niż n , f zwróci False i rekursja się zatrzyma. Zwracana wartość f (n) będzie sumą wszystkich 1 / k + 1 / (k - 2), takich jak (k - 2, k) jest podwójną parą pierwszą i k <n , zależnie od potrzeb.


Wyniki z akapitu Tło zachowują się tylko dla nieparzystych liczb całkowitych. Ponieważ nawet liczby całkowite nie mogą być liczbami podwójnymi, możemy je bezpiecznie pominąć.


Myślę, że twój wyraz twarzy jest taki sam jak m%k*(j/k+j/(k-2)).
xnor

Tak, to działa. Dzięki!
Dennis


Fajna obserwacja tego ((k-2)!!)^4 = p(k)modulo pna dziwne p. Nie przepracowałem twojego argumentu, ale oto jeden, który wymyśliłem (może to być w istocie to samo). Pracuj modulo pw zestawie {1,2,..,p-1}, wyrównania są dokładnie ujemne dla szans. Więc prod(odds) = ± prod(evens). Twierdzenie Wilsona mówi nam to prod(all) = - p(k). Ponieważ prod(all) = prod(odds) * prod(evens) = prod(odds) * ± prod(evens)mamy prod(odds)^2 = ±p(k)i tak prod(odds)^4 = p(k)^2 = p(k).
xnor

Miły! Próbowałem wyrazić tę sumę jako pojedynczą część, ale obliczenie jej w j nie przyszło mi do głowy. Dzięki jeszcze raz! Twój dowód jest o wiele prostszy niż ten z papieru.
Dennis

7

Galaretka , 15 14 bajtów

’ÆRµ_2fµ+2;µİS

Wypróbuj online!

Jak to działa

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

Galaretka , 16 14 bajtów (z niewielką pomocą @Dennis)

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

Wypróbuj online!

Próbując ulepszyć moją poprzednią odpowiedź, wymyśliłem zupełnie inny algorytm, który jest nieco krótszy. Używam do tego innego wpisu, co jest tutaj standardem dla odpowiedzi, która używa innej techniki.

Dennis sugeruje zastąpienie _/2+$$ÐḟzIċ¥Ðf2 ; Zupełnie zapomniałem o możliwości filtra dyadycznego. Jako taki, ten algorytm jest teraz powiązany z tym, którego użyła odpowiedź Dennisa.

Wyjaśnienie

’Æ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+$$Ðḟmoże zostać Iċ¥Ðf2.
Dennis

4

Brachylog , 17 bajtów

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

Wypróbuj online!

To jest zupełnie nowa wersja Brachylog z błyszczącą stroną kodową!

Wyjaśnienie

{            }ᶠ        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

3

MATL , 16 bajtów

liqZqtd2=)t2+h/s

Wypróbuj online!

Rozważ dane wejściowe 13jako przykład.

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

Mathematica, 48 47 bajtów

Dzięki JungHwan Min za oszczędność 1 bajtu!

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

Nienazwana funkcja przyjmuje dodatnią liczbę całkowitą jako dane wejściowe i zwraca dokładną część; na przykład If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]~Sum~{i,#-1}&[10]zwraca92/105 .

If[PrimeQ/@(i&&(g=i-2)),1/i+1/g,0]Sprawdza, czy oba ii i-2są pierwszymi, wracając suma ich odwrotności jeśli tak i 0jeśli nie. ~Sum~{i,#-1}&następnie zwraca sumę tych wkładów dla wszystkich wartościi mniejszych niż dane wejściowe.

Poprzednie zgłoszenie:

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

To jest po prostu straszne. Poddaję się. ⚐
LegionMammal978

Zastanawiałem się, czy „dokładna część” oznacza Mathematica :)
Greg Martin

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

Można uzyskać liczbę o dowolnej dokładności, dodając dwa bajty N@przed kodem.
JungHwan Min

Niezła gra w golfa! To prawda, że Nzwraca dziesiętne przybliżenie do liczby rzeczywistej; wymaga to jednak dodatkowych bajtów, aby wyświetlić więcej niż 6 fig sig, i bez względu na liczbę wyświetlanych fig sig, nadal jest mniej dokładna niż sama frakcja.
Greg Martin

2

Oktawa, 45 bajtów

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

Wyjaśnienie:

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  

Wypróbuj online!


2

JavaScript (ES6), 67 66 bajtów

Zapisano 1 bajt dzięki @Arnauld

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

Dane wyjściowe falsedla przypadku testowego 2, który jest domyślnie dozwolony .

Testowy fragment kodu


Myślę, że 1/n+++1/++noszczędza bajt.
Arnauld

@Arnauld Thanks. Z jakiegoś powodu nie wiedziałem, że +++nie zawsze powoduje to błąd ...
ETHproductions


1

Galaretka , 19 bajtów

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

Wypróbuj online!

Mam wrażenie, że można to poprawić, ale nie od razu widzę, jak to zrobić.

Wyjaśnienie

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

W µPołącz wszystkie te elementy razem rurociąg stylu, z każdym biorąc wyjście jednego zanim jako jego wejścia.



1

Perl 6 , 59 51 bajtów

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

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

-2..* Z ^$_zamyka nieskończoną listę -2, -1, 0, 1, ...listą 0, 1, ... $_-1( $_będącą argumentem funkcji), tworząc listę(-2, 0), (-1, 1), (0, 2), ..., ($_-3, $_-1) . (Oczywiście żadna z tych liczb mniejszych niż 3 nie może być w pierwszej parze, ale 3..* Z 5..^$_jest o kilka bajtów dłuższa i żadna z dodatkowych liczb nie jest liczbą pierwszą).

The grep wybiera tylko te pary, gdy wszystkie (to jest zarówno) Liczby Prime i flatspłaszcza je w zwykły listę numerów.

«/»jest hiperoperatorem podziału; z listą po prawej i 1po lewej stronie zmienia listę par pierwszych w ich odwrotność, którą następnie sumuje sum.


1

Clojure, 147 bajtów

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

A Clojure jak zwykle jest martwy.

Nie golfowany:

; 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

Narzędzia Bash + GNU, 86 85 bajtów

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

Wypróbuj online!

Konstruuje duże wyrażenie arytmetyczne, a następnie podaje je do bc -l do oceny.

Edycja: błędnie pozostawiony w parze $ (...) ze starej wersji z zagnieżdżonym zastępowaniem poleceń; zmieniono na backticks, aby zapisać bajt.


0

APL NARS, 216 bajtów, 108 znaków

  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

użyłoby to „Crivello di Eratostene” do znalezienia podlisty w 1..arg liczb pierwszych żądań. Test:

  z¨2 6 10 13 100 620
0 0.5333333333 0.8761904762 0.8761904762 1.330990366 1.499970603 
  z 100000
1.672799585
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.