22
\$\begingroup\$

Background

A super-prime is a prime number whose index in the list of all primes is also prime. The sequence looks like this:

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

This is sequence A006450 in the OEIS.

Challenge

Given a positive integer, determine whether it is a super-prime.

Test Cases

2: false
3: true
4: false
5: true
7: false
11: true
13: false
17: true
709: true
851: false
991: true

Scoring

This is , so the shortest answer in each language wins.

\$\endgroup\$
  • 6
    \$\begingroup\$ What is the index of 2? Is it 1 or 0? \$\endgroup\$ – Dennis Jul 7 '17 at 21:44
  • 1
    \$\begingroup\$ @Dennis the sequence is 1-indexed; the index of 2 is 1. \$\endgroup\$ – musicman523 Jul 7 '17 at 22:03
  • 2
    \$\begingroup\$ First thought after reading what a super-prime is: What would you call super-super-primes? Or super^3-primes? What is bigger, the number of atoms in the universe or the 11th super^11-prime? You, dear internet person, are stealing another few hours of my hours of my prime time! \$\endgroup\$ – J_F_B_M Jul 8 '17 at 19:28
  • \$\begingroup\$ @J_F_B_M Make a challenge based on it! :D \$\endgroup\$ – musicman523 Jul 9 '17 at 6:03
  • 1
    \$\begingroup\$ @J_F_B_M 11 is a super-prime who's index in the super-prime list is also a super-prime (3), so the 11'th super-prime is a super-super-super-prime \$\endgroup\$ – Skidsdev Jul 10 '17 at 8:33

20 Answers 20

21
\$\begingroup\$

Jelly, 5 bytes

ÆRÆNċ

Try it online!

How it works

Æ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.
\$\endgroup\$
  • 8
    \$\begingroup\$ Gosh darn it, you win again... \$\endgroup\$ – ETHproductions Jul 7 '17 at 21:50
  • 3
    \$\begingroup\$ He always does... \$\endgroup\$ – Gryphon Jul 8 '17 at 4:20
  • \$\begingroup\$ @ETHproductions Well, solution is pretty obvious...it's just the ninja here. \$\endgroup\$ – Erik the Outgolfer Jul 8 '17 at 13:52
14
\$\begingroup\$

Mathematica, 26 23 bytes

Thanks to user202729 for saving 3 bytes.

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

This makes use of the fact that Mathematica leaves most nonsensical expressions unevaluated (in this case, the logical And of two numbers) and Map can be applied to any expression, not just lists. So we compute the And of the input and its prime index, which just remains like that, and then we Map the primality test over this expression which turns the two operands of the And into booleans, such that the And can then be evaluated.

\$\endgroup\$
  • 1
    \$\begingroup\$ 23 bytes: PrimeQ/@(#&&PrimePi@#)&. \$\endgroup\$ – user202729 Jul 8 '17 at 3:36
  • \$\begingroup\$ @user202729 Nice, thank you. :) \$\endgroup\$ – Martin Ender Jul 8 '17 at 6:37
10
\$\begingroup\$

Jelly, 6 bytes

ÆRi³ÆP

Try it online!

Uses the same technique as my Japt answer: Generate the primes up to n, get the index of n in that list, and check that for primality. If n itself is not prime, the index is 0, which is also not prime, so 0 is returned anyway.

\$\endgroup\$
9
\$\begingroup\$

Japt, 13 11 bytes

õ fj bU Ä j

Test it online!

Explanation

This is actually very straight-forward, unlike my original submission:

 õ 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
\$\endgroup\$
4
\$\begingroup\$

Python 3, 104 97 93 bytes

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))]))

Returns 0/1, at most 4 bytes longer if it has to be True/False.

Try it online!

\$\endgroup\$
  • 1
    \$\begingroup\$ 0/1 is fine. Nice answer! Since you don't ever use the value of f, you can reformat your code like this and exclude it from the byte count. \$\endgroup\$ – musicman523 Jul 7 '17 at 21:57
  • \$\begingroup\$ @musicman523 Thanks for the tip! \$\endgroup\$ – C McAvoy Jul 9 '17 at 22:22
3
\$\begingroup\$

Jelly, 7 bytes

ÆCÆPaÆP

Try it online!

ÆC counts the number of primes less than or equal to the input (so, if the input is the nth prime, it returns n). Then ÆP tests this index for primality. Finally, a does a logical AND between this result and ÆP (primality test) of the original input.

\$\endgroup\$
3
\$\begingroup\$

Haskell, 62 bytes

p x=2==sum[1|0<-mod x<$>[1..x]]
f x=p$sum[1|y<-[1..x],p y,p x]

Try it online! Usage: f 991 yields True.

\$\endgroup\$
2
\$\begingroup\$

05AB1E, 6 bytes

ÝØ<Øså

Try it online!

Explanation

ÝØ<Ø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?
\$\endgroup\$
2
\$\begingroup\$

Pyth, 12 bytes

&P_QP_smP_dS

Try it online!

Explanation

&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?
\$\endgroup\$
2
\$\begingroup\$

Pyke, 8 bytes

sI~p>@hs

Try it here!

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

Perl 6, 46 bytes

{$/=&is-prime;all($_∈*,$/)([grep $/,1..$_])}

Try it online!

\$\endgroup\$
1
\$\begingroup\$

QBIC, 33 bytes

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

Explanation

~   |   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.
\$\endgroup\$
1
\$\begingroup\$

Mathematica, 35 29 bytes

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

-6 bytes from @MartinEnder

\$\endgroup\$
  • \$\begingroup\$ P@P@Range@# should save a bunch. \$\endgroup\$ – Martin Ender Jul 7 '17 at 21:55
1
\$\begingroup\$

Haskell, 121 bytes

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)
\$\endgroup\$
  • 1
    \$\begingroup\$ (\(_,x)->x) is snd, (\(x,_)->p x) is (p.fst). Both fst and snd are in Prelude, so no need for imports. \$\endgroup\$ – Laikoni Jul 7 '17 at 23:52
  • \$\begingroup\$ Don't use backticks too often: r x=elem x$take x s. However, in this case you can go pointfree (introducing backticks again) and omit the function name: elem<*>(`take`s). \$\endgroup\$ – nimi Jul 8 '17 at 12:32
1
\$\begingroup\$

Positron, 148 bytes

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)

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Pari/GP, 31 bytes

n->(p=isprime)(n)*p(primepi(n))

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Matlab, 36 34 bytes

Saved 2 bytes thanks to Tom Carpenter.

A very naive implementation using built-in functions:

isprime(x)&isprime(nzz(primes(x)))
\$\endgroup\$
  • 1
    \$\begingroup\$ For Octave only you can also save a further byte with (p=@isprime)(x)&p(nnz(primes(x))) \$\endgroup\$ – Tom Carpenter Jul 8 '17 at 17:28
1
\$\begingroup\$

Python 2, 89 bytes

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)

Try it online!

Constructs r, the list of primes <= n; if n is prime, then n is the len(r)'th prime. So n is a super prime iff n in r and len(r) in r.

\$\endgroup\$
1
\$\begingroup\$

Python 2, 79 bytes

n=input()
s={2};p=i=1
while i<n:
 p*=i;i+=1
 if p*p%i:s|={i}
print{n,len(s)}<=s

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Julia 0.6, 61 bytes

return 1 if x is a super-prime, 0 otherwise.

without using an isprime-kind function.

x->a=[0,1];for i=3:x push!(a,0∉i%(2:i-1))end;a[sum(a)]&a[x]
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.