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/2\). 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.
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/2\).
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=3\), 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\) representa o lado do hexágono e \(s'\) o lado do dodecágono.
Fig 2: Construindo o dodecágono inscrito
Para obter \(s'\), o comprimento do lado do dodecágono, podemos inicialmente solucionar o valor de \(h\) por Pitágoras e, a seguir, o valor de \(x\) observando que \(h+x=s=1/2\), pela geometria da figura. Conhecendo-se \(x\), é possível, também por Pitágoras, obter o valor de \(s'\) facilmente. Esses passos são sumarizados a seguir:
Encontrando um valor para \(x\)
Encontrando um valor para \(s'\)
Perceba que \(s\) permanecerá constante caso repliquemos a equação aumentando o número de lados \((l)\). Porém, \(s_t\) será sempre a base do triângulo do polígono com \(l-1\) lados.
O perímetro do dodecágono será então definido por:
Ou, utilizando o R para os cálculos, lembrando que \(s=1/2\), obtemos
s<-1/2
slinha<-sqrt(((1/2)-(1/2)*(sqrt(1-s^2)))^2+(s^2)/4)
Pd<-12*slinha
cat("Pd = ",Pd)
## Pd = 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/2
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,pi-p))
s<-sqrt(((1/2)-(1/2)*(sqrt(1-s^2)))^2+(s^2)/4)
}
}
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.10582854123024887 dif 0.03576411235954424
## t= 3 Lados: 24 Lim inf: 3.13262861328123776 dif 0.00896404030855535
## t= 4 Lados: 48 Lim inf: 3.13935020304686674 dif 0.00224245054292638
## t= 5 Lados: 96 Lim inf: 3.14103195089050979 dif 0.00056070269928332
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.10582854123024887 dif 0.03576411235954424
## t= 3 Lados: 24 Lim inf: 3.13262861328123776 dif 0.00896404030855535
## t= 4 Lados: 48 Lim inf: 3.13935020304686674 dif 0.00224245054292638
## t= 5 Lados: 96 Lim inf: 3.14103195089050979 dif 0.00056070269928332
## t= 6 Lados: 192 Lim inf: 3.14145247228546243 dif 0.00014018130433069
## t= 7 Lados: 384 Lim inf: 3.14155760791185790 dif 0.00003504567793522
## t= 8 Lados: 768 Lim inf: 3.14158389214831857 dif 0.00000876144147455
## t= 9 Lados: 1536 Lim inf: 3.14159046322805047 dif 0.00000219036174265
## t= 10 Lados: 3072 Lim inf: 3.14159210599927174 dif 0.00000054759052137
## t= 11 Lados: 6144 Lim inf: 3.14159251669215767 dif 0.00000013689763545
## t= 12 Lados: 12288 Lim inf: 3.14159261936538403 dif 0.00000003422440908
## t= 13 Lados: 24576 Lim inf: 3.14159264503369107 dif 0.00000000855610205
## t= 14 Lados: 49152 Lim inf: 3.14159265145076816 dif 0.00000000213902496
## t= 15 Lados: 98304 Lim inf: 3.14159265305503732 dif 0.00000000053475580
## t= 16 Lados: 196608 Lim inf: 3.14159265345610450 dif 0.00000000013368862
## t= 17 Lados: 393216 Lim inf: 3.14159265355637185 dif 0.00000000003342127
## t= 18 Lados: 786432 Lim inf: 3.14159265358143802 dif 0.00000000000835509
## t= 19 Lados: 1572864 Lim inf: 3.14159265358770456 dif 0.00000000000208855
## t= 20 Lados: 3145728 Lim inf: 3.14159265358927131 dif 0.00000000000052180
## t= 21 Lados: 6291456 Lim inf: 3.14159265358966300 dif 0.00000000000013012
## t= 22 Lados: 12582912 Lim inf: 3.14159265358976114 dif 0.00000000000003197
## t= 23 Lados: 25165824 Lim inf: 3.14159265358978557 dif 0.00000000000000755
## t= 24 Lados: 50331648 Lim inf: 3.14159265358979134 dif 0.00000000000000178
## t= 25 Lados: 100663296 Lim inf: 3.14159265358979312 dif 0.00000000000000000
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)
s<-1/2
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,24),format(novopi-p,24)))
s<-sqrt(((1/2)-(1/2)*(sqrt(1-s^2)))^2+(s^2)/4)
}
}
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(40,150)
## t= 1 Lados: 6 Lim inf: 3.00000000000000000000000 dif: 0.141592653589793238462643
## t= 2 Lados: 12 Lim inf: 3.10582854123024887371685 dif: 0.0357641123595443647457974
## t= 3 Lados: 24 Lim inf: 3.13262861328123776161192 dif: 0.00896404030855547685072412
## t= 4 Lados: 48 Lim inf: 3.13935020304686696057672 dif: 0.00224245054292627788592159
## t= 5 Lados: 96 Lim inf: 3.14103195089050979404988 dif: 0.000560702699283444412767092
## t= 6 Lados: 192 Lim inf: 3.14145247228546242723723 dif: 0.000140181304330811225408577
## t= 7 Lados: 384 Lim inf: 3.14155760791185789670976 dif: 3.50456779353417528814663e-5
## t= 8 Lados: 768 Lim inf: 3.14158389214831856861565 dif: 8.76144147466984699309079e-6
## t= 9 Lados: 1536 Lim inf: 3.14159046322805024509250 dif: 2.19036174299337013922752e-6
## t= 10 Lados: 3072 Lim inf: 3.14159210599927196660985 dif: 5.47590521271852789648726e-7
## t= 11 Lados: 6144 Lim inf: 3.14159251669215766611387 dif: 1.36897635572348771855211e-7
## t= 12 Lados: 12288 Lim inf: 3.14159261936538425352694 dif: 3.42244089849357028998542e-8
## t= 13 Lados: 24576 Lim inf: 3.14159264503369106691366 dif: 8.55610217154898196724156e-9
## t= 14 Lados: 49152 Lim inf: 3.14159265145076793679380 dif: 2.13902530166884804031492e-9
## t= 15 Lados: 98304 Lim inf: 3.14159265305503732079728 dif: 5.34755917665360864809774e-10
## t= 16 Lados: 196608 Lim inf: 3.14159265345610450026470 dif: 1.33688738197942764706970e-10
## t= 17 Lados: 393216 Lim inf: 3.14159265355637162819846 dif: 3.34216102641808521343065e-11
## t= 18 Lados: 786432 Lim inf: 3.14159265358143824364845 dif: 8.35499481419406776462172e-12
## t= 19 Lados: 1572864 Lim inf: 3.14159265358770456444404 dif: 2.08867401860475921916266e-12
## t= 20 Lados: 3145728 Lim inf: 3.14159265358927131117639 dif: 5.21927286253738309316829e-13
## t= 21 Lados: 6291456 Lim inf: 3.14159265358966299785948 dif: 1.30240603165983081855372e-13
## t= 22 Lados: 12582912 Lim inf: 3.14159265358976091953025 dif: 3.23189323940442749900079e-14
## t= 23 Lados: 25165824 Lim inf: 3.14159265358978556648140 dif: 7.67198124736579979260330e-15
## t= 24 Lados: 50331648 Lim inf: 3.14159265358979156168573 dif: 1.67677691438995447431569e-15
## t= 25 Lados: 100663296 Lim inf: 3.14159265358979289395336 dif: 3.44509284839766625807333e-16
## t= 26 Lados: 201326592 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 27 Lados: 402653184 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 28 Lados: 805306368 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 29 Lados: 1610612736 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 30 Lados: 3221225472 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 31 Lados: 6442450944 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 32 Lados: 12884901888 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 33 Lados: 25769803776 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 34 Lados: 51539607552 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 35 Lados: 103079215104 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 36 Lados: 206158430208 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 37 Lados: 412316860416 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 38 Lados: 824633720832 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 39 Lados: 1649267441664 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16
## t= 40 Lados: 3298534883328 Lim inf: 3.14159265358979356008717 dif: -3.21624529935327298446846e-16