Python 59 bytes
print reduce(lambda x,p:p/2*x/p+2*10**999,range(6637,1,-2))
Esto imprime 1000 dígitos; un poco más de lo requerido 5. En lugar de usar la iteración prescrita, usa esto:
pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + 5/11*(2 + ...)))))
los 6637
(el denominador más interno) se puede formular como:
dígitos * 2 * log 2 (10)
Esto implica una convergencia lineal. Cada iteración más profunda producirá un bit binario más de pi .
Si , sin embargo, insiste en usar el bronceado -1 identidad, una convergencia similar puede conseguirse, si no te importa ir sobre el problema de forma ligeramente diferente. Echando un vistazo a las sumas parciales:
4.0, 2.66667, 3.46667, 2.89524, 3.33968, 2.97605, 3.28374, ...
es evidente que cada término salta de un lado a otro a cada lado del punto de convergencia; La serie tiene convergencia alterna. Además, cada término está más cerca del punto de convergencia que el término anterior; Es absolutamente monótono con respecto a su punto de convergencia. La combinación de estas dos propiedades implica que la media aritmética de cualquiera de los dos términos vecinos está más cerca del punto de convergencia que cualquiera de los términos mismos. Para darle una mejor idea de lo que quiero decir, considere la siguiente imagen:
La serie externa es la original, y la serie interna se encuentra tomando el promedio de cada uno de los términos vecinos. Una notable diferencia. Pero lo que es verdaderamente notable es que esta nueva serie también tiene convergencia alterna y es absolutamente monótona con respecto a su punto de convergencia. Eso significa que este proceso se puede aplicar una y otra vez, hasta la saciedad.
Okay. ¿Pero cómo?
Algunas definiciones formales. Deje P 1 (n) ser el n º término de la primera secuencia, P 2 (n) ser el n º término de la segunda secuencia, y de manera similar P k (n) el n º plazo de la k ésimo secuencia como se define anteriormente .
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, ...]
No es sorprendente que estos coeficientes sigan exactamente los coeficientes binomiales, y pueden expresarse como una sola fila del Triángulo de Pascal. Desde una fila arbitraria de triángulo de Pascal es trivial calcular, una arbitrariamente 'profundo' serie se pueden encontrar, simplemente tomando los primeros n parciales sumas, multiplicar cada por el término correspondiente en el k ésimo fila del triángulo de Pascal, y dividiendo por 2 k-1 .
De esta manera, se puede lograr una precisión total de coma flotante de 32 bits (~ 14 lugares decimales) con solo 36 iteraciones, en cuyo punto las sumas parciales ni siquiera han convergido en el segundo lugar decimal. Esto obviamente no es golf:
# 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
Si quería precisión arbitraria, esto se puede lograr con una pequeña modificación. Aquí una vez más 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
El valor inicial de p comienza 2 10 más grande, para contrarrestar los efectos de división entera de s / d a medida que d se hace más grande, haciendo que los últimos dígitos no converjan. Note aquí nuevamente que3318
también es:
dígitos * log 2 (10)
El mismo número de iteraciones que el primer algoritmo (reducido a la mitad porque t disminuye en 1 en lugar de 2 en cada iteración). Una vez más, esto indica una convergencia lineal: un bit binario de pi por iteración. En ambos casos, se requieren 3318 iteraciones para calcular 1000 dígitos de pi , como una cuota ligeramente mejor que 1 millón de iteraciones para calcular 5.
p=lambda:3.14159