Dove scaricare molte cifre di pi? [chiuso]


11

Dove posso trovare una grande quantità di cifre di pi? Ho già calcolato 3,14 miliardi usando PiFast (funziona bene con il vino).

Non mi interessa la bassa velocità di download.


2
Ne hai bisogno per qualche scopo pratico anche a distanza, o solo per ...? Non riesco a vedere il punto, quindi sono solo curioso.
Rook,

2
@Idigas: non fai mai pi?
Nosredna,

Presto
riuscirò a

2
Vai avanti e prova ad accettare una nuova risposta alla tua domanda. La risposta originale accettata aveva un singolo link che non esiste più, quindi è stata eliminata. Vai avanti e contrassegna la domanda se hai domande per i moderatori.
Troggy,

Risposte:


9

So che dici che non ti interessa, ma sospetto seriamente che la tua CPU possa calcolarli più velocemente di quanto la tua scheda di rete sia in grado di scaricarli.

Data l'ultima cifra e lo stato corrente della calcolatrice utilizzata per generarla, la cifra successiva può essere trovata in tempo costante. Non diventa progressivamente più difficile come trovare il prossimo primo.


Sì, ma è molto tempo da dedicare alla CPU, e preferirei dedicare un po 'di larghezza di banda piuttosto che tutto quel tempo alla CPU.
bgw,

@Joel: a proposito, puoi mostrare un puntatore a un algoritmo per quello? (Sì, lo so che è più simile al contenuto SO, ma dato che siamo qui ...)
R. Martinho Fernandes,


La matematica è al di là di me, ma letta in fondo a Wikipedia e si dice che una delle serie "recapiti 14 cifre per termine".
Joel Coehoorn,


4

Aggiungendo al commento di Joel, SuperPi è uno degli strumenti più popolari per questo. Viene anche utilizzato per le prove di stress.


PiFast è più veloce.
bgw,

3

Su Ubuntu puoi sudo apt-get install pi

e poi:

$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

Calcola la precisione arbitraria dato il numero di cifre da calcolare.


0

Se vuoi usare Python per calcolarlo, ecco un metodo estremamente veloce (usando Python e la libreria gmpy2):

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

Ecco il codice con una piccola correzione:

"""
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]))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.