Tôi có thể tìm thấy một số lượng lớn chữ số của pi ở đâu? Tôi đã tính 3,14 tỷ đồng bằng cách sử dụng PiFast (hoạt động tốt dưới rượu).
Tôi không quan tâm về tốc độ tải xuống chậm.
Tôi có thể tìm thấy một số lượng lớn chữ số của pi ở đâu? Tôi đã tính 3,14 tỷ đồng bằng cách sử dụng PiFast (hoạt động tốt dưới rượu).
Tôi không quan tâm về tốc độ tải xuống chậm.
Câu trả lời:
Tôi biết bạn nói rằng bạn không quan tâm, nhưng tôi thực sự nghi ngờ rằng CPU của bạn có thể tính toán chúng nhanh hơn so với thẻ mạng của bạn có khả năng tải xuống chúng.
Cho chữ số cuối cùng và trạng thái hiện tại của máy tính được sử dụng để tạo ra nó, chữ số tiếp theo có thể được tìm thấy trong thời gian không đổi. Nó không trở nên ngày càng khó hơn như tìm kiếm nguyên tố tiếp theo.
Trên Ubuntu, bạn có thể sudo apt-get install pi
và sau đó:
$ pi 100
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067
Nó tính toán độ chính xác tùy ý cho số chữ số để tính toán.
Nếu bạn muốn sử dụng Python để tính toán, đây là một phương pháp cực kỳ nhanh (sử dụng Python và thư viện gmpy2):
http://www.craig-wood.com/nick/articles/pi-chudnovsky/
Đây là mã với một sửa chữa nhỏ:
"""
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 <nick@craig-wood.com>
"""
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]))