Wo kann man viele Ziffern von pi herunterladen? [geschlossen]

11

Wo könnte ich eine große Anzahl von pi-Stellen finden? Ich habe bereits 3,14 Milliarden mit PiFast berechnet (funktioniert gut unter Wein).

Langsame Download-Geschwindigkeiten sind mir egal.

bgw
quelle
2
Benötigen Sie es für einen auch nur aus der Ferne praktischen Zweck oder nur für ...? Ich kann den Punkt nicht sehen, also bin ich nur neugierig.
Turm
2
@ Idigas: Machst du nie Pi?
Nosredna
Bald kann ich den Algorithmus zur Berechnung von pi finden, ich werde etwas aufschreiben, um so viele zu berechnen, wie Sie wollen ...
RCIX
2
Versuchen Sie, eine neue Antwort auf Ihre Frage zu akzeptieren. Die ursprünglich akzeptierte Antwort hatte einen einzelnen Link, der nicht mehr existiert, daher wurde er gelöscht. Markieren Sie die Frage, wenn Sie Fragen an die Moderatoren haben.
Troggy

Antworten:

9

Ich weiß, dass Sie sagen, dass es Ihnen egal ist, aber ich vermute ernsthaft, dass Ihre CPU sie schneller berechnen kann , als Ihre Netzwerkkarte sie herunterladen kann.

Ausgehend von der letzten Ziffer und dem aktuellen Status des Rechners, mit dem sie generiert wurde, kann die nächste Ziffer in konstanter Zeit gefunden werden. Es wird nicht immer schwieriger, die nächste Primzahl zu finden.

Joel Coehoorn
quelle
Ja, aber es ist viel CPU-Zeit zum Widmen, und ich würde lieber etwas Bandbreite als die gesamte CPU-Zeit widmen.
Bgw
@ Joel: Kannst du übrigens einen Zeiger auf einen Algorithmus dafür zeigen? (Ja, ich weiß, das ist eher SO-Inhalt, aber da wir hier sind ...)
R. Martinho Fernandes
Die Mathematik ist mir ein Rätsel, aber lesen Sie weiter unten in Wikipedia und eine der Serien soll "14 Ziffern pro Begriff liefern".
Joel Coehoorn
Entschuldigung, falscher Link: numbers.computation.free.fr/Constants/PiProgram/algo.html , Es war in Frames
bgw
4

Neben Joels Kommentar ist SuperPi eines der beliebtesten Tools dafür. Es wird auch für Stresstests verwendet.

John T.
quelle
PiFast ist schneller.
Bgw
4

Unter Ubuntu können Sie sudo apt-get install pi

und dann:

$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

Es berechnet die willkürliche Genauigkeit anhand der Anzahl der zu berechnenden Stellen.

Janus Troelsen
quelle
0

Wenn Sie Python zur Berechnung verwenden möchten, finden Sie hier eine extrem schnelle Methode (mit Python und der gmpy2-Bibliothek):

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

Hier ist der Code mit einer kleinen Korrektur:

"""
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
quelle