Python快速计算高精度圆周率

本文介绍了使用Python结合gmpy2库,通过Chudnovsky算法快速并高精度地计算圆周率的方法。该算法基于二分算法减少计算量,并在6分钟内完成了3200万位的圆周率计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python + gmpy2 + Chudnovsky快速计算超高精度圆周率


写在之前


先上链接,以示尊重
https://www.mk-mode.com/octopress/2015/05/06/cpp-pi-computation-by-chudnovsky-bsa-with-gmp/
这是日本的一位大牛的博客。本片文章所有算法和灵感均来自这篇博客。版权归这个作者所有。

Chudnovsky计算圆周率


Chudnovsky(丘德诺夫斯基)方法是计算PI非常快速并且精度很高的方法。本方法基于
BSA(二分算法)用于减少串联扩展的计算量(计算时间)
算法pdf

代码


################################################################
# Computing pi by Binary Splitting Algorithm with GMP library. #
################################################################


# 经测试 计算三千两百万为PI所需时间如下
# CPU                                         计算时间      文件流写入时间
# Intel(R) Core(TM) i7-4720HQ CPU @ 3.40GHz   363.33s      30.08s
# Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz     343.81s      27.82s
# Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz    278.65s      8.54s
import gmpy2
import numpy as np
import time

# 在gmpy2中,mpz高精度整形, mpfr为高精度浮点


# 首先封装PQT类,定义P、Q、T为mpz类型数据
class PQT:
    def __init__(self):
        self.P = gmpy2.mpz(0)
        self.Q = gmpy2.mpz(0)
        self.T = gmpy2.mpz(0)


# 定义Chudnovsky类
class Chudnovsky:
    # 初始化变量
    def __init__(self, digits):
        self.DIGITS = digits            # 要计算的位数
        self.A = gmpy2.mpz(13591409)    # 常数A,mpz
        self.B = gmpy2.mpz(545140134
### 使用Python计算圆周率 可以通过多种方法来实现 Python 中的圆周率 π 的计算。以下是基于 Chudnovsky 算法以及 Monte Carlo 方法和级数展开的方法。 #### 基于 Chudnovsky 算法 Chudnovsky 算法是一种高效的高精度圆周率计算方法,其核心公式如下: \[ \frac{1}{\pi} = 12 \sum_{k=0}^\infty \frac{(-1)^k (6k)! (13591409 + 545140134k)}{(3k)!(k!)^3 640320^{3k + 3/2}} \] 下面是一个使用 `decimal` 模块实现该算法的例子[^1]: ```python from decimal import Decimal, getcontext def compute_pi(chudnovsky_iterations): getcontext().prec = chudnovsky_iterations * 14 # 设置精度 C = 426880 * Decimal(10005).sqrt() M = 1 L = 13591409 X = 1 K = 6 S = L for i in range(1, chudnovsky_iterations): M = (K ** 3 - 16 * K) * M // i ** 3 L += 545140134 X *= -262537412640768000 S += Decimal(M * L) / X pi = C / S return str(pi)[:chudnovsky_iterations] print(compute_pi(10)) ``` 此代码利用了大整数运算,并通过调整迭代次数控制精度。 --- #### 基于 Monte Carlo 方法 Monte Carlo 方法是一种统计学上的近似方法,它通过随机采样估算圆周率。具体原理是在单位正方形内均匀分布点,并判断这些点是否落在四分之一圆内部[^3]。 下面是其实现代码[^4]: ```python import random from time import perf_counter DARTS = 1000000 # 投掷次数 hits = 0 start = perf_counter() for _ in range(DARTS): x, y = random.random(), random.random() distance = pow(x**2 + y**2, 0.5) if distance <= 1.0: hits += 1 pi_estimate = 4 * (hits / DARTS) end_time = perf_counter() - start print(f"圆周率值是: {pi_estimate}") print(f"运行时间是: {end_time:.5f}s") ``` 这种方法简单易懂,但收敛速度较慢,适合用于教学演示而非高精度需求场景。 --- #### 基于无穷级数 一种经典的级数展开方式是莱布尼茨级数,尽管它的收敛速度很慢,但对于理解基本概念很有帮助。 ```python def calculate_pi_with_series(iterations): pi_approximation = 0 for k in range(iterations): term = (-1)**k / (2*k + 1) pi_approximation += term return 4 * pi_approximation print(calculate_pi_with_series(1000000)) ``` 另一种更快速的方式是基于 Ramanujan 或 Machin 类型的公式,它们能够显著提高效率。 --- ### 总结 上述三种方法各有优劣:Chudnovsky 算法适用于极高精度的需求;Monte Carlo 方法直观但低效;而级数展开则适合作为入门学习工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值