Python 59 bytes
print reduce(lambda x,p:p/2*x/p+2*10**999,range(6637,1,-2))
Isso imprime 1000 dígitos; um pouco mais do que o necessário 5. Em vez de usar a iteração prescrita, ele usa o seguinte:
pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + 5/11*(2 + ...)))))
O 6637
(o denominador mais interno) pode ser formulado como:
dígitos * 2 * log 2 (10)
Isso implica uma convergência linear. Cada iteração mais profunda produzirá mais um bit binário de pi .
Se , no entanto, você insistir em usar aidentidade tan -1 , uma convergência semelhante poderá ser alcançada, se você não se importar em abordar o problema de maneira ligeiramente diferente. Analisando as somas parciais:
4.0, 2.66667, 3.46667, 2.89524, 3.33968, 2.97605, 3.28374, ...
é evidente que cada termo pula para frente e para trás em ambos os lados do ponto de convergência; a série tem convergência alternada. Além disso, cada termo está mais próximo do ponto de convergência do que o termo anterior; é absolutamente monotônico em relação ao seu ponto de convergência. A combinação dessas duas propriedades implica que a média aritmética de dois termos vizinhos está mais próxima do ponto de convergência do que qualquer um dos termos em si. Para ter uma idéia melhor do que quero dizer, considere a seguinte imagem:
A série externa é a original e a série interna é encontrada calculando a média de cada um dos termos vizinhos. Uma diferença notável. Mas o que é realmente notável é que essa nova série também possui convergência alternada e é absolutamente monotônica em relação ao seu ponto de convergência. Isso significa que esse processo pode ser aplicado repetidamente, ad nauseum.
Está bem. Mas como?
Algumas definições formais. Deixe- P 1 (n) ser o n th termo da primeira sequência, P 2 (n) ser o n th termo da segunda sequência, e semelhante P k (n) o N ° termo do k th sequência tal como acima definido .
P 1 = [P 1 (1), P 1 (2), P 1 (3), P 1 (4), P 1 (5), ...]
P 2 = [(P 1 (1) + P 1 (2)) / 2, (P 1 (2) + P 1 (3)) / 2, (P 1 (3) + P 1 (4)) / 2, (P 1 (4) + P 1 (5)) / 2, ...]
P 3 = [(P 1 (1) + 2P 1 (2) + P 1 (3)) / 4, (P 1 (2) + 2P 1 (3) + P 1 (4)) / 4, (P 1 (3) + 2P 1 (4) + P 1 (5)) / 4, ...]
P 4 = [(P 1 (1) + 3P 1 (2) + 3P 1 (3) + P 1 (4)) / 8, (P 1 (2) + 3P 1 (3) + 3P 1 (4) + P 1 (5)) / 8, ...]
Não surpreendentemente, esses coeficientes seguem exatamente os coeficientes binomiais e podem ser expressos como uma única linha do triângulo de Pascal. Como uma linha arbitrária do Triângulo de Pascal é trivial de calcular, uma série arbitrariamente 'profunda' pode ser encontrada, simplesmente tomando as primeiras n somas parciais, multiplicando cada pelo termo correspondente na k- ésima linha do Triângulo de Pascal e dividindo por 2 k-1 .
Dessa forma, a precisão total do ponto flutuante de 32 bits (~ 14 casas decimais) pode ser alcançada com apenas 36 iterações, momento em que as somas parciais nem convergiram para a segunda casa decimal. Obviamente, isso não é um jogo de golfe:
# used for pascal's triangle
t = 36; v = 1.0/(1<<t-1); e = 1
# used for the partial sums of pi
p = 4; d = 3; s = -4.0
x = 0
while t:
t -= 1
p += s/d; d += 2; s *= -1
x += p*v
v = v*t/e; e += 1
print "%.14f"%x
Se você queria precisão arbitrária, isso pode ser alcançado com uma pequena modificação. Aqui, mais uma vez, calculando 1000 dígitos:
# used for pascal's triangle
f = t = 3318; v = 1; e = 1
# used for the partial sums of pi
p = 4096*10**999; d = 3; s = -p
x = 0
while t:
t -= 1
p += s/d; d += 2; s *= -1
x += p*v
v = v*t/e; e += 1
print x>>f+9
O valor inicial de p começa 2 10 maior, para neutralizar os efeitos da divisão inteira de s / d à medida que d se torna maior, fazendo com que os últimos dígitos não convergam. Observe aqui novamente que 3318
também é:
dígitos * log 2 (10)
O mesmo número de iterações que o primeiro algoritmo (dividido pela metade porque t diminui em 1 em vez de 2 em cada iteração). Mais uma vez, isso indica uma convergência linear: um bit binário de pi por iteração. Em ambos os casos, são necessárias 3318 iterações para calcular 1000 dígitos de pi , como uma cota ligeiramente melhor que 1 milhão de iterações para calcular 5.
p=lambda:3.14159