フェルマー素数の生成


10

数値nを指定して、n番目の素数フェルマー数を出力します。フェルマー数は2 2 k +1の形式です。このコードは、理論的にはどのnでも機能します(つまり、ハードコードしないでください)。ただし、n> 4で終了することは想定されていませ(4294967297は素数ではないため、n = 5の場合は4294967297を返しません。)

すべてのフェルマー素数は2 2 n +1の形式ですが、2 2 n +1 形式のすべての数が素数ではないことに注意してください。このチャレンジの目標は、n番目の素数を返すことです。

テストケース

0 -> 3
1 -> 5
2 -> 17
3 -> 257
4 -> 65537

ルール

  • 標準の抜け穴は許可されていません。
  • 0インデックスと1インデックスはどちらも使用できます。
  • これは、バイト数が最も少ない勝利です。

関連:構築可能なnゴン


1
私か、またはいくつかの回答が課題を誤解していますか?を出力するプログラムを単に作成しているの2^(2^n) + 1nはなく、入力はどこにあるのでしょうか。これは、テストケースと一致します(これは既にプライムであるため、確認する必要はありません)。また、プログラムがn> 4で機能することを期待していません(n = 5が最初の非素数です)。
jstnthms 2017

プログラムは理論的にはn> 4で機能するはずですが、5つのフェルマー素数しか知らないため、実際には機能しません。
poi830 2017

既知の用語は5つしかないため、フェルマーのすべての素数を理論的に処理する目的がよくわかりません。
Xcoder氏2017

2
@CodyGrayこれはで機能するため、テストケースは誤解を招く可能性がありn=1:4ます。すべてのフェルマー素数はの形式2^2^n+1ですが、それは、形式のすべての数2^2^n+1が実際に素数であることを意味しません。これの場合ですがn=1:4n=5たとえばそうではありません。
JAD 2017

3
混乱の一部は、入力はでnあり、出力はの形式でなければならないということです2^(2^n)+1。入力と指数に異なる変数を使用すると、混乱が少なくなる可能性があります。「n = 5は妥当な時間内に出力する必要はないが、4294967297を出力してはならない」と明示的に述べると役立つ場合もあります
Kamil Drakari

回答:



3

ゼリー13 11バイト

ÆẸ⁺‘©ÆPµ#ṛ®

1ベースのインデックスを使用します。

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

使い方

ÆẸ⁺‘©ÆPµ#ṛ®  Main link. No argument.

        #    Read an integer n from STDIN and call the chain to the left with
             arguments k = 0, 1, 2, ... until n matches were found.
ÆẸ           Find the integer with prime exponents [k], i.e., 2**k.
  ⁺          Repeat the previous link, yielding 2**2**k.
   ‘         Increment, yielding 2**2**k+1 and...
    ©        copy the result to the register.
     ÆP      Test the result for primality.
          ®  Yield the value from the register, i.e., the n-th Fermar prime.
         ṛ   Yield the result to the right.

ああ、それで結果をクリアするために使用する... TIL
Leaky Nun

ああ、だから、1つの整数のÆẸ代わりに使用し2*ます... TIL
Erik the Outgolfer 2017

2

Perl 6の 45の  42バイト

{({1+[**] 2,2,$++}...*).grep(*.is-prime)[$_]}

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

{({1+2**2**$++}...*).grep(*.is-prime)[$_]}

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

拡張:

{  # bare block lambda with implicit parameter 「$_」

  (  # generate a sequence of the Fermat numbers

    {
      1 +
      2 ** 2 **
        $++            # value which increments each time this block is called
    }
    ...                # keep generating until:
    *                  # never stop

  ).grep(*.is-prime)\  # reject all of the non-primes
  [$_]                 # index into that sequence
}




0

05AB1E、8バイト

コード:

結果は1インデックスです。

µN<oo>Dp

05AB1Eエンコーディングを使用します。オンラインでお試しください!

説明:

µ              # Run the following n succesful times..
 N             #   Push Nn
  oo           #   Compute 2 ** (2 ** n)
    >          #   Increment by one
     D         #   Duplicate
      p        #   Check if the number is prime
               # Implicit, output the duplicated number which is on the top of the stack

0

JavaScript、12 46バイト

k=>eval('for(i=n=2**2**k+1;n%--i;);1==i&&n')

ほとんどのコードは、ここからのプライムチェックによって取り上げられます


n番目のフェルマー数だけでなく、n番目の素数フェルマー数を返す必要があることに注意してください。
poi830 2017

@ poi830は、プライムチェックがほとんどの機能を占めるようになりました:(
SuperStormer

ここでもゼロが良いので、i == 1の代わりにi <2と言えると思いますか?2バイトになるはずです
DanielIndie

0

Dyalog APL(29文字)

これは改善できると確信しています。

{2=+/0=(⍳|⊢)a←1+2*2*⍵:a⋄∇⍵+1}

これは、1 + 2 ^ 2 ^⍵の約数をチェックする再帰関数です。ここで、⍵は関数の右引数です。除数の数が2の場合、数値は素数であり、それを返します。それ以外の場合は、⍵+ 1を右引数として関数を再度呼び出します。

{2=+/0=(⍳|⊢)a←1+2*2*⍵:a ⋄ ∇ ⍵+1}¨⍳4
      5 17 257 65537

ここでは、⍳4(1から4の数字)のそれぞれで関数を呼び出します。それは順番にそれをすべての数に適用します。


0

Haskell、61バイト

p n=2^2^n;f=(!!)[p x+1|x<-[0..],all((>)2.gcd(p x+1))[2..p x]]

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

0ベースのインデックス

説明

p n=2^2^n;                                          -- helper function 
                                                    -- that computes what it says
f=                                                  -- main function
  (!!)                                              -- partially evaluate 
                                                    -- index access operator
      [p x+1|                                       -- output x-th fermat number
             x<-[0..],                              -- try all fermat number indices
                      all                 [2..p x]  -- consider all numbers smaller F_x
                                                    -- if for all of them...
                         ((>)2                      -- 2 is larger than...
                              .gcd(p x+1))          -- the gcd of F_x 
                                                    -- and the lambda input 
                                                    -- then it is a Fermat prime!   
                                                  ]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.