Chudnovsky algorithm
The Chudnovsky algorithm is a fast method for calculating the digits of π, based on Ramanujan's π formulae. It was published by the Chudnovsky brothers in 1988.[1]
It was used in the world record calculations of 2.7 trillion digits of π in December 2009,[2] 10 trillion digits in October 2011,[3][4] 22.4 trillion digits in November 2016,[5] 31.4 trillion digits in September 2018–January 2019,[6] 50 trillion digits on January 29, 2020,[7] 62.8 trillion digits on August 14, 2021,[8] and 100 trillion digits on March 21, 2022.[9]
Algorithm
The algorithm is based on the negated Heegner number , the j-function , and on the following rapidly convergent generalized hypergeometric series:[2]A detailed proof of this formula can be found here: [10]
This identity is similar to some of Ramanujan's formulas involving π,[2] and is an example of a Ramanujan–Sato series.
The time complexity of the algorithm is .[11]
Optimizations
The optimization technique used for the world record computations is called binary splitting.[12]
Binary splitting
A factor of can be taken out of the sum and simplified to
Let , and substitute that into the sum.
can be simplified to , so
from the original definition of , so
This definition of isn't defined for , so compute the first term of the sum and use the new definition of
Let and , so
Let and
can never be computed, so instead compute and as approaches , the approximation will get better.
From the original definition of ,
Recursively computing the functions
Consider a value such that
Base case for recursion
Consider
Python code
import decimal
def binary_split(a, b):
if b == a + 1:
Pab = -(6*a - 5)*(2*a - 1)*(6*a - 1)
Qab = 10939058860032000 * a**3
Rab = Pab * (545140134*a + 13591409)
else:
m = (a + b) // 2
Pam, Qam, Ram = binary_split(a, m)
Pmb, Qmb, Rmb = binary_split(m, b)
Pab = Pam * Pmb
Qab = Qam * Qmb
Rab = Qmb * Ram + Pam * Rmb
return Pab, Qab, Rab
def chudnovsky(n):
P1n, Q1n, R1n = binary_split(1, n)
return (426880 * decimal.Decimal(10005).sqrt() * Q1n) / (13591409*Q1n + R1n)
print(chudnovsky(2)) # 3.141592653589793238462643384
decimal.getcontext().prec = 100
for n in range(2,10):
print(f"{n=} {chudnovsky(n)}") # 3.14159265358979323846264338...
Notes
See also
References
- ↑ Chudnovsky, David; Chudnovsky, Gregory (1988), Approximation and complex multiplication according to Ramanujan, Ramanujan revisited: proceedings of the centenary conference
- ↑ 2.0 2.1 2.2 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
- ↑ 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
- ↑ Aron, Jacob (March 14, 2012), "Constants clash on pi day", New Scientist, https://www.newscientist.com/article/dn21589-constants-clash-on-pi-day.html
- ↑ "22.4 Trillion Digits of Pi". http://www.numberworld.org/y-cruncher/records/2016_11_11_pi.txt.
- ↑ "Google Cloud Topples the Pi Record". http://www.numberworld.org/blogs/2019_3_14_pi_record/.
- ↑ "The Pi Record Returns to the Personal Computer". http://www.numberworld.org/y-cruncher/news/2020.html#2020_1_29.
- ↑ "Pi-Challenge - Weltrekordversuch der FH Graubünden - FH Graubünden". https://www.fhgr.ch/fachgebiete/angewandte-zukunftstechnologien/davis-zentrum/pi-challenge/#c15513.
- ↑ "Calculating 100 trillion digits of pi on Google Cloud". https://cloud.google.com/blog/products/compute/calculating-100-trillion-digits-of-pi-on-google-cloud.
- ↑ Milla, Lorenz (2018), A detailed proof of the Chudnovsky formula with means of basic complex analysis
- ↑ "y-cruncher - Formulas". http://www.numberworld.org/y-cruncher/internals/formulas.html. Retrieved 2018-02-25.
- ↑ Rayton, Joshua (Sep 2023) (in en), How is π calculated to trillions of digits?, YouTube, https://www.youtube.com/watch?v=jAucKnCwxio
