Site icon R-bloggers

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.
Exit mobile version