Chudnovsky算法python不正确的小数

问题描述

我的目标是在Python中获得100.000或200.000正确的Pi小数。为此,我尝试使用Chudnovsky算法,但在此过程中遇到了一些问题。

首先,程序只给我29个字符,而不是我要测试的50个字符。我知道这是一个小问题,但是我不明白自己做错了什么。

第二,只有前14个小数是正确的。之后,我开始根据互联网上所有Pi的编号获取不正确的Pi小数。如何获得更正确的小数位数?

最后,我如何让我的代码在我拥有的所有4个线程上运行?我尝试使用Pool,但似乎无法正常工作。 (已通过Windows任务管理器进行了检查)

这是我的代码

from math import *
from decimal import Decimal,localcontext
from multiprocessing import Pool
import time
k = 0
s = 0
c = Decimal(426880*sqrt(10005))

if __name__ == '__main__':
    start = time.time()

    pi = 0

    with localcontext() as ctx:
        ctx.prec = 50

        with Pool(None) as pool:
            for k in range(0,500):
                m = Decimal((factorial(6 * k)) / (factorial(3 * k) * Decimal((factorial(k) ** 3))))
                l = Decimal((545140134 * k) + 13591409)
                x = Decimal((-262537412640768000) ** k)
                subPi = Decimal(((m*l)/x))
                s = s + subPi


    print(c*(s**-1))

    print(time.time() - start)

解决方法

除了评论中讨论的小细节和@ mark-dickinson提出的小细节之外,我认为我已经修复了多线程,但是我没有机会对其进行测试,请让我知道它是否正常工作

更新:第28位数字后的问题是由于decimal context更改之前分配了sq和c所致。更改context精度后重新分配其值

from math import *
import decimal
from decimal import Decimal,localcontext
from multiprocessing import Pool
import time
k = 0
s = 0
sq = Decimal(10005).sqrt() #useless here
c = Decimal(426880*sq) #useless here

def calculate():
    global s,k
    for k in range(0,500):
        m = Decimal((factorial(6 * k)) / (factorial(3 * k) * Decimal((factorial(k) ** 3))))
        l = Decimal((545140134 * k) + 13591409)
        x = Decimal((-262537412640768000) ** k)
        subPi = Decimal((m*l)/x)
        s = s + subPi
        
    print(c*(s**-1))

if __name__ == '__main__':
    start = time.time()

    pi = 0

    decimal.getcontext().prec = 100 #change the precision to increse the result digits

    sq = Decimal(10005).sqrt()
    c = Decimal(426880*sq)

    pool = Pool()
    result = pool.apply_async(calculate)
    result.get()

    print(time.time() - start)