Chudnovsky algorithm

The Chudnovsky algorithm is a fast method for calculating the digits of π. It was published by the Chudnovsky brothers in 1989,[1] and was used in the world record calculations of 2.7 trillion digits of π in December 2009,[2] 5 trillion digits of π in August 2010,[3] 10 trillion digits of π in October 2011,[4][5] and 12.1 trillion digits in December 2013.[6]

The algorithm is based on the negated Heegner number d = −163, the j-function j(1+−163/2) = 6403203, and on the following rapidly convergent generalized hypergeometric series:[2]

For high performance iterative implementation, this can be simplified to -

There are 3 big integer terms (multinomial term Mk, linear term Lk and exponential term Xk) that make up the series and π is just the constant (C) divided by the sum of the series, as below.

, where -
C = 42688010005
Mk+1 = Mk * (12k+2) * (12k+6) * (12k+10) / (k+1)^3 and M0 = 1
Lk+1 = Lk + 545,140,134 and L0 = 13,591,409
Xk+1 = Xk * -262,537,412,640,768,000 and X0 = 1
Mk can be optimized further -
Kk+1 = Kk + 12 and K0 = 6
Mk+1 = Mk * (K^3 - (K<<4)) / (k+1)^3 and M0 = 1

Note that 545140134 = 163 × 3344418 and,

and

This identity is similar to some of Ramanujan's formulas involving π,[2] and is an example of a Ramanujan–Sato series.

Example: Python Implementation

π can be computed to any precision using the above algorithm in any environment that supports Big Integer and configurable precision arithmetic (such as Python, Ruby, Perl, PHP, C#, Java, C++ and so many other languages, libraries, frameworks and runtimes). As an example, here is a Python implementation.

#!/usr/bin/env python -i

from decimal import getcontext, Decimal as Dec

def PI(maxK=70, prec=1008, disp=1007): # parameter defaults chosen to gain 1000+ digits within a few seconds
    getcontext().prec = prec
    k12_6,M,L,X,S = 6, 1, 13591409, 1, 13591409 # At k=0: 12k+6=6, (6k)!/(3k)!(k!)^3=1, 545140134k+13591409, (-640320^3)^k=1, 0+Dec(M*L)/X=L
    for k in xrange(1,maxK+1):
        M = (k12_6**3 - (k12_6<<4))*M / k**3; k12_6 += 12
        L += 545140134
        X *= -262537412640768000 # -640320**3;
        S += Dec(M*L) / X
    pi = 426880 * 10005**Dec(".5") / S
    pi = Dec(("%s"%pi)[:disp]) # drop few digits of precision for accuracy
    print "PI(maxK=%d iterations, getcontext().prec=%d, disp=%d digits) =\n%s" % (maxK, prec, disp, pi)
    return pi

Pi = PI()
print "\nFor greater precision and more digits (takes a few extra seconds) - Try"
print "Pi = PI(317,4501,4500)"
print "Pi = PI(353,5022,5020)"

See also

References

  1. Chudnovsky, David V.; Chudnovsky, Gregory V. (1989), "The Computation of Classical Constants", Proceedings of the National Academy of Sciences of the United States of America, 86 (21): 8178–8182, doi:10.1073/pnas.86.21.8178, ISSN 0027-8424, JSTOR 34831, PMC 298242Freely accessible, PMID 16594075
  2. 1 2 3 Baruah, Nayandeep Deka; Berndt, Bruce C.; Chan, Heng Huat (2009), "Ramanujan's series for 1/π: a survey", American Mathematical Monthly, 116 (7): 567–587, doi:10.4169/193009709X458555, JSTOR 40391165, MR 2549375
  3. Geeks slice pi to 5 trillion decimal places, Australian Broadcasting Corporation, August 6, 2010
  4. Yee, Alexander; Kondo, Shigeru (2011), 10 Trillion Digits of Pi: A Case Study of summing Hypergeometric Series to high precision on Multicore Systems, Technical Report, Computer Science Department, University of Illinois
  5. Aron, Jacob (March 14, 2012), "Constants clash on pi day", NewScientist
  6. Alexander J. Yee; Shigeru Kondo (28 December 2013). "12.1 Trillion Digits of Pi".
This article is issued from Wikipedia - version of the 11/17/2016. The text is available under the Creative Commons Attribution/Share Alike but additional terms may apply for the media files.