Генерация простых чисел Ферма


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-индексация допустимы.
  • Это , побеждает наименьшее количество байтов.

Связанный: Строимые н-гоны


1
Я или некоторые ответы неверно истолковывают проблему? Разве мы не просто пишем программу, которая выводит 2^(2^n) + 1, где nввод? Это согласуется с вашими тестами (которые, как мы знаем, уже просты, поэтому нет необходимости проверять). И вы не ожидаете, что программа будет работать там, где n> 4 (а n = 5 - первое не простое число).
Jstnthms

Программа должна теоретически функционировать при n> 4, хотя на практике это никогда не сработает, поскольку нам известно только 5 простых чисел Ферма.
poi830

Я не совсем понимаю цель теоретической работы для всех простых чисел Ферма, поскольку существует только 5 известных терминов.
Мистер Кскодер

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»
Камиль Дракари

Ответы:



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
Эрик Игрок в гольф

2

Perl 6 ,  45  42 байта

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

Попробуй это

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

Попробуй это

Expanded:

{  # 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 вместо я == 1, потому что ноль тоже хорошо здесь? это должно быть уменьшено на 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!   
                                                  ]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.