Où télécharger un grand nombre de chiffres de pi? [fermé]


11

Où pourrais-je trouver une grande quantité de chiffres de pi? J'ai déjà calculé 3,14 milliards en utilisant PiFast (fonctionne bien sous wine).

Je me fiche des vitesses de téléchargement lentes.


2
En avez-vous besoin à des fins pratiques même à distance, ou simplement pour ...? Je ne vois pas le point, donc je suis juste curieux.
Tour

2
@Idigas: Ne faites-vous jamais de pi?
Nosredna

Bientôt, je peux trouver l'algorithme de calcul de pi, je vais écrire quelque chose pour en calculer autant que vous le souhaitez ...
RCIX

2
Allez-y et essayez d'accepter une nouvelle réponse à votre question. La réponse acceptée d'origine avait un seul lien qui n'existe plus, elle a donc été supprimée. Allez-y et signalez la question si vous avez des questions pour les modérateurs.
Troggy

Réponses:


9

Je sais que vous dites que vous ne vous souciez pas, mais je soupçonne sérieusement que votre processeur peut les calculer plus rapidement que votre carte réseau n'est capable de les télécharger.

Étant donné le dernier chiffre et l'état actuel de la calculatrice utilisée pour le générer, le chiffre suivant peut être trouvé en temps constant. Cela ne devient pas de plus en plus difficile comme trouver le prochain prime.


Oui, mais il faut beaucoup de temps processeur à consacrer, et je préfère consacrer une bande passante plutôt que tout ce temps processeur.
bgw

@ Joel: au fait, pouvez-vous montrer un pointeur vers un algorithme pour cela? (Ouais, je sais que c'est plus comme du contenu SO, mais puisque nous sommes ici ...)
R. Martinho Fernandes


Les mathématiques me dépassent, mais lisez bien dans wikipedia et l'une des séries est censée "fournir 14 chiffres par terme".
Joel Coehoorn

Désolé, mauvais lien: numbers.computation.free.fr/Constants/PiProgram/algo.html , c'était dans des cadres
bgw

4

Pour ajouter au commentaire de Joel, SuperPi est l'un des outils les plus populaires pour cela. Il est également utilisé pour les tests de résistance.


PiFast est plus rapide.
bgw

4

Sur Ubuntu, vous pouvez sudo apt-get install pi

puis:

$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

Il calcule une précision arbitraire compte tenu du nombre de chiffres à calculer.


0

Si vous souhaitez utiliser Python pour le calculer, voici une méthode extrêmement rapide (en utilisant Python et la bibliothèque gmpy2):

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

Voici le code avec une petite correction:

"""
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]))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.