Est-ce un super-prime?


22

Contexte

Un super-premier est un nombre premier dont l'indice dans la liste de tous les nombres premiers est également premier. La séquence ressemble à ceci:

3, 5, 11, 17, 31, 41, 59, 67, 83, 109, 127, 157, 179, 191, ...

Il s'agit de la séquence A006450 dans l'OEIS .

Défi

Étant donné un entier positif, déterminez s'il s'agit d'un super-premier.

Cas de test

2: faux
3: vrai
4: faux
5: vrai
7: faux
11: vrai
13: faux
17: vrai
709: vrai
851: faux
991: vrai

Notation

Il s'agit de , donc la réponse la plus courte dans chaque langue l'emporte.


6
Quel est l'indice de 2 ? Est-ce 1 ou 0 ?
Dennis

1
@Dennis la séquence est indexée 1; l'indice de 2 est 1.
musicman523

2
Première réflexion après avoir lu ce qu'est un super-premier: comment appelleriez-vous les super-super-premiers? Ou super ^ 3-nombres premiers? Qu'est-ce qui est plus grand, le nombre d'atomes dans l'univers ou le 11e super ^ 11-prime? Vous, cher internaute, vous volez encore quelques heures de mes heures de grande écoute!
J_F_B_M

@J_F_B_M Relevez un défi à partir de cela! : D
musicman523

1
@J_F_B_M 11 est un super-premier dont l'indice dans la liste des super-premiers est aussi un super-premier (3), donc le 11ème super-premier est un super-super-super-premier
Skidsdev

Réponses:



14

Mathematica, 26 23 octets

Merci à user202729 pour avoir économisé 3 octets.

PrimeQ/@(#&&PrimePi@#)&

Cela utilise le fait que Mathematica laisse la plupart des expressions absurdes non évaluées (dans ce cas, la logique Andde deux nombres) et Mappeut être appliquée à n'importe quelle expression, pas seulement aux listes. Nous calculons donc le Andde l'entrée et son indice premier, qui reste juste comme ça, puis nous Maptestons la primalité sur cette expression qui transforme les deux opérandes du Anden booléens, de sorte que le Andpeut ensuite être évalué.


1
23 octets: PrimeQ/@(#&&PrimePi@#)&.
user202729

@ user202729 Nice, merci. :)
Martin Ender

10

Gelée , 6 octets

ÆRi³ÆP

Essayez-le en ligne!

Utilise la même technique que ma réponse Japt: Générez les nombres premiers jusqu'à n , obtenez l'index de n dans cette liste et vérifiez cela pour la primauté. Si n lui-même n'est pas premier, l'index est 0 , ce qui n'est pas non plus premier, donc 0 est quand même retourné.


9

Japt , 13 11 octets

õ fj bU Ä j

Testez-le en ligne!

Explication

C'est en fait très simple, contrairement à ma soumission initiale:

 õ fj bU Ä  j    
Uõ fj bU +1 j    Ungolfed
                 Implicit: U = input integer
Uõ               Generate the range [1..U].
   fj            Take only the items that are prime.
      bU         Take the (0-indexed) index of U in this list (-1 if it doesn't exist).
         +1 j    Add 1 and check for primality.
                 This is true iff U is at a prime index in the infinite list of primes.
                 Implicit: output result of last expression

4

Python 3 , 104 97 93 octets

p=lambda m:(m>1)*all(m%x for x in range(2,m))
f=lambda n:p(n)*p(len([*filter(p,range(n+1))]))

Renvoie 0/ 1, au plus 4 octets de plus s'il doit être True/ False.

Essayez-le en ligne!


1
0/1 est très bien. Bonne réponse! Comme vous n'utilisez jamais la valeur de f, vous pouvez reformater votre code comme ceci et l'exclure du nombre d'octets.
musicman523

@ musicman523 Merci pour le conseil!
C McAvoy

3

Gelée , 7 octets

ÆCÆPaÆP

Essayez-le en ligne!

ÆCcompte le nombre de nombres premiers inférieurs ou égaux à l'entrée (donc, si l'entrée est le n ème nombre premier, il renvoie n ). Teste ensuite ÆPcet index pour la primauté. Enfin, afait un ET logique entre ce résultat et ÆP(test de primalité) de l'entrée d'origine.



2

05AB1E , 6 octets

ÝØ<Øså

Essayez-le en ligne!

Explication

ÝØ<Øså
Ý      # Push range from 0 to input
 Ø     # Push nth prime number (vectorized over the array)
  <    # Decrement each element by one (vectorized)
   Ø   # Push nth prime number again
    s  # swap top items of stack (gets input)
     å # Is the input in the list?

2

Pyth , 12 octets

&P_QP_smP_dS

Essayez-le en ligne!

Explication

&P_QP_smP_dS
                Implicit input
       mP_dS    Primality of all numbers from 1 to N
      s         Sum of terms (equal to number of primes ≤ N)
    P_          Are both that number
&P_Q            and N prime?

2

Pyke, 8 octets

sI~p>@hs

Essayez-le ici!

s        -  is_prime(input)
 I~p>@hs - if ^:
  ~p>    -    first_n_primes(input)
     @   -    ^.index(input)
      h  -   ^+1
       s -  is_prime(^)


1

QBIC , 33 octets

~µ:||\_x0]{p=p-µq|~q=a|_xµp]q=q+1

Explication

~   |   IF   ....  THEN (do nothing)
  :         the number 'a' (read from cmd line) 
 µ |        is Prime
\_x0        ELSE (non-primes) quit, printing 0
]           END IF
{           DO
            In this next bit, q is raised by 1 every loop, and tested for primality. 
            p keeps track of how may primes we've seen (but does so negatively)
    µq|     test q for primality (-1 if so, 0 if not)
p=p-        and subtract that result from p (at the start of QBIC: q = 1, p = 0)
~q=a|       IF q == a
_xµp        QUIT, and print the prime-test over p (note that -3 is as prime as 3 is)
]           END IF
q=q+1       Reaise q and run again.

1

Mathematica, 35 29 octets

P=Prime;!P@P@Range@#~FreeQ~#&

-6 octets de @MartinEnder


P@P@Range@#devrait sauver un tas.
Martin Ender

1

Haskell, 121 octets

f=filter
p x=2==(length$f(\a->mod(x)a==0)[1..x])
s=map(\(_,x)->x)$f(\(x,_)->p x)$zip[1..]$f(p)[2..]
r x=x`elem`(take x s)

1
(\(_,x)->x)est snd, (\(x,_)->p x)est (p.fst). Les deux fstet sndsont en prélude, donc pas besoin d'importations.
Laikoni

Ne pas utiliser trop souvent des accents graves : r x=elem x$take x s. Cependant, dans ce cas , vous pouvez aller Pointfree (introduire à nouveau des accents graves) et d' omettre le nom de la fonction: elem<*>(`take`s).
nimi



1

Matlab, 36 34 octets

Enregistré 2 octets grâce à Tom Carpenter.

Une implémentation très naïve utilisant des fonctions intégrées:

isprime(x)&isprime(nzz(primes(x)))

1
Pour Octave uniquement, vous pouvez également enregistrer un octet supplémentaire avec(p=@isprime)(x)&p(nnz(primes(x)))
Tom Carpenter

1

Python 2 , 89 octets

def a(n):
 r=[2];x=2
 while x<n:x+=1;r+=[x]*all(x%i for i in r)
 return{n,len(r)}<=set(r)

Essayez-le en ligne!

Construit r, la liste des nombres premiers <= n; si n est premier, alors nest le len(r)'e premier. Donc n est un super premier siff n dans r et len ​​(r) dans r.



0

Julia 0,6, 61 octets

retourne 1 si x est un super-premier, 0 sinon.

sans utiliser une fonction de type isprime.

x->a=[0,1];for i=3:x push!(a,0i%(2:i-1))end;a[sum(a)]&a[x]
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.