プライムギャップを見つける


27

プライムギャップは、2つの連続するプライムの差です。より具体的には、pqp < qで素数で、p +1、p +2、...、q -1が素数でない場合、素数pqn = qpのギャップを定義します。ギャップはpから始まり長さnを持つと言われています。

任意の大きな素数ギャップが存在することが知られています。つまり、nが与えられた場合、長さn以上のプライムギャップが存在します。ただし、長さが正確にnのプライムギャップは存在しない場合があります(ただし、大きいギャップは存在します)。

チャレンジ

正の整数を指定するとn、長さn以上のギャップを開始する最初の素数を出力します。

例として、入力の場合4、出力はである必要があります7。7と11は、少なくとも4だけ異なる最初の連続した素数であるためです(前のギャップは、1から2から3、2から3から5、2から5です。 7)。入力について3は、答えも7(長さ3のギャップがない)である必要があります。

追加規則

  • アルゴリズムは、理論的には任意の高さで機能するはずnです。実際には、プログラムが時間、メモリ、またはデータ型のサイズによって制限されている場合でも問題ありません。

  • 入出力は合理的な手段で取ることができます。

  • すべてのプログラミング言語でプログラムまたは機能が許可されます。標準的な抜け穴は禁止されています。

  • バイト単位の最短コードが優先されます。

テストケース

Input -> Output

1        2
2        3
3        7
4        7
6        23
10       113
16       523
17       523
18       523
30       1327
50       19609
100      370261
200      20831323


pqとはqpを意味しますか?
エリックアウトゴルファー

@EriktheOutgolferはい。修正、ありがとう!
ルイスメンドー


回答:


3

ガイア、6バイト

zṅọ⊃∆ṇ

これは非常に非効率的です(16テストケースが私のマシンで計算するのに1時間以上かかりました)。

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

説明

シーケンスにはa(n)<= 2 ^ nというプロパティがあるようです。

z       Push 2^input.
 ṅ      Get the first 2^input prime numbers.
  ọ     Get the deltas of the list.
   ⊃∆   Find the index of the first that is greater than or equal to the input.
     ṇ  Push the index-th prime number.

9

ゼリー10、9、8つの、10バイト

Æn_$:ð1#»2

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

@Dennisのおかげで2バイト節約できました!(そして、エッジケースのために再び追加されました)

説明:

Æn          #   The next prime after 'P'
  _$        #   Minus 'P'
    :       #   Divided by 'N'
            #
            # This will give a falsy value unless the distance to the next prime is >= N
            #
     ð      # Treat all of that as a single dyad (fucntion with two arguments). 
            # We'll call it D(P, N)
            #
      1#    # Find the first 'P' where D(P, input()) is truthy
        »2  # Return the maximum of that result and 2

結果が常に入力以上であることが確実にわかりますか?(#ここでの入力からカウントアップします)これを仮定するのは合理的と思われますが、私にとっては、それが有効な仮定であるかどうかはわかりません。編集:FYIで修正する(必要な場合)接頭辞
ジョナサンアラン

5
@JonathanAllan Bertrandの仮定は、素数のギャップが素数自体より厳密に小さいことを暗示しています。
デニス

@Dennis素晴らしいありがとうございます!TMYK ...
ジョナサン・アラン

4

Mathematica、30バイト

2//.x_ /;NextPrime@x-x<#:>x+1&

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

Mathematica、35バイト

(t=2;While[NextPrime@t-t<#,t++];t)&

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

Mathematica、77バイト

Prime@Min@Position[s=Differences@Prime@Range[(r=#)^3+1],#&@@Select[s,#>=r&]]&

賢い賢い...両方を確認する必要はなくpq素数である...最初のコードは無効であるように見えるMaxIterations
ジョンファンミン

また、35バイトバージョンでは-2バイト:(For[t=2,NextPrime@t-t<#,t++];t)&
ジョンファンミン

4

Haskell106102 93 77 73 72バイト

これにより、まず素数の無限リストが生成され、次に素数のギャップが検索されます。プライムリストはここから取っ。おそらく短縮できますが、まだどのようになっているかわかりません:)

-4バイトの@BruceForteと-1バイトの@Zgrabに感謝します!

f n=[x|(y,x)<-zip=<<tail$[n|n<-[2..],all((>0).rem n)[2..n-1]],y-x>=n]!!0

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


もちろん、いくつかのモナドの魔法があります、ありがとう:)
flawr

zip=<<tail$[...]バイトを保存します。
-Zgarb

「これは最初に無限の素数のリストを生成し、それから...」:それで、決して起こらないはずですか?(つまり、無限に長い時間、手続き的に素数の無限リストを「最初に生成する」時間の後にのみ発生します)
オリビエデュラック

1
Haskellは遅延評価を使用するため、実際に使用されるのと同じ数のエントリのみが生成されます。したがって、これらの素数は、実際にポイントを見つけるまで生成されます。試してみるとn、有限時間後に停止することがわかります:)(Haskellは手続き型ではなく、遅延評価を備えた関数型言語です。)
flawr

1
まあ、それは無限のリストであり、定義により終わりはありません。私が説明したのは、通常のインタープリターの内部で起こっていることだけですが、それは言語の一部として指定されていないため、それを伝えることはできません!
-flawr

3

Pyth-14バイト

[1、inf)からフィルタリングし、primality(P_)でフィルタリングし、(n、inf)からフィルタリングされた次の素数は、入力に対して異なる> =を持ちます。

f&P_T<tQ-fP_Yh

テストスイート


3

PowerShell97 96 91バイト

param($n)for($a=$b=2){for(;'1'*++$b-match'^(?!(..+)\1+$)..'){if($b-$a-ge$n){$a;exit}$a=$b}}

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

入力を受け取り$n、に設定し$a、に$b等しくしてから2、無限forループに入ります。内部では、次のプライムに到達する$bまでループします。次に、(ギャップ)がreaterthanor と等しいかどうかを確認します。そうである場合、とを出力します。それ以外の場合は、に設定し、増分して次の検索を開始します。$b-$a-ge$n$aexit$a$b$b

警告:これは、大きな入力の場合は低速です。実際、50TIOの60秒のタイムアウト内にテストを完了することはできません。しかたがない。



3

Mathematica、39バイト

(For[i=2;p=NextPrime,i+#>p@i,i=p@i];i)&
(* or *)
(For[i=1;p=Prime,p@i+++#>p@i,];p[i-1])&

33バイトバージョン(65535番目の素数にしかならないため無効)

p=NextPrime;2//.i_/;p@i-i<#:>p@i&



2

Mathematica、37バイト

gNestWhile[p=NextPrime,2,p@#-#<g&]

Function最初の引数付きg。で始まる2関数は、与えp=NextPrimeられている限り繰り返し適用されp@#-#<g&ますTrue(現在の素数と次の素数のギャップは未満ですg)。


2

R + gmp、55バイト

gmpライブラリのnextprime関数を使用します

s=2;n=scan();while((x=gmp::nextprime(s))-s<n)s=x;cat(s)

cat(s)最後に追加する必要があります。暗黙的な印刷は、完全なプログラムでは機能しません。
-JAD


2

C = 141 109バイト; C ++、D = 141バイト。C#、Java = 143バイト

警告:低パフォーマンスアルゴリズム

このコードは、g(200)10分以内にプライムギャップを計算できませんでした。のためにg(100)、それは10秒を必要としました(C ++バージョン)

C ++およびDバージョン:

int p(int d){for(int i=2;i<=d/2;++i){if(!(d%i))return 0;}return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do{++n;}while(!p(n));}return f;}

C#およびJavaバージョン:

int p(int d){for(int i=2;i<=d/2;++i){if(d%i==0)return 0;}return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do{++n;}while(p(n)==0);}return f;}

Cバージョン、ceilingcatのおかげで-32バイト:

i;p(d){for(i=2;d/2/i;)if(!(d%i++))return 0;return 1;}f;n;g(d){for(f=2,n=3;n-f<d;)for(f=n;!p(++n););return f;}

C#/ JavaバージョンとC / C ++ / Dバージョンの違い:!p(n)<==>p(n)==0


逆にすることができますreturn 0; return 1し、削除!の前にp(++n)
ceilingcat

d%i==0!(d%i)することができますd%i<0。また、Dのテンプレートシステムを使用すると、Dのソリューションは次のようになりますT p(T)(T d){for(T i=2;i<=d/2;++i)if(d%i<1)return 0;return 1;}T g(T)(T d){T f=2,n=3;while(n-f<d){f=n;do++n;while(!p(n));}return f;。(後の括弧の除去fordo同様にC ++に適用される場合があります)
ザカリー

C / C ++ / C#/ JavaにはないD固有のトリックを利用する別のDバージョンを投稿しました。
ザカリー

int p(int d){for(int i=2;i<=d/2;++i)if(!(d%i))return 0;return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do++n;while(!p(n));}return f;}< -それはC ++バージョンのために働くべきである
ザカリー

2

D、127の 125 122バイト

警告:低パフォーマンスアルゴリズム!!

T p(T)(T d){T r;for(T i=2;i<=d/2;)r=d%i++<1||r;return r;}T g(T)(T d){T f=2,n=3;while(n-f<d){f=n;while(p(++n)){}}return f;}

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

どうやって?

再びHatsuPointerKunですが、D固有のソーサリーを行います。

  • テンプレートシステムは型を推測できT p(T)(T d)、C ++よりも短い
  • r=d%i++<1||r、D固有のシェナンガンは、C / C ++で動作する可能性がありますが、わかりません。
  • p(++n)、上記と同じ、C / C ++で動作するかどうかわからない
  • while(p(++n)){}ここで、Dがゴルフが苦手な理由がわかり;ます。空の文として使用することはできません。


1

QBIC、28バイト

{~µs||~s-r>=:|_Xr\r=s]]s=s+1

説明

{         DO
~µs||     IF s is prime THEN (note, s starts as 3)
~s-r>=:   IF the gap between s (current prime) and r (prev prime) is big enough
|_Xr      THEN QUIT, printing prev prime r
\r=s      ELSE (gap too small, but s is prime), set r to prime s
]]        END IF x2, leaving us in the WHILE
s=s+1     increment s, retest for primality ...

1

05AB1E、9 バイト

∞<ØD¥I@Ïн

オンラインそれを試してみたり、すべてのテストケースを確認してください。(テストスイートには、最後の2つのテストケースが含まれていません。これらのテストケースではTIOがタイムアウトになるためです。)

他の質問はこの質問のだまし込みとして閉じられているのでここにも回答を掲載しいます。

説明:

           # Get an infinite list in the range [1, ...]
 <          # Decrease it by one to make it in the range [0, ...]
  Ø         # Get for each the (0-indexed) n'th prime: [2,3,5,7,11,...]
   D        # Duplicate this list of primes
    ¥       # Get all deltas (difference between each pair): [1,2,2,4,2,...]
     I@     # Check for each if they are larger than or equal to the input
            #  i.e. 4 → [0,0,0,1,0,1,0,1,1,0,...]
       Ï    # Only keep the truthy values of the prime-list
            #  → [23,31,47,53,61,...]
        н   # And keep only the first item (which is output implicitly)
            #  → 23

1

Java 8、99 92バイト

n->{int a=2,b=3,f,k;for(;b-a<n;)for(f=0,a=b;f<2;)for(f=++b,k=2;k<f;)f=f%k++<1?0:f;return a;}

オンラインでお試しください。(TIOでタイムアウトになるため、最大のテストケースは除外されます。)

説明:

n->{               // Method with integer as both parameter and return-type
  int a=2,b=3,     //  Prime-pair `a,b`, starting at 2,3
      f,           //  Prime-checker flag `f`, starting uninitialized
      k;           //  Temp integer, starting uninitialized
  for(;b-a         //  Loop as long as the difference between the current pair of primes
          <n;)     //  is smaller than the input
    for(f=0,       //   (Re)set the prime-checker flag to 0
        a=b;       //   Replace `a` with `b`, since we're about to search for the next prime-pair
        f<2;)      //   Inner loop as long as the prime-checker flag is still 0 (or 1)
                   //   (which means the new `b` is not a prime)
      for(f=++b,   //    Increase `b` by 1 first, and set this value to the prime-checker flag
          k=2;     //    Set `k` to 2
          k<f;)    //    Inner loop as long as `k` is still smaller than the prime-checker flag
        f=         //     Change the prime-checker flag to:
          f%k++<1? //      If the prime-checker flag is divisible by `k`
           0       //       Set the prime-checker flag to 0
          :        //      Else:
           f;      //       Leave it unchanged
                   //    (If any integer `k` in the range [2, `b`) can evenly divide `b`,
                   //     the prime-checker flag becomes 0 and the loop stops)
  return a;}       //  And finally after all the nested loops, return `a` as result

1

きちんとした、33バイト

{x:({v:⊟v<=-x}↦primes+2)@0@0}

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

または、28文字/ 34バイト: {x:({v:⊟v≤-x}↦primes+2)@0@0}

これを、同等のASCII同等物を使用して説明します。

{x:({v:(-)over v<=-x}from primes+2)@0@0}
{x:                                    }    lambda w/ parameter `x`
                          primes+2          overlapping pairs of primes
                                            [[2, 3], [3, 5], [5, 7], ...]
    {v:             }from                   select prime pairs `v = [a, b]`...
       (-)over v                            ...where `a` - `b`...
                <=-x                        is <= `x`
   (                              )@0@0     select the first element of the first pair

1

APL(NARS)、36文字、72バイト

∇r←h w;k
r←2
→0×⍳w≤r-⍨k←1πr⋄r←k⋄→2
∇

1πは関数「次の素数」です。テスト:

  h¨1 2 3 4 6 10 16 17 18 30 50 100 200
2 3 7 7 23 113 523 523 523 1327 19609 370261 20831323  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.