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.
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.
Réponses:
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.
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.
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]))