Skąd pobrać dużo cyfr pi? [Zamknięte]

11

Gdzie mogę znaleźć dużą liczbę cyfr pi? Obliczyłem już 3,14 miliarda przy użyciu PiFast (działa dobrze pod winem).

Nie dbam o wolne prędkości pobierania.

bgw
źródło
2
Czy potrzebujesz go do jakiegoś nawet praktycznego celu, czy tylko do ...? Nie widzę sensu, więc jestem po prostu ciekawy.
Rook
2
@Idigas: Czy ty nigdy nie robisz pi?
Nosredna
Wkrótce znajdę algorytm do obliczania liczby pi, napiszę coś, aby obliczyć tyle, ile chcesz ...
RCIX
2
Śmiało i spróbuj zaakceptować nową odpowiedź na swoje pytanie. Oryginalnie zaakceptowana odpowiedź zawierała pojedynczy link, który już nie istnieje, więc została usunięta. Śmiało napisz pytanie, jeśli masz jakieś pytania do moderatorów.
Troggy

Odpowiedzi:

9

Wiem, że mówisz, że cię to nie obchodzi, ale poważnie podejrzewam, że twoje procesor może je obliczyć szybciej niż twoja karta sieciowa jest w stanie je pobrać.

Biorąc pod uwagę ostatnią cyfrę i aktualny stan kalkulatora użytego do jej wygenerowania, kolejną cyfrę można znaleźć w stałym czasie. Nie staje się to coraz trudniejsze, jak w przypadku znalezienia następnej liczby pierwszej.

Joel Coehoorn
źródło
Tak, ale jest to dużo czasu na procesor i wolę poświęcić trochę przepustowości niż cały ten procesor.
bgw
@Joel: przy okazji, czy możesz pokazać wskaźnik do algorytmu? (Tak, wiem, że to bardziej treści SO, ale skoro tu jesteśmy ...)
R. Martinho Fernandes
Matematyka jest poza mną, ale czytam na Wikipedii, a jedna z serii mówi „dostarcza 14 cyfr na termin”.
Joel Coehoorn
Przepraszam, zły link: numbers.computation.free.fr/Constants/PiProgram/algo.html , To było w ramkach
bgw
4

Dodając do komentarza Joela, SuperPi jest jednym z najpopularniejszych narzędzi do tego. Służy również do testów warunków skrajnych.

John T.
źródło
PiFast jest szybszy.
bgw
4

Na Ubuntu możesz sudo apt-get install pi

i wtedy:

$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

Oblicza dowolną dokładność na podstawie liczby cyfr do obliczenia.

Janus Troelsen
źródło
0

Jeśli chcesz użyć Pythona do jego obliczenia, oto niezwykle szybka metoda (przy użyciu Pythona i biblioteki gmpy2):

http://www.craig-wood.com/nick/articles/pi-chudnovsky/

Oto kod z małą poprawką:

"""
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]))
Ron Reiter
źródło