Você precisa disso para algum propósito prático remotamente, ou apenas para ...? Não vejo o ponto, então estou apenas curioso.
Rook
2
@Idigas: Você nunca faz pi?
Nosredna
Logo é que eu posso encontrar o algoritmo para calcular o pi, eu vou escrever algo para calcular quantos você quiser ...
RCIX
2
Vá em frente e tente aceitar uma nova resposta para sua pergunta. A resposta original aceita tinha um único link que não existe mais, portanto foi excluída. Vá em frente e sinalize a pergunta se tiver alguma pergunta para os moderadores.
Troggy
Respostas:
9
Sei que você diz que não se importa, mas suspeito seriamente que seu processador possa calculá-los mais rapidamente do que sua placa de rede é capaz de baixá-los.
Dado o último dígito e o estado atual da calculadora usada para gerá-lo, o próximo dígito pode ser encontrado em tempo constante. Não fica progressivamente mais difícil como encontrar o próximo primo.
Sim, mas é muito tempo para se dedicar à CPU, e eu preferiria dedicar alguma largura de banda ao invés de todo esse tempo.
bgw
@ Joel: a propósito, você pode mostrar um ponteiro para um algoritmo para isso? (Sim, eu sei que é mais parecido com conteúdo SO, mas desde que estamos aqui ...)
"""
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 mathfrom gmpy2 import mpzfrom time import timeimport gmpy2def 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//24def 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=-Tabelse:# 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 combinePab=Pam*PmbQab=Qam*QmbTab=Qmb*Tam+Pam*TmbreturnPab,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 SystemExitfor 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 %100000if 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]))
Respostas:
Sei que você diz que não se importa, mas suspeito seriamente que seu processador possa calculá-los mais rapidamente do que sua placa de rede é capaz de baixá-los.
Dado o último dígito e o estado atual da calculadora usada para gerá-lo, o próximo dígito pode ser encontrado em tempo constante. Não fica progressivamente mais difícil como encontrar o próximo primo.
fonte
Além do comentário de Joel, o SuperPi é uma das ferramentas mais populares para isso. Também é usado para testes de estresse.
fonte
No Ubuntu, você pode
sudo apt-get install pi
e depois:
$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067
Ele calcula a precisão arbitrária, dado o número de dígitos a serem calculados.
fonte
Se você deseja usar o Python para calculá-lo, aqui está um método extremamente rápido (usando o Python e a biblioteca gmpy2):
http://www.craig-wood.com/nick/articles/pi-chudnovsky/
Aqui está o código com uma pequena correção:
fonte