我想在PI的小数中找到一个特定的数字序列,并且首先计算PI到(很可能)无穷大。问题是我不知道如何使变量存储多个数字或如何使用新计算的数字,以便我可以将它与我的序列进行比较。
那么如何计算PI并仅将最后一个小数作为整数?
提前致谢。
答案 0 :(得分:3)
使用延迟评估可以非常优雅地解决这种问题,就像在Haskell中找到的那样。或者在Python中使用生成器,一次最多生成一个Pi,并检查正在搜索的目标值中的相应位置。
这两种方法的优点是您不必生成(可能)无限的数字序列,只需要生成所需数量,直到找到您要查找的内容。当然,如果特定序列真的没有出现在数字Pi中,算法将永远迭代,但至少执行程序的计算机不会耗尽内存。
或者:您可以使用BBP Formula或类似的算法,该算法允许在Pi中提取特定数字。
答案 1 :(得分:0)
您可以使用迭代算法计算Pi,例如Gauss–Legendre algorithm。
要实现它,您需要一个执行任意精度算术的库;一个这样的库是GMP。
显然,有人为您完成了大部分工作:http://gmplib.org/pi-with-gmp.html
答案 2 :(得分:0)
这是Jeremy Gibbons在Unbounded Spigot Algorithms for the Digits of Pi(2004年,第六章)中描述的流算法的Python实现。
def generate_digits_of_pi():
q = 1
r = 180
t = 60
i = 2
while True:
digit = ((i * 27 - 12) * q + r * 5) // (t * 5)
yield digit
u = i * 3
u = (u + 1) * 3 * (u + 2)
r = u * 10 * (q * (i * 5 - 2) + r - t * digit)
q *= 10 * i * (i * 2 - 1)
t *= u
i += 1
# Demo
iter = generate_digits_of_pi()
from time import sleep
import sys
for i in range(1000):
print (next(iter), end="")
sys.stdout.flush()
sleep(0.05)