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”):
- Encode the word EGGS to numbers. E = 5, G = 7, G = 7 and S = 19. Together concatenated we get the string of 57719.
- We store a veeery long string of PI number.
- 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!




Leave a comment