产生费马素数


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-gons


1
我还是某些答案曲解了挑战?我们不是简单地编写一个输出程序,输入2^(2^n) + 1在哪里n?这与您的测试用例一致(我们知道它们已经是主要的,因此无需检查)。而且,您不希望程序在n> 4(并且n = 5是第一个非素数)的地方工作。
jstnthms

该程序理论上应在n> 4的情况下运行,尽管实际上这将永远无法工作,因为我们只知道5个Fermat素数。
poi830

由于只有5个已知术语,因此我真的不了解理论上为所有Fermat素数工作的目的。
Xcoder先生17年

2
@CodyGray测试用例具有误导性,因为它适用于n=1:4。所有fermat素数都是形式2^2^n+1,但这并不意味着该形式的所有数字2^2^n+1实际上都是素数。这对的情况下n=1:4,而不是n=5例如。
JAD

3
我认为混淆的一部分是您在说输入是n,而输出必须是形式2^(2^n)+1。如果对输入和指数使用不同的变量,则可能会减少一些混乱。如果您明确声明“ n = 5不需要在合理的时间内输出,但一定不能输出4294967297”,这也可能会有所帮助
Kamil Drakari

Answers:



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

哦,所以用ÆẸ而不是2*一个整数... TIL
长跑运动员埃里克(Erik the Outgolfer)

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

Pyth,14个字节

Lh^2^2byfP_yTQ

在线尝试。

xnor在另一个问题中的回答 “借用了”主要思想

Lh^2^2byfP_yTQ

L                    define a function with name y and variable b, which:
 h^2^2b                returns 1+2^2^b
       y             call the recently defined function with argument:
        f    Q         the first number T >= Q (the input) for which:
         P_yT            the same function with argument T returns a prime
                     and implicitly print

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个素数 Fermat数,而不仅仅是第n个Fermat数。
poi830

@ poi830现在主要检查占据了大部分功能:(
SuperStormer

我认为您可以说i <2而不是i == 1,因为零在这里也很好?应该减少为2个字节
DanielIndie

0

Dyalog APL(29个字符)

我几乎可以肯定,这是可以改善的。

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

这是一个递归函数,它检查1 + 2 ^ 2 ^⍵的除数的数量,其中the是函数的正确参数。如果除数的个数为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!   
                                                  ]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.