1000 digits of pi in Python 1000 digits of pi in Python python python

1000 digits of pi in Python


If you don't want to implement your own algorithm, you can use mpmath.

try:    # import version included with old SymPy    from sympy.mpmath import mpexcept ImportError:    # import newer version    from mpmath import mpmp.dps = 1000  # set number of digitsprint(mp.pi)   # print pi to a thousand places

Reference

Update: Code supports older and newer installations of SymPy (see comment).*


Run this

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+2my_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 

And read about yield operator from here:What does the "yield" keyword do?

Here is the answer:

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337


The accepted answer is incorrect, as noted in comments.

The OP's code appears to be based on an implementation of Spigot's algorithm copied from here.

To fix the code per the OP's question (although I renamed the variables and functions to match what they were in the original source), one solution might be:

#!/usr/bin/env pythonDIGITS = 1000def 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+2digits = [str(n) for n in list(pi_digits(DIGITS))]print("%s.%s\n" % (digits.pop(0), "".join(digits)))

Also, here is a much faster* implementation, also apparently based on Spigot's algorithm:

#!/usr/bin/env pythonDIGITS = 1000def 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/b1digits = [str(n) for n in list(pi_digits(DIGITS))]print("%s.%s\n" % (digits.pop(0), "".join(digits)))

I tested both a few times against this online Pi digit generator.

All credit to this Gist by deeplook.

* Based on testing 10,000 digits, where I got about 7 seconds compared to about 1 second.