Czy potrzebujesz go do jakiegoś nawet praktycznego celu, czy tylko do ...? Nie widzę sensu, więc jestem po prostu ciekawy.
Rook
2
@Idigas: Czy ty nigdy nie robisz pi?
Nosredna
Wkrótce znajdę algorytm do obliczania liczby pi, napiszę coś, aby obliczyć tyle, ile chcesz ...
RCIX
2
Śmiało i spróbuj zaakceptować nową odpowiedź na swoje pytanie. Oryginalnie zaakceptowana odpowiedź zawierała pojedynczy link, który już nie istnieje, więc została usunięta. Śmiało napisz pytanie, jeśli masz jakieś pytania do moderatorów.
Troggy
Odpowiedzi:
9
Wiem, że mówisz, że cię to nie obchodzi, ale poważnie podejrzewam, że twoje procesor może je obliczyć szybciej niż twoja karta sieciowa jest w stanie je pobrać.
Biorąc pod uwagę ostatnią cyfrę i aktualny stan kalkulatora użytego do jej wygenerowania, kolejną cyfrę można znaleźć w stałym czasie. Nie staje się to coraz trudniejsze, jak w przypadku znalezienia następnej liczby pierwszej.
"""
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 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//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]))
Odpowiedzi:
Wiem, że mówisz, że cię to nie obchodzi, ale poważnie podejrzewam, że twoje procesor może je obliczyć szybciej niż twoja karta sieciowa jest w stanie je pobrać.
Biorąc pod uwagę ostatnią cyfrę i aktualny stan kalkulatora użytego do jej wygenerowania, kolejną cyfrę można znaleźć w stałym czasie. Nie staje się to coraz trudniejsze, jak w przypadku znalezienia następnej liczby pierwszej.
źródło
Dodając do komentarza Joela, SuperPi jest jednym z najpopularniejszych narzędzi do tego. Służy również do testów warunków skrajnych.
źródło
Na Ubuntu możesz
sudo apt-get install pi
i wtedy:
$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067
Oblicza dowolną dokładność na podstawie liczby cyfr do obliczenia.
źródło
Jeśli chcesz użyć Pythona do jego obliczenia, oto niezwykle szybka metoda (przy użyciu Pythona i biblioteki gmpy2):
http://www.craig-wood.com/nick/articles/pi-chudnovsky/
Oto kod z małą poprawką:
źródło