Esta nota técnica apresenta a obtenção de limite inferior 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 ´problemas numéricos nos cálculos em precisão dupla, algo que dificulta a obtenção do limite mínimo desejado. É 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 produzir limites com número maior de decimais corretas, algo que o leitor pode fazer com facilidade, a partir dos procedimentos apresentados, eventualmente aumentando o número de dígitos nas variáveis definidas pelo package Rmpfr. A título de curiosidade, o record, em 2014, já superava 13 trilhões de dígitos. Uma cronologia da evolução das estimativas com referências é apresentada na Wikipedia.
Apesar do método geométrico ser atrativo, e usado por muito autores ao longo da história, há hoje outros métodos mais eficientes que levam à mais rápida convergência com menor esforço computacional.
Como exercício, proponho ao leitor a obtenção de limite superior para \(\pi\) partindo de um círculo de raio 1 inscrito em um hexágono.
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.
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).
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.
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\):
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\).
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,10)))
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.1415926536
## t= 2 Lados: 12 Lim inf: 3.10582854123024914818679 dif: 0.03576411236
## t= 3 Lados: 24 Lim inf: 3.13262861328123819716175 dif: 0.008964040309
## t= 4 Lados: 48 Lim inf: 3.13935020304686720713515 dif: 0.002242450543
## t= 5 Lados: 96 Lim inf: 3.14103195089050963811135 dif: 0.0005607026993
## t= 6 Lados: 192 Lim inf: 3.14145247228546207545061 dif: 0.0001401813043
## t= 7 Lados: 384 Lim inf: 3.14155760791185764551646 dif: 3.504567794e-5
## t= 8 Lados: 768 Lim inf: 3.14158389214831840866897 dif: 8.761441475e-6
## t= 9 Lados: 1536 Lim inf: 3.14159046322805009573846 dif: 2.190361743e-6
## t= 10 Lados: 3072 Lim inf: 3.14159210599927155054478 dif: 5.475905217e-7
## t= 11 Lados: 6144 Lim inf: 3.14159251669215744759287 dif: 1.368976358e-7
## t= 12 Lados: 12288 Lim inf: 3.14159261936538395518955 dif: 3.422440928e-8
## t= 13 Lados: 24576 Lim inf: 3.14159264503369089667214 dif: 8.556102342e-9
## t= 14 Lados: 49152 Lim inf: 3.14159265145076765170425 dif: 2.139025587e-9
## t= 15 Lados: 98304 Lim inf: 3.14159265305503684169112 dif: 5.347563968e-10
## t= 16 Lados: 196608 Lim inf: 3.14159265345610413926464 dif: 1.336890992e-10
## t= 17 Lados: 393216 Lim inf: 3.14159265355637096366282 dif: 3.342227480e-11
## t= 18 Lados: 786432 Lim inf: 3.14159265358143766976267 dif: 8.355568700e-12
## t= 19 Lados: 1572864 Lim inf: 3.14159265358770434628765 dif: 2.088892175e-12
## t= 20 Lados: 3145728 Lim inf: 3.14159265358927101541889 dif: 5.222230437e-13
## t= 21 Lados: 6291456 Lim inf: 3.14159265358966268270171 dif: 1.305557609e-13
## t= 22 Lados: 12582912 Lim inf: 3.14159265358976059952241 dif: 3.263894023e-14
## t= 23 Lados: 25165824 Lim inf: 3.14159265358978507872758 dif: 8.159735059e-15
## t= 24 Lados: 50331648 Lim inf: 3.14159265358979119852888 dif: 2.039933765e-15
## t= 25 Lados: 100663296 Lim inf: 3.14159265358979272847920 dif: 5.099834412e-16
## t= 26 Lados: 201326592 Lim inf: 3.14159265358979311096678 dif: 1.274958603e-16
## t= 27 Lados: 402653184 Lim inf: 3.14159265358979320658868 dif: 3.187396507e-17
## t= 28 Lados: 805306368 Lim inf: 3.14159265358979323049415 dif: 7.968491268e-18
## t= 29 Lados: 1610612736 Lim inf: 3.14159265358979323647052 dif: 1.992122817e-18
## t= 30 Lados: 3221225472 Lim inf: 3.14159265358979323796461 dif: 4.980307043e-19
## t= 31 Lados: 6442450944 Lim inf: 3.14159265358979323833814 dif: 1.245076761e-19
## t= 32 Lados: 12884901888 Lim inf: 3.14159265358979323843152 dif: 3.112691902e-20
## t= 33 Lados: 25769803776 Lim inf: 3.14159265358979323845486 dif: 7.781729754e-21
## t= 34 Lados: 51539607552 Lim inf: 3.14159265358979323846070 dif: 1.945432439e-21
## t= 35 Lados: 103079215104 Lim inf: 3.14159265358979323846216 dif: 4.863581096e-22