Solución:
Si no desea implementar su propio algoritmo, puede usar mpmath.
try:
# import version included with old SymPy
from sympy.mpmath import mp
except ImportError:
# import newer version
from mpmath import mp
mp.dps = 1000 # set number of digits
print(mp.pi) # print pi to a thousand places
Referencia
Actualizar: El código admite instalaciones más antiguas y más nuevas de SymPy (ver comentario). *
Ejecuta esto
def make_pi():
q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
for j in range(1000):
if 4 * q + r - t < m * t:
yield m
q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
else:
q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2
my_array = []
for i in make_pi():
my_array.append(str(i))
my_array = my_array[:1] + ['.'] + my_array[1:]
big_string = "".join(my_array)
print "here is a big string:n %s" % big_string
Y leer sobre yield
operador desde aquí: ¿Qué hace la palabra clave “rendimiento”?
Esta es la respuesta:
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337
La respuesta aceptada es incorrecta, como se indica en los comentarios.
El código del OP parece estar basado en una implementación del algoritmo de Spigot copiado de aquí.
Para corregir el código según la pregunta del OP (aunque cambié el nombre de las variables y funciones para que coincidan con lo que estaban en la fuente original), una solución podría ser:
#!/usr/bin/env python
DIGITS = 1000
def pi_digits(x):
"""Generate x digits of Pi."""
q,r,t,k,n,l = 1,0,1,1,3,3
while x >= 0:
if 4*q+r-t < x*t:
yield n
x -= 1
q,r,t,k,n,l = 10*q, 10*(r-n*t), t, k, (10*(3*q + r))/t-10*n, l
else:
q,r,t,k,n,l = q*k, (2*q+r)*l, t*l, k+1, (q*(7*k+2)+r*l)/(t*l), l+2
digits = [str(n) for n in list(pi_digits(DIGITS))]
print("%s.%sn" % (digits.pop(0), "".join(digits)))
Además, aquí hay una implementación mucho más rápida *, aparentemente también basada en el algoritmo de Spigot:
#!/usr/bin/env python
DIGITS = 1000
def pi_digits(x):
"""Generate x digits of Pi."""
k,a,b,a1,b1 = 2,4,1,12,4
while x > 0:
p,q,k = k * k, 2 * k + 1, k + 1
a,b,a1,b1 = a1, b1, p*a + q*a1, p*b + q*b1
d,d1 = a/b, a1/b1
while d == d1 and x > 0:
yield int(d)
x -= 1
a,a1 = 10*(a % b), 10*(a1 % b1)
d,d1 = a/b, a1/b1
digits = [str(n) for n in list(pi_digits(DIGITS))]
print("%s.%sn" % (digits.pop(0), "".join(digits)))
Probé ambos un par de veces con este generador de dígitos Pi en línea.
Todo el crédito a este Gist por deeplook.
* Basado en la prueba de 10,000 dígitos, donde obtuve aproximadamente 7 segundos en comparación con aproximadamente 1 segundo.