在不损失 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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章