¿Dónde descargar muchos dígitos de pi? [cerrado]


11

¿Dónde puedo encontrar una gran cantidad de dígitos de pi? Ya he calculado 3.14 mil millones usando PiFast (funciona bien con vino).

No me importan las velocidades de descarga lentas.


2
¿Lo necesita para algún propósito remotamente práctico, o simplemente para ...? No puedo ver el punto, así que solo tengo curiosidad.
Torre

2
@Idigas: ¿Nunca haces pi?
Nosredna

Pronto podré encontrar el algoritmo para calcular pi, escribiré algo para calcular tantos como quieras ...
RCIX

2
Siga adelante e intente aceptar una nueva respuesta a su pregunta. La respuesta original aceptada tenía un enlace único que ya no existe, por lo que se ha eliminado. Siga adelante y marque la pregunta si tiene alguna pregunta para los moderadores.
Troggy

Respuestas:


9

Sé que dices que no te importa, pero sospecho seriamente que tu CPU puede calcularlos más rápido de lo que tu tarjeta de red es capaz de descargarlos.

Dado el último dígito y el estado actual de la calculadora utilizada para generarlo, el siguiente dígito se puede encontrar en tiempo constante. No se vuelve progresivamente más difícil como lo es encontrar el próximo prime.


Sí, pero es mucho tiempo de CPU para dedicar, y prefiero dedicar algo de ancho de banda en lugar de todo ese tiempo de CPU.
bgw

@ Joel: por cierto, ¿puedes mostrar un puntero a un algoritmo para eso? (Sí, sé que se parece más al contenido SO, pero como estamos aquí ...)
R. Martinho Fernandes


La matemática está más allá de mí, pero se lee mucho en Wikipedia y se dice que una de las series "entrega 14 dígitos por término".
Joel Coehoorn el

Lo sentimos, enlace incorrecto: numbers.computation.free.fr/Constants/PiProgram/algo.html , estaba en marcos
bgw

4

Agregando al comentario de Joel, SuperPi es una de las herramientas más populares para esto. También se usa para pruebas de estrés.


PiFast es más rápido.
bgw

4

En Ubuntu, puedes sudo apt-get install pi

y entonces:

$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

Calcula la precisión arbitraria dada la cantidad de dígitos a calcular.


0

Si desea usar Python para calcularlo, aquí hay un método extremadamente rápido (usando Python y la biblioteca gmpy2):

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

Aquí está el código con una pequeña solución:

"""
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]))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.