Little useless-useful R functions – Finding substrings in number Pi

[This article was first published on R – TomazTsql, 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.

They say that number Pi holds all infinite possibilities, all the words, all the combinations. Well, easier said to be done. So let’s put this to a test.

This is my translational table.

We will do this in the following steps (for the word “eggs”):

  1. Encode the word EGGS to numbers. E = 5, G = 7, G = 7 and S = 19. Together concatenated we get the string of 57719.
  2. We store a veeery long string of PI number.
  3. Start looking in PI number for substring of “57719”.

Well, let’s create a function to do just that


library(Rmpfr)

encode_a1z26 <- function(s) {
  s_clean <- gsub("[^A-Za-z]", "", toupper(s))
  if (nchar(s_clean) == 0) stop("No letters found in input.")
  letters_vec <- strsplit(s_clean, "", fixed = TRUE)[[1]]
  nums <- match(letters_vec, LETTERS)          
  paste0(nums, collapse = "")
}


pi_fraction_digits <- function(n_digits) {
  # bits of precison ~ n_digits * log2(10)
  precBits <- ceiling(n_digits * log2(10)) + 32L
  pi_mpfr <- Const("pi", precBits)                        
  s <- formatMpfr(pi_mpfr, digits = n_digits + 2L, scientific = FALSE, base = 10L)
  s <- gsub("\\.", "", s, fixed = FALSE)
  frac <- substr(s, 2L, n_digits + 1L)
  if (nchar(frac) < n_digits) {
    stop("To low precision; did not get requested number of digits")
  }
  frac
}

find_in_pi <- function(pattern, n_digits) {
  if (!grepl("^[0-9]+$", pattern)) stop("Pattern must be digits!")
  t0 <- proc.time()[["elapsed"]]
  frac <- pi_fraction_digits(n_digits)
  loc <- regexpr(pattern, frac, fixed = TRUE)
  elapsed <- proc.time()[["elapsed"]] - t0
  
  #getting the positions
  if (loc[1] != -1) {
    start_pos <- as.integer(loc[1])                
    end_pos   <- start_pos + nchar(pattern) - 1L
    list(found = TRUE,
         start = start_pos,
         end   = end_pos,
         digits_scanned = n_digits,
         seconds = elapsed)
  } else {
    list(found = FALSE,
         start = NA_integer_,
         end   = NA_integer_,
         digits_scanned = n_digits,
         seconds = elapsed)
  }
}

find_phrase_in_pi <- function(phrase, n_digits) {
  pat <- encode_a1z26(phrase)
  res <- find_in_pi(pat, n_digits)
  res$pattern <- pat
  res$phrase  <- phrase
  res
}

and finally, to run the function(s):

## Run functions
word <- "eggs"
encoded_word <- encode_a1z26(word)
cat("Encoded ",word," ->", encoded_word, "\n")  
result_today <- find_in_pi(encoded_word, 1e5)
print(result_today)

And see that the word “EGGS” as the number 57719, appears on Pi Number on 6026th till 6030th position. Pretty useless 🙂

As always, the complete code is available on GitHub in  Useless_R_function repository. The first version is here (filename: Find_substring_in_Pi.r).

Check the repository for future updates!

Stay healthy and happy R-coding!

To leave a comment for the author, please follow the link and comment on their blog: R – TomazTsql.

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)