如何在PI的小数内找到特定的序列?

时间:2012-10-18 19:39:21

标签: algorithm math pi

我想在PI的小数中找到一个特定的数字序列,并且首先计算PI到(很可能)无穷大。问题是我不知道如何使变量存储多个数字或如何使用新计算的数字,以便我可以将它与我的序列进行比较。

那么如何计算PI并仅将最后一个小数作为整数?

提前致谢。

3 个答案:

答案 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)