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.

musicman523
la source
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:

21

Gelée , 5 octets

ÆRÆNċ

Essayez-le en ligne!

Comment ça marche

ÆRÆNċ  Main link. Argument: n

ÆR     Prime range; yield the array of all primes up to n.
  ÆN   N-th prime; for each p in the result, yield the p-th prime.
    ċ  Count the occurrences of n.
Dennis
la source
8
Bon sang, vous gagnez à nouveau ...
ETHproductions
3
Il fait toujours ...
Gryphon - Réinstalle Monica le
@ETHproductions Eh bien, la solution est assez évidente ... c'est juste le ninja ici.
Erik the Outgolfer
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é.

Martin Ender
la source
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é.

ETHproductions
la source
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
ETHproductions
la source
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!

C McAvoy
la source
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.

Poignée de porte
la source
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?
Datboi
la source
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?
notjagan
la source
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(^)
Bleu
la source
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.
steenbergh
la source
1

Mathematica, 35 29 octets

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

-6 octets de @MartinEnder

J42161217
la source
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)
Sergii Martynenko Jr
la source
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

Positron , 148 octets

x=#(input@@)a=function{p=1;k=$1==2;f=2;while(f<$1)do{p=p*$1%f;k=1;f=f+1};return p*k}r=1;i=2;while(i<x)do{if(a@i)then{r=r+1}i=i+1}print@((a@x*a@r)>0)

Essayez-le en ligne!

HyperNeutrino
la source
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)))
Leander Moesinger
la source
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.

Chas Brown
la source
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]
Tanj
la source