Encontre recursivamente primos primos

17

Os primos recursivamente primos são sequências de primos tais que

p(1) = 2
p(n) = the p(n-1)th prime

Aqui está um exemplo de como se pode calcular o 4º Recursivamente Prime Prime.

p(4) = the p(3)th prime
p(3) = the p(2)th prime
p(2) = the p(1)th prime
p(1) = 2
p(2) = the 2nd prime
p(2) = 3
p(3) = the 3rd prime
p(3) = 5
p(4) = the 5th prime
p(4) = 11

Você deve escrever um programa ou função que, quando dado n, gera o enésimo nono Recursively Prime Prime.

Você pode optar por usar a indexação baseada em 0, se desejar, caso em que deve indicar isso em sua resposta.

Isso é portanto, o objetivo é minimizar sua contagem de bytes.


Casos de teste

1 -> 2
2 -> 3
3 -> 5
4 -> 11
5 -> 31
6 -> 127
7 -> 709
8 -> 5381
9 -> 52711

Entrada OEIS relevante: OEIS A007097

Post Rock Garf Hunter
fonte

Respostas:

13

Oásis , 3 bytes

O programa é indexado em 0 . Código:

<q2

Usa a fórmula: a (n) = enésimo_prime (a (n-1) - 1) , com o caso base a (0) = 2 .

Explicação do código:

  2   = a(0)

<     # Decrement a(n - 1) to get a(n - 1) - 1
 q    # prime(a(n - 1) - 1)

Experimente online!

Adnan
fonte
8

Na verdade , 7 bytes

1@⌠DP⌡n

Experimente online!

Explicação:

1@⌠DP⌡n
1        push 1
 @       swap 1 with n
  ⌠DP⌡n  do the following n times:
   DP      decrement, prime at index
Mego
fonte
8

Mathematica, 16 bytes

Nest[Prime,1,#]&

Função anônima. Pega um número como entrada e retorna um número como saída.

LegionMammal978
fonte
5

Geléia , 5 4 bytes

1 byte graças a @Dennis.

1ÆN¡

Experimente online!

Explicação

1        Starting with n = 1,
 ÆN      replace n by the nth prime
   ¡     (input) times.
PurkkaKoodari
fonte
Você não precisa do .
Dennis
@ Dennis Então, ¡só aceita nilads como repetições e o padrão é a entrada se nenhuma for encontrada?
PurkkaKoodari 21/02
<f><n>¡aceita alegremente átomos monádicos ou diádicos <n>. No entanto, se <f>for um nilad, algo deve estar errado; portanto, ele é analisado <f>¡e recebe a última entrada (último argumento da linha de comando, STDIN é que não há) <n>.
Dennis
5

JavaScript (ES6), 71 bytes

p=(n,x=1)=>n?p(n-1,(N=y=>x?N(++y,x-=(P=z=>y%--z?P(z):z==1)(y)):y)(1)):x

Sem jogar, você tem três funções recursivas separadas:

P=(n,x=n)=>n%--x?P(n,x):x==1
N=(n,x=1)=>n?N(n-P(++x),x):x
p=(n,x=1)=>n?p(n-1,N(x)):x
  • Pdetermina se né primo;
  • Nencontra o nprimeiro primo;
  • precursivamente é executado Nnos 1 ntempos de entrada .
ETHproductions
fonte
4

MATL , 6 bytes

1i:"Yq

Experimente online!

Explicação

1      % Push 1
i      % Input n
:      % Range [1 2 ... N]
"      % For each (that is, do the following N times)
  Yq   %   k-th prime, where k is the input
       % End for each (implicit)
       % Display stack (implicit)
Luis Mendo
fonte
3

R, 98 93 bytes

5 bytes graças a @smci

Aqui está uma solução recursiva terrivelmente ineficiente:

f<-function(m,n=1){j<-1;for(i in 1:n){j<-numbers::nextPrime(j)};a<-ifelse(m==0,j,f(m-1,j));a}

Saída de teste:

f(6)
[1] 127

f(10)        ### takes almost a minute... YIKES!!!
[1] 648391
Joseph Wood
fonte
11
Você pode raspar um pouco fora fazendoa<-ifelse(m==0,j,f(m-1,j))
SMCI
11
74 bytes
Giuseppe
@ Giuseppe, você deve postar isso como resposta ... isso é uma diminuição considerável !!! Eu nunca vi ifusado assim antes ... muito legal !!
Joseph Wood
@ JosephphWood nah, esses são apenas golfe comuns; o algoritmo principal não mudou. Eu sugiro ler dicas de golfe em R para obter algumas dicas mais interessantes sobre o golfe (embora geralmente sejam de péssimo estilo R).
7117 Giuseppe
2

Bash + utilitários comuns, 55

Como estamos fazendo primos recursivos, aqui está uma resposta recursiva:

((SHLVL-2<$1))&&primes 2|sed -n "`$0 $1`{p;q}"||echo 1

Como a contagem do nível de recursão é baseada $SHLVLna variável interna, a resposta pode ser desativada se você já tiver alguns níveis de shell. Provavelmente é por isso que esta resposta não funciona no TIO.


Se isso não for bom, então aqui está uma resposta mais convencional:

Bash + utilitários comuns, 58

for((i=$1;i--;));{
n=`primes 2|sed -n "$n{p;q}"`
}
echo $n

Experimente online .

Trauma Digital
fonte
1

Haskell , 58 bytes

Indexado 1

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

Experimente online!

Explicação:

Usa o mesmo truque de acesso à lista prime indexado em 0 que a resposta de Adnan .
Essencialmente, a linha reta segue a especificação de outra forma.

f 1=2; -- base case
f n= -- main case
    [x|x<-[2..],all((>)2.gcd x)[2..x-1]]             -- list of all primes
    [x|x<-[2..],                                     -- consider all numbers
                               [2..x-1]              -- consider all smaller numbers
                all((>)2.gcd x)                      -- is coprime with them?
                    (>)2.                            -- 2 is greater than
                         gcd x                       -- gcd(x,lambda input)
                                        !!(f(n-1)-1) -- access the
                                                     -- f(n-1)-th 1-indexed prime
SEJPM
fonte
1

05AB1E , 4 bytes

ÎF<Ø

Experimente online!

Explicação

ÎF<Ø
Î    # Push 0 and input
 F   # Do input times...
  <   # Decrement
   Ø  # Get the nth prime (0-indexed) with n being the top of the stack
Datboi
fonte
0

Maravilha , 23 bytes

p\.{1\2@:^(- p -#0 1)1P

1 indexado. Uso:

p\.{1\2@:^(- p -#0 1)1P}; p 3

Explicação

p\.{                #. Pattern matching syntax
  1\2               #. Base case p(1)=2
  @:^(- p -#0 1)1P  #. Other cases p(n)=nthprime(p(n-1)-1)
                    #. nthprime is 0-indexed
}                   #. Trailing bracket is optional in this case
Mama Fun Roll
fonte