Nơi để tải về rất nhiều chữ số của pi? [đóng cửa]


11

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.


2
Bạn có cần nó cho một số mục đích thực tế thậm chí từ xa, hoặc chỉ cho ...? Tôi không thể nhìn thấy điểm, vì vậy tôi chỉ tò mò.
Rook

2
@Idigas: Bạn chưa bao giờ làm pi?
Nosredna

Tôi sẽ sớm tìm ra thuật toán để tính pi, tôi sẽ viết một cái gì đó để tính bao nhiêu tùy thích ...
RCIX

2
Đi trước và cố gắng chấp nhận một câu trả lời mới cho câu hỏi của bạn. Câu trả lời được chấp nhận ban đầu có một liên kết duy nhất không còn tồn tại, vì vậy nó đã bị xóa. Đi trước và gắn cờ câu hỏi nếu bạn có bất kỳ câu hỏi nào cho người điều hành.
Troggy

Câu trả lời:


9

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.


Có, nhưng đó là rất nhiều thời gian cpu để dành, và tôi thà dành một số băng thông hơn là tất cả thời gian cpu đó.
bgw

@Joel: nhân tiện, bạn có thể hiển thị một con trỏ tới một thuật toán cho điều đó không? (Vâng, tôi biết đó giống nội dung SO hơn, nhưng vì chúng tôi ở đây ...)
R. Martinho Fernandes


Toán học vượt xa tôi, nhưng đọc xuống trong wikipedia và một trong những bộ được cho là "cung cấp 14 chữ số cho mỗi thuật ngữ".
Joel Coehoorn

Xin lỗi, liên kết sai: Numbers.computing.free.fr/Constants/PiProgram/algo.html , Nó nằm trong khung
bgw

4

Thêm vào nhận xét của Joel, SuperPi là một trong những công cụ phổ biến nhất cho việc này. Nó cũng được sử dụng để kiểm tra căng thẳng.


PiFast nhanh hơn.
BGW

3

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.


0

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]))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.