Introdução

Esta nota técnica apresenta uma derivação de limites inferiores para \(\pi\) a partir de polígonos regulares inscritos em um círculo de raio 1. Arquimedes (287-212 AC) foi um dos pioneiros no uso desse método, considerando polígonos regulares de 96 faces. A nota discute também dificultades numéricas nos cálculos em precisão dupla, algo que limita a precisão do limite mínimo calculado.

É apresentada uma solução para o problema de precisão com a utilização de variáveis com cerca de 100 digitos significativos (em lugar das 15 a 16 em dupla precisão), viabilizada pelo package Rmpfr do R. Esse procedimento possibilitou a obtenção de uma estimativa para \(\pi\) correta nas primeiras 20 decimais. O objetivo do trabalho é somente didático e certamente não teve qualquer intenção de quebrar o record atual, que em 2014 já superava 13 trilhões de dígitos. Apesar desse método geométrico ser atrativo, há hoje outros métodos mais eficientes que levam à mais rápida convergência.

Como exercício desenvolva um processo similar para obtenção de limite superior.

Limite inferior para \(\pi\) por hexágono inscrito

Considere a figura a seguir, contendo um polígono regular com 6 faces (hexágono) inscrito num círculo com raio com dimensão 1.

figura PI

Fig 1: Hexágono inscrito em círculo

Pela geometria da Fig 1, podemos concluir que o perímetro do círculo \(P_c\) será dado por:

Se \(P_h\) representa o perímetro do hexágono, pode-se concluir facilmente que \(P_h<P_c\), dado que o menor caminho entre dos pontos é uma reta. Observando o triângulo isóceles formado pelo segmento do polígono representado na figura, tem-se que \(P_h=6\), e que, pela primeira equação

Mas esse limite inferior pode ser melhorado, usando em lugar do hexágono, um polígono regular inscrito de 12 lados (dodecágono).

Limite inferior para \(\pi\) por dodecágono inscrito

Considere a Fig 2 a seguir, construida a partir da anterior, em que se observa 2 lados de um polígono regular de 12 faces (dodecágono), obtidos a partir da biseção do ângulo de 60 graus do segmento do hexágono. Na figura, \(s_1\) representa o lado do hexágono e \(s_2\) o lado do dodecágono.

figura PI

Fig 2: Construindo o dodecágono inscrito

Para obter \(s_2\), o comprimento do lado do dodecágono, podemos inicialmente solucionar o valor de \(h\) por Pitágoras e, a seguir, o valor de \(b\) observando que \(h+b=1\), pela geometria da figura. Conhecendo-se \(b\), é possível, também por Pitágoras, obter o valor de \(s_2\) facilmente. Esses passos são sumarizados a seguir:

Após as devidas simplificações chega-se a

O perímetro do dodecágono será então definido por:

Ou, utilizando o R para os cálculos, lembrando que \(s_1=1\), obtemos

s1<-1
s2<-sqrt(2-sqrt(4-s1^2))
Pd<-12*s2
cat("Pd/2 = ",Pd/2)
## Pd/2 =  3.105829

Concluindo-se então um novo (e melhor) limite inferior para \(\pi\):

Melhores limites com polígonos de mais lados

O mesmo argumento utilizado na Fig 2 para a construção do dodecágono a partir do hexágono pode ser repetido para construção de um polígono regular inscrito de 24 faces a partir do dodecágono, e assim sucessivamente, dobrando-se a cada passo o número de faces (48, 96, 192 … ).

Para facilitar a construção, considere a sequência de polígonos regulares internos caracterizados pelo índice \(t=1,2,\ldots,\) em que o número de lados \(L_t\) é definido por * \(L_t=3\times 2^t\) Com essa definição \(t=1\) corresponde ao hexágono, \(t=2\) ao dodecágono e assim sucessivamente, dobrando-se o número de lados, na medida que \(t\) cresce uma unidade. E utilizando o mesmo argumento usado no ultimo tópico, recursivamente, podemos concluir que

com \(s_1=1\) correspondendo ao lado do hexágono.

Se \(s_t\) e \(P_t\) representam, respectivamente, o comprimento do lado do polígono \(t\), tem-se

Usando a equação em diferença acima, partindo de \(t=1\) podemos obter limites inferiores para \(\pi\) que sejam arbitrariamente melhores. A função do R definida a seguir possibilita a obtenção do limite inferior para \(\pi\) para \(t=n\), com fundamento nos argumentos desenvolvidos:

acha_liminf<-function(n){
  s<-1
  for(i in 1:n){
    L<-3*2^i
    p<-L*s
    cat(sprintf("t= %2i Lados: %10.0f Lim inf: %0.17f dif %0.17f \n",i,L,p/2,pi-p/2))
    s<-sqrt(2-sqrt(4-s^2))
  }    
}

Testando a função definida acima com \(t=5\), correspondente ao polígono de 96 faces, computamos o limite inferior obtido por Arquimedes por

acha_liminf(5)
## t=  1 Lados:          6 Lim inf: 3.00000000000000000 dif 0.14159265358979312 
## t=  2 Lados:         12 Lim inf: 3.10582854123024976 dif 0.03576411235954335 
## t=  3 Lados:         24 Lim inf: 3.13262861328123687 dif 0.00896404030855624 
## t=  4 Lados:         48 Lim inf: 3.13935020304687207 dif 0.00224245054292105 
## t=  5 Lados:         96 Lim inf: 3.14103195089052978 dif 0.00056070269926334

A função mostra, além do valor computado para o limite inferior, a cada passo, a diferença entre esse valor e o valor de \(pi\) definido internamente pelo R, através da constante \(pi\).

Problemas numéricos com os valores computados

Se usarmos aumentarmos arbitrariamente \(t\) no procedimento apresentado no ultimo parágrafo, observa-se, a partir de um certo ponto (\(t=16\)), que os valores obtidos para o limite indicam alguma anomalia no processo computacional.

acha_liminf(25)
## t=  1 Lados:          6 Lim inf: 3.00000000000000000 dif 0.14159265358979312 
## t=  2 Lados:         12 Lim inf: 3.10582854123024976 dif 0.03576411235954335 
## t=  3 Lados:         24 Lim inf: 3.13262861328123687 dif 0.00896404030855624 
## t=  4 Lados:         48 Lim inf: 3.13935020304687207 dif 0.00224245054292105 
## t=  5 Lados:         96 Lim inf: 3.14103195089052978 dif 0.00056070269926334 
## t=  6 Lados:        192 Lim inf: 3.14145247228534430 dif 0.00014018130444882 
## t=  7 Lados:        384 Lim inf: 3.14155760791162209 dif 0.00003504567817103 
## t=  8 Lados:        768 Lim inf: 3.14158389214893585 dif 0.00000876144085726 
## t=  9 Lados:       1536 Lim inf: 3.14159046323676172 dif 0.00000219035303139 
## t= 10 Lados:       3072 Lim inf: 3.14159210604304828 dif 0.00000054754674483 
## t= 11 Lados:       6144 Lim inf: 3.14159251658815464 dif 0.00000013700163848 
## t= 12 Lados:      12288 Lim inf: 3.14159261864078942 dif 0.00000003494900369 
## t= 13 Lados:      24576 Lim inf: 3.14159264532121574 dif 0.00000000826857738 
## t= 14 Lados:      49152 Lim inf: 3.14159264532121574 dif 0.00000000826857738 
## t= 15 Lados:      98304 Lim inf: 3.14159264532121574 dif 0.00000000826857738 
## t= 16 Lados:     196608 Lim inf: 3.14159264532121574 dif 0.00000000826857738 
## t= 17 Lados:     393216 Lim inf: 3.14159230381173771 dif 0.00000034977805541 
## t= 18 Lados:     786432 Lim inf: 3.14159230381173771 dif 0.00000034977805541 
## t= 19 Lados:    1572864 Lim inf: 3.14158683965504126 dif 0.00000581393475185 
## t= 20 Lados:    3145728 Lim inf: 3.14158683965504126 dif 0.00000581393475185 
## t= 21 Lados:    6291456 Lim inf: 3.14167426502175751 dif -0.00008161143196439 
## t= 22 Lados:   12582912 Lim inf: 3.14167426502175751 dif -0.00008161143196439 
## t= 23 Lados:   25165824 Lim inf: 3.13747509950278314 dif 0.00411755408700998 
## t= 24 Lados:   50331648 Lim inf: 3.13747509950278314 dif 0.00411755408700998 
## t= 25 Lados:  100663296 Lim inf: 3.18198051533946380 dif -0.04038786174967068

Isso se deve à representação finita dos números pelos computadores, em geral limitada a 15 a 16 digitos significativos, em cálculos envolvendo a chamada precisão dupla, algo que pode trazer dificuldades aos cálculos realizados.

Uma solução possível para o problema pode envolver o uso de recursos do R para cálculos utilizando um número arbitrário de digitos significativos nos cálculos. Isso é implementado pelo package Rmpfr, que deve ser instalado antes de sua utilização.

A seguir apresentamos uma nova versão da função definida anteriormente, que considera cálculos com \(k\) digitos significativos, onde \(k\) é um argumento da função. Usamos na função a constante \(\pi\) definida no package Rmpfr que também pode ser definida com um número arbitrário de digitos significativos, para fazer as comparações. A função mpfr do package define um número com um numero de bits de interesse e esse número de bits é propagado para todos números e operações que dependem desse número. Na função o número de bits é calculado a partir de um número de digitos de interesse \(k\), a partir de recomendações na documentação do package.

acha_liminf2<-function(n,k){
  require(Rmpfr)
  bits<-k*log2(10) #convertendo digitos em bits
  s<-mpfr(1,bits) # s passa a ser um número com k digitos significativos
  p<-mpfr(0,bits)
  novopi<-Const("pi",bits)
  for(i in 1:n){
    L<-3*2^mpfr(i,bits)
    p<-L*s #operação propaga o número de digitos definido para p
    cat(sprintf("t= %2i Lados: %12.0f Lim inf: %s dif: %s \n",i,L,format(p/2,24),format(novopi-p/2,24)))
    s<-sqrt(2-sqrt(4-s^2))
  }    
}

Testamos a seguir a nova função considerando 100 digitos significativos nos cálculos, para obtenção de um limite inferior para \(\pi\) considerando \(t=35\), um polígono regular inscrito com 103079215104 lados. Nesse caso, as decimais de \(\pi\) estão corretas nas primeiras 21 casas decimais.

acha_liminf2(35,100)
## t=  1 Lados:            6 Lim inf: 3.00000000000000000000000 dif: 0.141592653589793238462643 
## t=  2 Lados:           12 Lim inf: 3.10582854123024914818679 dif: 0.0357641123595440902758573 
## t=  3 Lados:           24 Lim inf: 3.13262861328123819716175 dif: 0.00896404030855504130089391 
## t=  4 Lados:           48 Lim inf: 3.13935020304686720713515 dif: 0.00224245054292603132749656 
## t=  5 Lados:           96 Lim inf: 3.14103195089050963811135 dif: 0.000560702699283600351290457 
## t=  6 Lados:          192 Lim inf: 3.14145247228546207545061 dif: 0.000140181304331163012034074 
## t=  7 Lados:          384 Lim inf: 3.14155760791185764551646 dif: 3.50456779355929461800381e-5 
## t=  8 Lados:          768 Lim inf: 3.14158389214831840866897 dif: 8.76144147482979367377956e-6 
## t=  9 Lados:         1536 Lim inf: 3.14159046322805009573846 dif: 2.19036174314272418487735e-6 
## t= 10 Lados:         3072 Lim inf: 3.14159210599927155054478 dif: 5.47590521687917866742669e-7 
## t= 11 Lados:         6144 Lim inf: 3.14159251669215744759287 dif: 1.36897635790869769298511e-7 
## t= 12 Lados:        12288 Lim inf: 3.14159261936538395518955 dif: 3.42244092832730940712142e-8 
## t= 13 Lados:        24576 Lim inf: 3.14159264503369089667214 dif: 8.55610234179050187436026e-9 
## t= 14 Lados:        49152 Lim inf: 3.14159265145076765170425 dif: 2.13902558675838974278728e-9 
## t= 15 Lados:        98304 Lim inf: 3.14159265305503684169112 dif: 5.34756396771520202864029e-10 
## t= 16 Lados:       196608 Lim inf: 3.14159265345610413926464 dif: 1.33689099198000223664425e-10 
## t= 17 Lados:       393216 Lim inf: 3.14159265355637096366282 dif: 3.34222747998200667253895e-11 
## t= 18 Lados:       786432 Lim inf: 3.14159265358143766976267 dif: 8.35556869997501735692771e-12 
## t= 19 Lados:      1572864 Lim inf: 3.14159265358770434628765 dif: 2.08889217499500438145570e-12 
## t= 20 Lados:      3145728 Lim inf: 3.14159265358927101541889 dif: 5.22223043748829223002910e-13 
## t= 21 Lados:      6291456 Lim inf: 3.14159265358966268270171 dif: 1.30555760937212188728164e-13 
## t= 22 Lados:     12582912 Lim inf: 3.14159265358976059952241 dif: 3.26389402343033523681308e-14 
## t= 23 Lados:     25165824 Lim inf: 3.14159265358978507872758 dif: 8.15973505857585716616332e-15 
## t= 24 Lados:     50331648 Lim inf: 3.14159265358979119852888 dif: 2.03993376464396548367399e-15 
## t= 25 Lados:    100663296 Lim inf: 3.14159265358979272847920 dif: 5.09983441160991445426821e-16 
## t= 26 Lados:    201326592 Lim inf: 3.14159265358979311096678 dif: 1.27495860290247866013475e-16 
## t= 27 Lados:    402653184 Lim inf: 3.14159265358979320658868 dif: 3.18739650725619667944170e-17 
## t= 28 Lados:    805306368 Lim inf: 3.14159265358979323049415 dif: 7.96849126814049171679476e-18 
## t= 29 Lados:   1610612736 Lim inf: 3.14159265358979323647052 dif: 1.99212281703512293033560e-18 
## t= 30 Lados:   3221225472 Lim inf: 3.14159265358979323796461 dif: 4.98030704258780732654956e-19 
## t= 31 Lados:   6442450944 Lim inf: 3.14159265358979323833814 dif: 1.24507676064695183168180e-19 
## t= 32 Lados:  12884901888 Lim inf: 3.14159265358979323843152 dif: 3.11269190161737957923226e-20 
## t= 33 Lados:  25769803776 Lim inf: 3.14159265358979323845486 dif: 7.78172975404344894809799e-21 
## t= 34 Lados:  51539607552 Lim inf: 3.14159265358979323846070 dif: 1.94543243851086223702558e-21 
## t= 35 Lados: 103079215104 Lim inf: 3.14159265358979323846216 dif: 4.86358109627715559256463e-22