Rechercher des nombres premiers de manière récursive


17

Les nombres premiers récursivement sont une séquence de nombres premiers tels que

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

Voici un exemple de la façon dont on pourrait calculer le 4ème Prime Prime récursivement.

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

Vous devez écrire un programme ou une fonction qui, lorsque n est donné, génère le nième Prime Prime récursivement.

Vous pouvez choisir d'utiliser l'indexation basée sur 0 si vous le souhaitez, auquel cas vous devez l'indiquer dans votre réponse.

Il s'agit de , l'objectif est donc de minimiser le nombre d'octets.


Cas de test

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

Entrée OEIS pertinente: OEIS A007097

Réponses:


13

Oasis , 3 octets

Le programme est indexé 0 . Code:

<q2

Utilise la formule: a (n) = nth_prime (a (n-1) - 1) , avec le cas de base a (0) = 2 .

Explication du code:

  2   = a(0)

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

Essayez-le en ligne!



8

Mathematica, 16 octets

Nest[Prime,1,#]&

Fonction anonyme. Prend un nombre en entrée et renvoie un nombre en sortie.


5

Gelée , 5 4 octets

1 octet grâce à @Dennis.

1ÆN¡

Essayez-le en ligne!

Explication

1        Starting with n = 1,
 ÆN      replace n by the nth prime
   ¡     (input) times.

Vous n'en avez pas besoin .
Dennis

@Dennis N'accepte donc ¡que les nilades comme répétitions et par défaut à saisir si aucune n'est trouvée?
PurkkaKoodari

<f><n>¡accepte heureusement les atomes monadiques ou dyadiques pour <n>. Cependant, si <f>est un nilad, quelque chose doit être faux, il est donc analysé comme à la <f>¡place et prend la dernière entrée (dernier argument de ligne de commande, STDIN s'il n'y en a pas) comme à la <n>place.
Dennis

5

JavaScript (ES6), 71 octets

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

Non golfé, vous avez trois fonctions récursives distinctes:

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
  • Pdétermine si nest premier;
  • Ntrouve le ne premier;
  • pfonctionne récursivement Nsur les 1 ntemps d' entrée .

4

MATL , 6 octets

1i:"Yq

Essayez-le en ligne!

Explication

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)

3

R, 98 93 octets

5 octets grâce à @smci

Voici une solution récursive horriblement inefficace:

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}

Sortie de test:

f(6)
[1] 127

f(10)        ### takes almost a minute... YIKES!!!
[1] 648391

1
Vous pouvez vous raser un peu en faisanta<-ifelse(m==0,j,f(m-1,j))
smci


@Giuseppe, vous devriez poster cela comme réponse ... c'est une diminution considérable !!! Je n'en ai jamais vu ifutilisé comme ça auparavant ... plutôt cool !!
Joseph Wood

@JosephWood nah, ce ne sont que des golfs standard; l'algorithme de base n'a pas changé. Je suggérerais de lire des conseils pour jouer au golf en R pour quelques conseils de golf plus cool (bien que généralement ils soient terribles style R).
Giuseppe

2

Bash + utilitaires communs, 55

Puisque nous faisons des nombres premiers récursifs, voici une réponse récursive:

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

Étant donné que le comptage des niveaux de récursivité est basé sur la $SHLVLvariable intégrée, la réponse peut être désactivée si vous avez déjà quelques niveaux de shell en profondeur. C'est probablement pourquoi cette réponse ne fonctionne pas sur TIO.


Si ce n'est pas bon, voici une réponse plus conventionnelle:

Bash + utilitaires communs, 58

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

Essayez-le en ligne .


1

Haskell , 58 octets

1 indexé

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

Essayez-le en ligne!

Explication:

Utilise la même astuce d'accès à la liste principale indexée 0 que la réponse d'Adnan .
Sinon, le rectangle suit la spécification autrement.

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

1

05AB1E , 4 octets

ÎF<Ø

Essayez-le en ligne!

Explication

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

0

Wonder , 23 octets

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

1 indexé. Usage:

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

Explication

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.