![哪里可以下载很多位数的圆周率?](https://linux22.com/image/1209372/%E5%93%AA%E9%87%8C%E5%8F%AF%E4%BB%A5%E4%B8%8B%E8%BD%BD%E5%BE%88%E5%A4%9A%E4%BD%8D%E6%95%B0%E7%9A%84%E5%9C%86%E5%91%A8%E7%8E%87%EF%BC%9F%20.png)
在哪里可以找到大量的圆周率数字?我已经使用 PiFast 计算出了 31.4 亿(在 wine 下运行良好)。
我并不关心缓慢的下载速度。
答案1
我知道你说你不在乎,但我真的怀疑你的 CPU 可以计算它们快点您的网卡无法下载它们。
给定最后一位数字以及生成该数字的计算器的当前状态,可以在常数时间内找到下一位数字。它不会像寻找下一个素数那样变得越来越难。
答案2
补充一下乔尔的评论,超级派是最受欢迎的工具之一。它还用于压力测试。
答案3
在 Ubuntu 上,你可以sudo apt-get install pi
进而:
$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067
它根据要计算的位数来计算任意精度。
答案4
如果您想使用 Python 来计算它,这里有一个非常快的方法(使用 Python 和 gmpy2 库):
http://www.craig-wood.com/nick/articles/pi-chudnovsky/
以下是经过小幅修正的代码:
"""
Python3 program to calculate Pi using python long integers, binary
splitting and the Chudnovsky algorithm
See: http://www.craig-wood.com/nick/articles/pi-chudnovsky/ for more
info
Nick Craig-Wood <[email protected]>
"""
import math
from gmpy2 import mpz
from time import time
import gmpy2
def pi_chudnovsky_bs(digits):
"""
Compute int(pi * 10**digits)
This is done using Chudnovsky's series with binary splitting
"""
C = 640320
C3_OVER_24 = C**3 // 24
def bs(a, b):
"""
Computes the terms for binary splitting the Chudnovsky infinite series
a(a) = +/- (13591409 + 545140134*a)
p(a) = (6*a-5)*(2*a-1)*(6*a-1)
b(a) = 1
q(a) = a*a*a*C3_OVER_24
returns P(a,b), Q(a,b) and T(a,b)
"""
if b - a == 1:
# Directly compute P(a,a+1), Q(a,a+1) and T(a,a+1)
if a == 0:
Pab = Qab = mpz(1)
else:
Pab = mpz((6*a-5)*(2*a-1)*(6*a-1))
Qab = mpz(a*a*a*C3_OVER_24)
Tab = Pab * (13591409 + 545140134*a) # a(a) * p(a)
if a & 1:
Tab = -Tab
else:
# Recursively compute P(a,b), Q(a,b) and T(a,b)
# m is the midpoint of a and b
m = (a + b) // 2
# Recursively calculate P(a,m), Q(a,m) and T(a,m)
Pam, Qam, Tam = bs(a, m)
# Recursively calculate P(m,b), Q(m,b) and T(m,b)
Pmb, Qmb, Tmb = bs(m, b)
# Now combine
Pab = Pam * Pmb
Qab = Qam * Qmb
Tab = Qmb * Tam + Pam * Tmb
return Pab, Qab, Tab
# how many terms to compute
DIGITS_PER_TERM = math.log10(C3_OVER_24/6/2/6)
N = int(digits/DIGITS_PER_TERM + 1)
# Calclate P(0,N) and Q(0,N)
P, Q, T = bs(0, N)
one_squared = mpz(10)**(2*digits)
#sqrtC = (10005*one_squared).sqrt()
sqrtC = gmpy2.isqrt(10005*one_squared)
return (Q*426880*sqrtC) // T
# The last 5 digits or pi for various numbers of digits
check_digits = {
100 : 70679,
1000 : 1989,
10000 : 75678,
100000 : 24646,
1000000 : 58151,
10000000 : 55897,
}
if __name__ == "__main__":
digits = 100
pi = pi_chudnovsky_bs(digits)
print(pi)
#raise SystemExit
for log10_digits in range(1,9):
digits = 10**log10_digits
start =time()
pi = pi_chudnovsky_bs(digits)
print("chudnovsky_gmpy_mpz_bs: digits",digits,"time",time()-start)
if digits in check_digits:
last_five_digits = pi % 100000
if check_digits[digits] == last_five_digits:
print("Last 5 digits %05d OK" % last_five_digits)
open("%s_pi.txt" % log10_digits, "w").write(str(pi))
else:
print("Last 5 digits %05d wrong should be %05d" % (last_five_digits, check_digits[digits]))