Semi Prime Numbers

[This article was first published on Numbers around us - Medium, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Excel BI’s Excel Challenge #306 — solved in R

Defining the Puzzle

We are getting back to checking numbers properties with ExcelBI. Today we have some numbers to determine if they are Semi Prime. Post with riddle is here.

List all Semi Prime Numbers.
A Semi Prime is a natural number that is the product of exactly two prime numbers
Ex. 314 which can be expressed as product of two prime numbers — 2 and 157

I would add that Semi Prime number has 4 factors: 1, itself and two which are not 1 or itself, but both are prime numbers themselves.

Loading Exercise

Today we are going to load something from Excel file to check. But as I realized there are some really big numbers in data set we need also to use proper libraries.

library(tidyverse)
library(readxl)
library(gmp)# for very big numbers
library(data.table)

input = read_excel(“Semi Prime Numbers.xlsx”, range = “A1:A10”)
test = read_excel(“Semi Prime Numbers.xlsx”, range = “C1:C5”)

Approach 1: Tidyverse with purrr

is_semiprime = function(n){
 factors <- n %>%
 as.character() %>%
 as.bigz() %>% 
 factorize() %>% 
 as.vector()
 check = ifelse(length(factors) == 2, TRUE, FALSE)
 
 return(check)
} 

result = input$Numbers %>%
 keep(~ is_semiprime(.))

Approach 2: Base R

As function is_semiprime would only change form from piping to writing deep in parentheses, I will only adapt second part, calling function for two other approaches:

semiprimes_base <- unlist(lapply(input$Numbers, is_semiprime))
result_base <- input$Numbers[semiprimes_base]

Approach 3: Data.table

dt <- data.table(Numbers = input$Numbers)
dt[, IsSemiprime := sapply(Numbers, is_semiprime)]
result_dt <- dt[IsSemiprime == TRUE, .(Number)]

Validation

identical(result, test$`Expected Answers`)
[1] TRUE
identical(result_base, test$`Expected Answers`)
[1] TRUE
identical(result_base, test$`Expected Answers`)
[1] TRUE

Do not hesitate to show your approaches in R or even Python. Comment, share and come back for next puzzles.


Semi Prime Numbers was originally published in Numbers around us on Medium, where people are continuing the conversation by highlighting and responding to this story.

To leave a comment for the author, please follow the link and comment on their blog: Numbers around us - Medium.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)