1000 digits of pi in Python

前端 未结 11 1358
忘了有多久
忘了有多久 2020-11-28 10:54

I have been thinking about this issue and I can\'t figure it out. Perhaps you can assist me. The problem is my code isn\'t working to output 1000 digits of pi in the Python

相关标签:
11条回答
  • 2020-11-28 11:14

    For up to 1 million digits of pi use math_pi (note: I am the author of the module)

    Install with pip:

    pip install math-pi
    

    In Python:

    >>> import math_pi
    >>> print(math_pi.pi(b=1000))
    3.1415926535...
    
    0 讨论(0)
  • 2020-11-28 11:18

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

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

    Here is the answer:

    3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337
    
    0 讨论(0)
  • 2020-11-28 11:20

    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 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.%s\n" % (digits.pop(0), "".join(digits)))
    

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

    #!/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.%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.

    0 讨论(0)
  • 2020-11-28 11:21

    Here you can check whether your program outputs correct 1000 digits: http://spoj.com/CONSTANT

    Of course you can use diff or tc as well but you'd have to copy these 1000 digits from somewhere and there you just submit your program and check whether the score is bigger than 999.

    You can try to print even more digits there and thus get more points. Perhaps you'd enjoy it.

    0 讨论(0)
  • 2020-11-28 11:23

    I'm not familiar with your algorithm. Is it an implementation of BBP?

    In any case, your make_pi is a generator. Try using it in a for loop:

    for digit in make_pi():
        print digit
    

    Note that this loop is infinite: make_pi() never throws StopIteration

    0 讨论(0)
提交回复
热议问题