O Pi (ou π) é uma constante matemática. É definido como a razão entre o comprimento de uma circunferência e seu diâmetro. Seu valor aproximado para duas casas decimais é 3,14. Neste link é possível ver o primeiro milhão de casas decimais de π (o número 3, referente à unidade, foi excluído).

Hoje, dia 14 de março, é comemorado o Dia do Pi. Isto se deve à maneira como se representam as datas nos Estados Unidos. Como 3/14 é a maneira utilizada se fazer referência ao dia 14 de março no sistema daquele país, convencionou-se considerar este dia como sendo o Dia do Pi.

Para não deixar a data passar em branco, resolvi fazer duas coisas. A primeira delas é verificar quantas vezes cada dígito de 0 a 9 aparece no primeiro milhão de casas decimais de π. Assim, seria possível tentar encontrar algum padrão nestes números, embora seja provado pela matemática que π não possui padrão algum, ao menos em seu primeiro milhão de dígitos.

Dígito Frequência
0 99959
1 99758
2 100026
3 100229
4 100230
5 100359
6 99548
7 99800
8 99985
9 100106

Como podemos ver, há dígitos que ocorrem mais do que outros. Por exemplo, o dígito 6 ocorre 100359 vezes no primeiro milhão de casas decimais, enquanto 7 ocorre apenas 99548 vezes. Embora hajam 811 ocorrências a mais de 6 do que 7, se formos olhar de modo percentual, isto equivale a uma diferença de apenas 0,8%. Não dá pra dizer que é algo considerável.

Mas também é possível visualizar os dígitos de π, procurando padrões visuais neles. A figura abaixo tem dimensão 1000 x 1000 pixels. Cada pixel foi colorido com uma cor variando do azul bem escuro ao azul bem claro. São 10 tonalidades, variando de acordo com a posição do dígito no π. E o que podemos perceber na imagem?

Absolutamente nada. O π é apenas ruído. Não é possível distinguir a imagem formada pelo primeiro milhão de dígitos de π e uma tela de televisão antiga exibindo estática.

O código para reproduzir este estudo está, como sempre, disponível logo abaixo:

# pacotes necessarios

library(tidyverse)
theme_set(theme_bw())

# leitura dos dados

pi <- read.table(file="pi.dat", header = FALSE, colClasses = "character")

# converter as strings em numeros,
# criando um vetor de 1e6 posicoes

pi <- as.numeric(unlist(apply(pi, 2, strsplit, split="")))

# frequencia das casas decimais

table(pi)

# mapa de calor

pi.grid         <- expand.grid(x=1:1000, y=1:1000)
pi.grid$digitos <- pi

ggplot(pi.grid, aes(x, y)) +
  geom_raster(aes(fill = digitos)) +
  scale_fill_continuous(breaks = seq(0, 9, 3)) +
  labs(x="", y="", fill = "Dígitos")