在不损失 C++ 或 Python 性能的情况下计算 pi [关闭]

Posted

技术标签:

【中文标题】在不损失 C++ 或 Python 性能的情况下计算 pi [关闭]【英文标题】:Calculate pi without losing performance in C++ or Python [closed] 【发布时间】:2016-06-02 21:19:48 【问题描述】:

我正在寻找一种算法来计算 pi 并继续计算,而不必重新计算所有内容。 我正在尝试在 pi 中查找一个数字。我在 Python 中做了一个算法,它正是这样做的,但它会随着时间的推移而变慢(显然):

def make_pi(lenght):
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    for j in range(lenght):
        if 4 * q + r - t < m * t:
            yield m
            q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
        else:
            q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2

piArray = []

for i in make_pi(50):
    piArray.append(str(i))

piArray = piArray[:1] + ['.'] + piArray[1:]
piString = "".join(piArray)

lookingFor="9833673362"
found=False

current=10

while found==False:
    print(str(current))
    for i in make_pi(current):
        piArray.append(str(i))

    piArray = piArray[:1] + ['.'] + piArray[1:]
    piString = "".join(piArray)
    if piString[-len(lookingFor):] == lookingFor:
        found=True
        print("Found! Tries: " + str(current - 10))
    current+=1

我需要在 Python 甚至 C++ 中使用更快的算法。 (更快的意思是它不应该放慢速度)

【问题讨论】:

该代码有点丑陋且难以阅读。而且您没有提供足够的信息(例如,您正在观察哪种性能下降。重要的是要判断这种下降是由于您的代码还是由于算法复杂性)嗯...@ 987654321@ 看起来就像它很容易实现并且随着 O(n*log n) 的增长而增长。这应该是你能做的最好的渐进式了。 抱歉,代码很丑,我只是在测试 + 我没有计算 PI 的经验,所以我不能告诉你我到底需要什么。感谢您的回复! 这里是Gauss-Legendre Algorithm to compute the digits of π in Python。从 Python 3.3 开始,decimal 模块可以使用 C 加速。 【参考方案1】:

在这种情况下,我将使用 spigot 算法,它允许在有限的内存量下计算 pi 的第 n 位,并且不会随着数字的索引而增加;特别是Bailey–Borwein–Plouffe 变体。

如果我正确理解你的问题,这个链接很可能是你正在寻找的:

公式可以直接计算π的任意给定数字的值,而不需要计算前面的数字

【讨论】:

以上是关于在不损失 C++ 或 Python 性能的情况下计算 pi [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

python如何在不损失质量的情况下调整(缩小)图像的大小

golang基础知识

如何在不复制对象的情况下向 Python 公开返回 C++ 对象的函数?

在不损失质量的情况下调整图像大小

在不损失任何质量的情况下调整图像大小[关闭]

如何在不损失精度的情况下解码 NSDecimalNumber?