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
&&&
