Утворення праймів Ферма


10

Давши число n, надрукуйте n - е просте число Ферма, де номери Fermat мають форму 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 праймів Ферма.
poi830

Я не дуже розумію ціль теоретично працювати для всіх праймів Ферма, оскільки відомо лише 5 термінів.
Містер Xcoder

2
@CodyGray Тестові корпуси вводять в оману, тому що це працює для n=1:4. Всі прайми в формі ферма мають форму 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

Відповіді:



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*одного цілого числа ...
ТІЛ

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

@ poi830 зараз головна перевірка займає більшість функцій :(
SuperStormer

я думаю, ви можете сказати, що я <2 замість i == 1, тому що нуль також хороший? що має скоротитись на 2 байти
DanielIndie

0

Діялог APL (29 персонажів)

Я майже впевнений, що це можна покращити.

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

Це рекурсивна функція, яка перевіряє кількість дільників 1 + 2 ^ 2 ^ ⍵, де ⍵ - правильний аргумент функції. Якщо кількість дільників дорівнює 2, число є простим, і воно повертає його, інакше він знову викликає функцію з with + 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!   
                                                  ]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.