バートランドの素数


24

ベルトランの仮説は、すべての整数のためと述べているN≥1少なくとも一つの素数が存在したpように、N <P≤2nのはn <4000のこの定理を検証するために、4000のケースをチェックする必要はありません。Landauのトリックは、

2, 3, 5, 7, 13, 23, 43, 83, 163, 317, 631, 1259, 2503, 5003

すべてが素数です。これらの各数値はその前身の2倍未満であるため、各区間{y:n <y≤2n}にはこれらの素数の少なくとも1つが含まれます。

この一連の数字は、バートランド素数(OEIS A006992)であり、次のように定義されています。

a(1) = 2
a(n) = largest prime below 2a(n-1)

チャレンジ

このシーケンスを実装します。あなたは書くことができます

  • nを指定した関数またはプログラムがa(n)(0または1のインデックス)を返します。
  • nを指定した関数またはプログラムは、このシーケンスの最初のn(またはn-1またはn + 1)エントリを返します。
  • 無限のリスト、ストリーム、ジェネレーター、または同様の言語の同等物。

回答:


8

オクターブ、32バイト

k=2
do k=primes(k+k)(end)until 0

値を無期限に印刷し続けます(各値の前にはが付きますk =)。

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


オクターブ、42バイト

k=2
for i=2:input('')k=primes(k+k)(end)end

入力としてnを取り、n個の最初の値を出力します(各値の前にはk =)。

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


オクターブ、51バイト

k=2;for i=2:input('')k=primes(k+k)(end);end
disp(k)

ルイスメンドーのMATL回答に似ています。入力としてnを取り、a(n)(1インデックス付き)を出力ます。

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


オクターブ、60バイト

k=2;for i=2:input('')k*=2;while~isprime(--k)
end
end
disp(k)

入力としてnを取り、a(n)(1インデックス付き)を出力ます。

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




6

05AB1E14 7 6バイト

$F·.ØØ

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


1インデックスの回答(0が1を出力することになっていない場合)、説明:

$       # Push 1 and input (n)...
 F      # n-times do... 
  ·     # Double the current prime (first iteration is 1*2=2).
   .ØØ  # Find prime slightly less than double the current prime.

すべての反復にはの「ダミー」反復があるため、1インデックスが付けられますn=1


Fx.ØØはとても近い...上記のすべての作品n > 2
魔法のタコ

1
私は$F·ÅPθ同じバイト数でした。
エミグナ

@エミグナは持っていた?それは0%同じハハのようなものです。技術的には同じですが、そうではありません。まだ投稿できました; P。
魔法のタコ


5

ゼリー、6バイト

2ḤÆp$¡

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

0インデックス。

説明

2ḤÆp$¡  Main link. Input: n
2       Constant 2
    $¡  Repeat n times
 Ḥ        Double
  Æp      Find the largest prime less than the double

ポーク必要な別のバイトを今すぐ;)...
マジックタコ壺

@MagicOctopusUrn入力0は2を返し、1は3を返します。問題は見当たりません。
マイル

勝つためには、この回答に1バイトを保存する必要があることを意味しました。なぜなら、私はあなたを6バイトに縛り付けたからです。あなたの答え自体は素晴らしいです。
魔法のタコUr


5

スタックス、10 バイト

ü☼┌τ,æ▒ìn(

テストケースを実行する

この問題により、staxの実装のバグが明らかになりました。 :p、。これは、入力よりも最大の素数が少ない命令です。正しく動作した場合、5 6バイトのソリューションがあります。 しかし、悲しいかな、それはありませんし、ありません。 言語の作成者として、私はそれを修正しますが、問題が投稿された後に修正して使用するのは少し安いようです。

とにかく、ここに上記のプログラムの対応するASCII表現があります。

ODH{|p}{vgs

これは、問題ステートメントの比較的簡単な実装です。それについておそらく興味深いものは、gsジェネレーター形式の。ジェネレーターは、初期条件、変換、およびフィルターを組み合わせて1つ以上の満足できる値を生成する構成のファミリーです。この場合、破損した:p命令の代わりに使用されます。

O               Push integer 1 underneath the input number.
 D              Pop the input and repeat the rest of the program that many times.
  H             Double number.
   {|p}         Predicate block: is prime?
       {vgs     Decrement until the predicate is satisfied.
                Output is implicitly printed.

編集: ここに 6バイトのソリューションがありますが、このチャレンジが投稿された後にのみ適用されるバグ修正が必要です。


素敵な言葉!ゴルフラングのリストに追加しました。何か間違いがあった場合や、他に何か追加したいことがある場合はお知らせください。
ETHproductions

@ETHproductions:いいね、ありがとう!気にしない場合は、インタープリターのURLをstaxlang.xyz に変更してもらえますか私はそのドメインを取得することにしました。
再帰的

1
うわー、ゴルフ言語のためだけのドメイン全体?ラッキーエソラン;)更新!
ETHproductions

@recursive WOW、xyzドメインごとに1.99ドル?私がいる
マジックタコ

4

Python 2、63バイト

r=m=k=P=2
while k:
 P*=k;k+=1
 if k>m:print r;m=r*2
 if P%k:r=k

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

永遠に印刷します。

前方に素数を生成することはこの問題には扱いにくいですが、ウィルソンの定理素数ジェネレータを使用します。現在見られる最大の素数rと倍増境界を追跡しますmます。

唯一の効果は4が素数であると主張することであり、2倍のシーケンスがそれを逃すため、通常P*=kよりも2バイト保存されますP*=k*k


4

CJam(15バイト)

2{2*{mp},W=}qi*

オンラインデモ。これは0から始まることに注意してください。


より効率的なアプローチは逆方向に検索することですが、暗黙の,(範囲)を使用できないため、これにはもう1文字が必要です。

2{2*,W%{mp}=}qi*

4

Japt16 14 13 12バイト

1つの価格で2つのソリューション、どちらも1インデックス付き。


N期

最後に、を使用するための実用的なソリューションを作成することができる挑戦F.g()

_ôZ fj Ì}g°U

それを試してみてください

                 :Implicit input of integer U
_       }g       :Starting with the array [0,1] take the last element (Z),
                 :pass it through the following function
                 :and push the returned value to the array
 ôZ              :  Range [Z,Z+Z]
    fj           :  Filter primes
       Ì         :  Get the last item
          °U     :Repeat that process U+1 times and return the last element in the array

最初のN用語

ÆV=ôV fj ̪2

それを試してみてください

                 :Implicit input of integer U
                 :Also makes use of variable V, which defaults to 0
Æ                :Create range [0,U) and pass each through a function
  ôV             :  Range [V,V+V]
     fj          :  Filter primes
        Ì        :  Get the last item
         ª2      :  Logical OR with 2, because the above will return undefined on the first iteration
 V=              :  Assign the result of the above to V





2

C(gcc)97 87 86 80 79バイト

  • 非原始性チェック関数をインライン化することで10バイトを節約しました Pループをメインループにました。
  • を移動してバイトを保存しました printf呼び出しを。
  • を返すことによって6バイトを保存しました i終わりのないストリームを出力する代わりに -thシーケンスエントリ(インデックスが0)を。
  • ceilingcatのおかげで1バイト節約できました
f(p,r,i,m,e){for(r=2;p--;)for(e=0,i=r+r;e=m=!e;r=i--)for(;i-++m;e=e&&i%m);p=r;}

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


@ceilingcatありがとうございます。
ジョナサンフレッチ

1

アタッシュ、38バイト

{If[_,Last[Series[Prime,2*$[_-1]]],2]}

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

0ベース。n番目のベルトランド素数を返します。

現在、前/次の素数を見つけるための組み込みはないので、私は Series組み込み関数までのすべての素数を計算し2*$[_-1]ます。この最後の式は、暗黙的な再帰(にバインド$)を使用して、再帰関係を簡単に定義します。if条件は、基本条件を決定するために使用されます。



1

網膜、39バイト

.K`_
"$+"{`_
__
+`^(?=(..+)\1+$).

*\`_

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

.K`_

1から始めます。

"$+"{`

入力をループカウントとして使用してループを繰り返します。

_
__

値を2倍にします。

+`^(?=(..+)\1+$).

値よりも小さい最高素数を見つけます。

*\`_

印刷する。


0

Ruby、51 + 7(-rprime)= 58バイト

->n{x=2
n.times{x=(x..2*x).select(&:prime?)[-1]}
x}

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

0インデックス付きのバートランドプライムを受け入れnて返すランバnth。ここにはあまりありませんが、とにかく私にそれを聞かせてください:

->n{
  x=2                       # With a starting value of 2
  n.times{                  # Repeat n times:
    x=(x..2*x)              # Take the range from x to its double
      .select(&:prime?)[-1] # Filter to only primes, and take the last
  }
  x                         # Return
}

ルビー、48 + 7 = 55バイト

x=2
loop{puts x
x*=2
loop{(x-=1).prime?&&break}}

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

楽しみのために、ここに無限ループのソリューションがあります。そのまま印刷され、割り込みが必要です。中断するタイミングに応じて、出力が表示される場合と表示されない場合があります。ゴルフをしていない:

x=2
loop{
  puts x
  x*=2
  loop{
    (x-=1).prime? && break
  }
}

0

APL(Dyalog Extended)、12バイト

ユーザーからの入力をNとして取得し、シーケンスのN番目の要素(0インデックス)を返します。

42×⍵}⍣⎕⊢2

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

説明:

42×⍵}⍣⎕⊢2  Full program
              Get input from user - call it 'N'
          2  Repeat the left function N times, beginning with 2
    2×⍵        Double the function input
 ¯4           Find the largest prime less than above

0

R、87バイト

与えられたn出力a(n)

j=scan();n=2;while(j-1){for(i in (n+1):(2*n)){n=ifelse(any(i%%2:(i-1)<1),n,i)};j=j-1};n

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

私はまだ「与えられたn出力a(1)、a(2)... a(n)」に取り組んでいます。このコードを少し変更するだけでいいと思いましたが、それよりも難しいようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.