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