Home » List All Emirp Numbers

List All Emirp Numbers

An emirp (prime spelled backward = emirp) number is a prime number and its reversal is also a prime number but this is not a palindromic prime. Ex. 313 is a prime, its reversed number 313 is also a prime but this is a palindromic prime, hence not emirp. 149 is a prime, its reversed number 941 is also a prime and this is not a palindromic prime, hence an emirp. Find all emirps less than 10 million starting with 10. Note – OEIS lists only first 10000, hence extracting data from OEIS through PQ will not work for this problem.

📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 538
Challenge Difficulty: ⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of List All Emirp Numbers with Power Query

Power Query solution 1 for List All Emirp Numbers, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source = Table.FromColumns(
    {
      Lines.FromBinary(
        Web.Contents(
          "https://gist.githubusercontent.com/Hermione-Granger-1176/56cd9905ed8fd5a34a7320fad821fc91/raw/9a5954eb32d61658b309dd1115fb71438a29d364/prime.txt"
        ), 
        null, 
        null, 
        65001
      )
    }, 
    {"Prime"}
  ), 
  Filter = Table.SelectRows(
    Source, 
    each Number.From([Prime]) < 10000000 and [Prime] <> Text.Reverse([Prime])
  ), 
  Reverse = Table.AddColumn(Filter, "Reverse", each Text.Reverse([Prime])), 
  Join = Table.NestedJoin(Reverse, "Prime", Reverse, "Reverse", "Join", JoinKind.Inner)[[Prime]], 
  Return = Table.TransformColumnTypes(Join, {"Prime", Int64.Type})
in
  Return
Power Query solution 2 for List All Emirp Numbers, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = List.Select({10 .. 10000000}, Number.IsOdd), 
  Fx = (k) =>
    List.Transform(
      k, 
      (x) => {
        x, 
        List.AllTrue(
          List.Transform(
            {2} & List.Select({3 .. Number.RoundDown(Number.Sqrt(x))}, Number.IsOdd), 
            each Number.Mod(x, _) <> 0
          )
        )
      }
    ), 
  Odd = Fx(Source), 
  Prime = List.Transform(List.Select(Odd, each _{1} = true), each _{0}), 
  NoPalin = List.Select(Prime, each Text.From(_) <> Text.Reverse(Text.From(_))), 
  Cal = List.Select(
    List.Zip(
      {
        NoPalin, 
        List.Transform(
          Fx(List.Transform(NoPalin, each Number.From(Text.Reverse(Text.From(_))))), 
          each _{1}
        )
      }
    ), 
    each _{1} = true
  ), 
  Sol = List.Transform(Cal, each _{0})
in
  Sol

Solving the challenge of List All Emirp Numbers with Excel

Excel solution 1 for List All Emirp Numbers, proposed by Bo Rydobon 🇹🇭:
=LET(c,
    {2,
    3,
    5,
    7},
    
ip,
    LAMBDA(
        n,
        LET(
            d,
            n/TOCOL(
                VSTACK(
                    c,
                    SEQUENCE(
                        n^0.5/6,
                        ,
                        2
                    )*6+{-1,
                    1}
                ),
                3
            ),
            OR(
                n=c,
                AND(
                    d-INT(
                        d
                    ),
                    n>1
                )
            )
        )
    ),
    
DROP(REDUCE(0,
    SEQUENCE(
        5
    ),
    LAMBDA(a,
    l,
    LET(
s,
    TOCOL(
        TOCOL(
            SEQUENCE(
                10^l/6+2,
                ,
                0
            )+INT(
                {1,
                3,
                7,
                9}*10^l/6
            ),
            ,
            1
        )*6+{-1,
        1}
    ),
    
UNIQUE(VSTACK(a,
    FILTER(s,
    MAP(s,
    LAMBDA(n,
    LET(m,
    --CONCAT(
        MID(
            n,
            8-SEQUENCE(
                7
            ),
            1
        )
    ),
    (m<>n)*ip(
        n
    )*ip(
        m
    )))))))))),
    1))
Excel solution 2 for List All Emirp Numbers, proposed by John V.:
=LET(p,LAMBDA(n,AND(MOD(n,1+SEQUENCE(n^0.5)))),TOCOL(MAP(SEQUENCE(10^6-1,5,11,2),LAMBDA(x,LET(m,--CONCAT(MID(x,8-ROW(1:7),1)),IFS(x=m,e,p(x),IF(p(m),x,e))))),2))
Excel solution 3 for List All Emirp Numbers, proposed by محمد حلمي:
=TOCOL(
    
    MAP(
        SEQUENCE(
            9999
        )+9,
        LAMBDA(
            a,
            LET(
                
                x,
                --CONCAT(
                    MID(
                        a,
                        9-SEQUENCE(
                            8
                        ),
                        1
                    )
                ),
                
                a/AND(
                    a<>x,
                    
                    MOD(
                        a,
                        SEQUENCE(
                            a^0.5
                        )+1
                    )>0,
                    
                    MOD(
                        x,
                        SEQUENCE(
                            x^0.5
                        )+1
                    )>0
                )
            )
        )
    ),
    2
)
Excel solution 4 for List All Emirp Numbers, proposed by Julian Poeltl:
=LET(S,SEQUENCE((10^6)/2,10,11,2),IP,LAMBDA(Number,LET(c,{2357},D,Number/TOCOL(VSTACK(c,SEQUENCE(Number^0,5/6,,2)*6+{-11}),3),OR(Number=c,AND(D-INT(D),Number>1)))),R,LAMBDA(A,CONCAT(MID(A,SEQUENCE(LEN(A),,LEN(A),-1),1))),TOCOL(MAP(S,LAMBDA(A,LET(V,--R(A),IF(IP(A)*IP(V)*(V<>A),A,X)))),3))
Calculation time: ∞ (30 min on my lousy laptop)
Excel solution 5 for List All Emirp Numbers, proposed by Timothée BLIOT:
=LET(F,
    LAMBDA(n,
    AND(n>1,
     IF(INT(
         n^0.5
     )>=2,
    SUM(--(MOD(
        n,
        SEQUENCE(
            INT(
         n^0.5
     )-1,
            ,
            2
        )
    )=0))=0,
    1))),
    G,
    LAMBDA(
        m,
        --CONCAT(
            MID(
                m,
                LEN(
                    m
                )+1-SEQUENCE(
                    LEN(
                    m
                )
                ),
                1
            )
        )
    ),
     A,
    SEQUENCE(
        10^6,
        5,
        ,
        2
    ),
    B,
    TOCOL(IF(MAP(IF(MAP(IF(MAP(A,
    LAMBDA(x,
    SUM(--(MOD(
        x,
        {3;5;7;9;11}
    )=0))>0)),
    1/0,
    A),
    LAMBDA(x,
     IF(ISERR(
         x
     ),
    1/0,
    1/--(NOT(
        G(
         x
     )=x
    ))))),
    A,
    1/0),
    LAMBDA(y,
    IF(ISERR(
        y
    ),
    1/0,
    1/--(SUM(--(--LEFT(
        y
    )={2;4;5;6;8}))=0)))),
    A,
    1/0),
    3),
    C,
    FILTER(
        B,
        MAP(
            B,
            LAMBDA(
                x,
                F(
         x
     )
            )
        )
    ),
    FILTER(
        C,
        MAP(
            C,
            LAMBDA(
                x,
                 F(
                     G(
         x
     )
                 ) 
            )
        )
    ))
Excel solution 6 for List All Emirp Numbers, proposed by LEONARD OCHEA 🇷🇴:
=LET(s,SEQUENCE(333333,10,4),t,(6*s+(-1)^s-3)/2,TOCOL(MAP(t,LAMBDA(x,LET(y,--CONCAT(MID(x,9-SEQUENCE(8),1)),P,LAMBDA(n,AND(MOD(n,1+SEQUENCE(n^0.5)))),IF(P(x)*P(y)*(x<>y),x,z)))),3))
Excel solution 7 for List All Emirp Numbers, proposed by LEONARD OCHEA 🇷🇴:
=LET(t,125300,F,LAMBDA(F,x,LET(l,LEN(x),y,--CONCAT(MID(x,l-SEQUENCE(l)+1,1)),P,LAMBDA(n,AND(MOD(n,1+SEQUENCE(n^0.5)))),IF(xy),VSTACK(x,F(F,x+1)),F(F,x+1)),""))),DROP(F(F,10),-1))
The complete answer, but... ⌚ ⌚ ⌚ 
=TOCOL(MAP(SEQUENCE(10^6,10,10),LAMBDA(x,LET(y,--CONCAT(MID(x,9-SEQUENCE(8),1)),P,LAMBDA(n,AND(MOD(n,1+SEQUENCE(n^0.5)))),IF(P(x)*P(y)*(x<>y),x,z)))),3)
Excel solution 8 for List All Emirp Numbers, proposed by ferhat CK:
=LET(n,LAMBDA(x,--CONCAT(MID(x,SEQUENCE(LEN(x),,LEN(x),-1),1))),i,LAMBDA(y,AND(((MOD(y,ROW(INDIRECT("2:"&y-1)))<>0)))),
a,MAP(SEQUENCE(1000,,13,2),LAMBDA(y,IF((i(y))*(n(y)<>y)*(i(n(y))),y,""))),FILTER(a,a<>""))
Excel solution 9 for List All Emirp Numbers, proposed by Bilal Mahmoud kh.:
LET(a,SEQUENCE(1000000,,10),b,MAP(a,LAMBDA(x,CONCAT(MID(x,SEQUENCE(LEN(x),,LEN(x),-1),1)))),isprime,LAMBDA(n,MIN(MOD(n,SEQUENCE(ROUNDUP(SQRT(n),0),,2)))<>0),res,MAP(a,b,LAMBDA(i,j,IF(AND(--i<>--j,isprime(i),isprime(j)),i,""))),FILTER(res,res<>""))
                    
                      
  
                  
    
      
        Show translation
      
      
Excel solution 10 for List All Emirp Numbers, proposed by Nonbow Wu:
=LET(ts,
    NOW(),
    
pf,
    LAMBDA(
        n,
        s,
        SEQUENCE(
            n/6+1,
            ,
            s,
            6
        )+{-1,
        1}
    ),
    
isP,
    LAMBDA(
        n,
        AND(
            MOD(
                n,
                pf(
                    n^0.5,
                    6
                )
            )
        )
    ),
    
rv,
    LAMBDA(
        v,
        --CONCAT(
            MID(
                v,
                LEN(
                    v
                )-SEQUENCE(
                    LEN(
                    v
                )
                )+1,
                1
            )
        )
    ),
    
k,
    10^6,
    
za,
    REDUCE("",
    {0,
    1,
    3,
    7,
    9},
    LAMBDA(A,
    v,
    LET(
 s,
    MAX(
        6,
        CEILING(
            k*v,
            6
        )
    ),
    b,
    TOCOL(
        pf(
            k,
            s
        )
    ),
    
 tn,
    FILTER(
        b,
        ISNUMBER(
            FIND(
                LEFT(
                    b
                ),
                "1379"
            )
        )
    ),
    
 pt,
    TOCOL(
        tn/MAP(
            tn,
            isP
        ),
        2
    ),
    
 rt,
    MAP(
        pt,
        rv
    ),
    
 z,
    TOCOL(pt/MAP(
        rt,
        isP
    )/(rt<>pt),
    2),
    
 VSTACK(
     A,
     z
 )))),
    
VSTACK((NOW()-ts)*86400,
    DROP(
        za,
        1
    )))
Excel solution 11 for List All Emirp Numbers, proposed by Nonbow Wu:
=LET(ts,NOW(),
pf,LAMBDA(n,SEQUENCE(n/6+1,,6,6)+{-1,1}),
isP,LAMBDA(n,AND(MOD(n,pf(n^0.5)))),
rv,LAMBDA(v,--CONCAT(MID(v,LEN(v)-SEQUENCE(LEN(v))+1,1))),
a,TOCOL(pf(10^5)),
tn,FILTER(a,ISNUMBER(FIND(LEFT(a),"1379"))),
pt,TOCOL(tn/MAP(tn,isP),2),
rt,MAP(pt,rv),
za,TOCOL(pt/ISNUMBER(MATCH(rt,pt,0))/(rt<>pt),2),
VSTACK((NOW()-ts)*86400,za))

Solving the challenge of List All Emirp Numbers with Python

Python solution 1 for List All Emirp Numbers, proposed by John V.:
Hi everyone!
One [Py] Option (in Excel) (faster)!
from sympy import isprime as i, primerange as r
[p for p in r(10, 10**7) if (w:=int(str(p)[::-1])) != p and i(w)]
Blessings!
                    
                  
Python solution 2 for List All Emirp Numbers, proposed by Konrad Gryczan, PhD:
import pandas as pd
import numpy as np
path = "538 Emirps.xlsx"
test = pd.read_excel(path)
def generate_primes(limit):
 sieve = np.ones(limit + 1, dtype=bool) 
 sieve[0:2] = False 
 for i in range(2, int(limit**0.5) + 1):
 if sieve[i]:
 sieve[i*i:limit+1:i] = False 
 return sieve
max_n = 10000000
prime_mask = generate_primes(max_n)
df = pd.DataFrame({'n': range(10, max_n + 1)})
df['rev'] = df['n'].astype(str).str[::-1].astype(int)
df = df[(df['n'] != df['rev']) & prime_mask[df['n']] & prime_mask[df['rev']]]
df = df["n"].reset_index(drop=True)
print(df.equals(test["Expected Answer"])) # True
                    
                  

Solving the challenge of List All Emirp Numbers with Python in Excel

Python in Excel solution 1 for List All Emirp Numbers, proposed by Alejandro Campos:
def sieve_of_eratosthenes(limit):
 sieve = [True] * (limit + 1)
 sieve[0], sieve[1] = False, False
 for start in range(2, int(limit**0.5) + 1):
 if sieve[start]:
 for i in range(start * start, limit + 1, start):
 sieve[i] = False
 return [num for num, is_prime in enumerate(sieve) if is_prime]
def find_emirps(primes):
 prime_set = set(primes)
 emirps = []
 
 for prime in primes:
 if prime >= 10:
 reversed_prime = int(str(prime)[::-1])
 if reversed_prime != prime and reversed_prime in prime_set:
 emirps.append(prime)
 
 return emirps
limit = 10_000_000
primes = sieve_of_eratosthenes(limit)
emirps = find_emirps(primes)
df_emirps = pd.DataFrame(emirps, columns=["Emirp Numbers"])
df_emirps
                    
                  
Python in Excel solution 2 for List All Emirp Numbers, proposed by Abdallah Ally:
from sympy import isprime
# Create a function to identify emirp numbers
def isemirp(num):
 rev = int(str(num)[::-1])
 emirp = isprime(num) and isprime(rev) and num != rev
 return emirp
# Perform data munging 
numbers = filter(isemirp, range(10,10000000)) 
df = pd.DataFrame(data={"My Answer": numbers})
df
                    
                  

Solving the challenge of List All Emirp Numbers with R

R solution 1 for List All Emirp Numbers, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
library(primes)
library(stringi)
path = "Excel/538 Emirps.xlsx"
test = read_excel(path)
is_palindrome = function(x) {
 x = as.character(x)
 x == stri_reverse(x)
}
max_val = 10000000
primes = generate_n_primes(max_val)
primes = primes[primes > 10]
non_pal_primes = primes[!is_palindrome(primes)]
nums = data.frame(number = 1:10000000) %>%
 filter(number %in% non_pal_primes & stri_reverse(as.character(number)) %in% non_pal_primes)
all.equal(nums$number, test$`Expected Answer`) # TRUE
                    
                  

&&&

Leave a Reply