Pi Calculation in Rust (Also available in Python)
This is a Rust CLI tool for calculating Pi digits using various algorithms. It can compute to a million digits of Pi in less than 1 second (see below).
Supported algorithms are listed as follows:
Algorithm | Note |
---|---|
Leibniz | Slowest |
Bailey-Borwein-Plouffe (BBP) | |
Spigot Gosper | |
Newton 9th Order Convergence | Page 9 of the paper |
Borwein's Formula | |
Brent-Salamin | |
Gauss-Legendre | Only slightly different from Brent-Salamin. |
Machin-like Formula | Using arctan to calculate Pi. |
Chudnovsky | |
Chudnovsky Binary Splitting | World record-breaking algorithm. |
Chudnovsky Binary Splitting Parallelized | Fastest. |
Installation
Use in terminal
Use in Python
# Calculate Pi to 1000 digits using Chudnovsky algorithm
# 3.1415926535897932...
Usage
)
)
)
# Calculate Pi with Chudnovsky binary splitting algorithm to 1,000,000 digits.
# Show the runtime.
# Output the result to file
Recommended Reading
- Practical implementation of PI Algorithms: This paper provides a comprehensive overview of various algorithms for calculating Pi, including their implementation details and performance comparisons.
- Craig Wood's article on Chudnovsky algorithm: A detailed explanation of the Chudnovsky algorithm, including its mathematical background and implementation.
Performance
Test Environment
- OS: Ubuntu 20.04
- CPU: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
- RAM: 16GB
- Rust Version: 1.86.0
- Cargo Version: 1.86.0
Algorithm | 9 digits | 1K digits | 10K digits | 100K digits | 1M digits | 10M digits |
---|---|---|---|---|---|---|
Leibniz | 28.568 s | - | - | - | - | - |
Bailey-Borwein-Plouffe | - | 2.5 ms | 660.3 ms | 208.9 s | - | - |
Spigot Gosper | - | 3.1 ms | 867.6 ms | 250.217 s | - | - |
Newton | - | 5.2 ms | 43.7 ms | 1.421 s | 30.475 s | - |
Borwein Nonic | - | 3.6 ms | 159.6 ms | 5.123 s | - | - |
Brent-Salamin | - | - | 3.2 ms | 70.8 ms | 1.231 s | 21.364 s |
Gauss-Legendre | - | - | 3.5 ms | 70.6 ms | 1.229 s | 21.121 s |
Machin-like Formula | - | 1.9 ms | 14.9 ms | 465.4 ms | 8.673 s | - |
Chudnovsky | - | - | 5.1 ms | 369.2 ms | 38.22 s | - |
Chudnovsky Binary Splitting | - | - | - | 23.5 ms | 434.1 ms | 7.9 s |
Chudnovsky Binary Splitting Parallelized | - | - | - | 19.9 ms | 293.7 ms | 4.628 s |
Algorithm | 100M digits |
---|---|
Chudnovsky Binary Splitting | 109.58 s |
Chudnovsky Binary Splitting Parallelized | 48.739 s |
y-cruncher (single-thread) | 21.908 s |
y-cruncher (multi-thread) | 5.354 s |
Notes
- Parallel version of Chudnovsky Binary Splitting uses half of the CPU cores available on the system.
- Use
Integer
for variables when possible. This boosts performance significantly.
Reference
- https://www.hvks.com/Numerical/Downloads/HVE%20Practical%20implementation%20of%20PI%20Algorithms.pdf
- https://www.craig-wood.com/nick/articles/pi-chudnovsky
- https://github.com/Pencilcaseman/iron_pi
- https://yamakuramun.info/2024/05/26/686/
- https://qiita.com/yonaka15/items/992b3306106c150f36c6
- https://github.com/elkasztano/piday25
- https://www.numberworld.org/y-cruncher/