おおよそのブラン定数


25

ブルンの定数は、の逆数の和に値である双子プライムペア(1/p1/(p+2)場所pp+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はい、明確にします。
メゴ

サイドノート:Brunの定数の値1.902160583104 ...は推測のみです。最初の有効数字でさえ厳密に計算されていません(つまり、2より大きいか小さいかさえわかりません)。
グレッグマーティン

@GregMartinそれは本当ですが、それは現在持っている最良の近似でもあります。
メゴ

5は、2つの素数ペアで表示される唯一の素数
クリスチャンジーバーズ

回答:


25

Pythonの378の 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)

2 4バイトのゴルフを楽しみ、さらに4バイトの道を開いてくれた@xnorに感謝します!

オンラインでお試しください!

バックグラウンド

リコールそのウィルソンの定理のように述べているすべての整数についてのk> 1

ここで、a≡b(mod d)は、a-bdで均等に割り切れることを意味します。つまり、abdで除算すると同じ残基を持ちます。

ダブルクリッ、ハイパー、サブのスーパー-階乗のためのウィルソンの定理、著者はこの答えが構築されている二重階乗のための一般化を証明します。整数k≥0二重階乗は次のように定義されます

前述の論文の定理4は次のように述べています。

合同の両側を第4乗に引き上げると、

すべての奇数の素数pに対して1以来!! = 1の場合、p = 2の場合も同等です。

さて、ウィルソンの定理に対して同じことを行うと、

以来

それに続く

いつでもpは素数です。

ここで、kを奇数の正の合成整数とします。定義により、k = abであるような整数a、b> 1が存在します。

以来、kが奇数であるので、ありそしてBが。したがって、両方ともシーケンス1、3、…、k-2および

どこ| 可分性を示します。

合計すると、すべての奇数の整数k> 1

ここで、P(k)= 1の場合、kは素数であり、P(k)が= 0ならばkは複合体です。

使い方

関数の場合fは単一の引数と呼ばれ、KM、及びJに初期化されている31、および0

なお- (2)!(K)4 = 1!4 = 1 = M。実際、等式m =((k-2)!!)4は常に成り立ちます。jフロートであり、常に((k-4)!!)4%(k-2)/(k-2)に等しくなります。

一方で、K <Nの右引数がand評価されます。以来( - 4)!!(k)はJ = 4%(K - 2)/(K - 2) 、最初の段落で証明されるよう、- J = 1 /(2 k)の場合、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と評価/(K(K - 2))=((K - 2)+ K)/(K(K - 2))= 1 / K + 1 /(K - 2) - 2(1 K)ペアの場合(k-2、k)双子の素数で構成され、そうでない場合は0になります。

上記を計算した後、再帰呼び出しの戻り値に結果を追加しますf(n,k+2,m*k**4,m%k/k)kがインクリメントされます2それだけで奇数の値をとるように‡†、我々乗算MによってK 4のでMK 4 - =(2)!(K)4、K 4 =(K!)4、及び電流値を渡しますm%k / k – 「古い」kが素数の場合は1 / kに等しく、そうでない場合は0 – 関数呼び出しのパラメーターjとして。

最後に、kn以上になると、fFalseを返し、再帰は停止します。f(n)の戻り値は、すべての1 / k + 1 /(k-2)の合計になります。たとえば、(k-2、k)はツインプライムペアで、k <nです。


背景段落の結果は、奇数の整数に対してのみ有効です。整数であっても双子の素数にはならないため、安全にスキップできます。


あなたの表現はと同じだと思いますm%k*(j/k+j/(k-2))
-xnor

はい、動作します。ありがとう!
デニス


odd を((k-2)!!)^4 = p(k)法とする素晴らしい観測。私はあなたの議論に取り組んできませんでしたが、ここに私が思いついたものがあります(本質的には同じかもしれません)。セットでモジュロで動作します。偶数はオッズの負数です。だから、。ウィルソンの定理があることを教えてくれる。以来、私たちは持っ ています。ppp{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

Jelly16 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ます。
デニス

4

Brachylog、17 バイト

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

オンラインでお試しください!

これは、光沢のあるコードページを持つBrachylogの真新しいバージョンです!

説明

{            }ᶠ        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バイト

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

Mathematica、48 47バイト

1バイト節約してくれたJungHwan Minに感謝します!

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}&
ジョンファンミン

N@コードの前に2バイトを追加することにより、任意精度の数値を取得できます。
ジョンファンミン

コンディションの良いゴルフ!N実数の小数近似を返すのは事実です。ただし、6個以上のsigイチジクを表示するためには余分なバイトが必要です。また、表示されるsigイチジクの数に関係なく、フラクション自体よりも正確性は劣​​ります。
グレッグマーティン

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バイト

@Arnauldのおかげで1バイト節約

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の出力を取ると一緒にすべてのこれらの部分のパイプラインスタイル、接続。



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

これは、リクエストプライムの1..argのサブリストを見つけるために「Crivello di Eratostene」を使用します。テスト:

  z¨2 6 10 13 100 620
0 0.5333333333 0.8761904762 0.8761904762 1.330990366 1.499970603 
  z 100000
1.672799585
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.