Python instalacja gmpy2
-
jacek
05/01/2018
- Programowanie
- 1710 czytań 0 komentarzy
Zainstalujmy najpierw poniższe biblioteki:
apt-get install libgmp-dev
apt-get install libmpfr-dev
apt-get install libmpc-dev
A teraz:
apt-get install libmpfr-dev
apt-get install libmpc-dev
sudo -H pip install gmpy2
Da nam taki efekt:
Collecting gmpy2
Using cached gmpy2-2.0.8.zip
Building wheels for collected packages: gmpy2
Running setup.py bdist_wheel for gmpy2 ... done
Stored in directory: ......../.cache/pip/wheels/c5/1e/2e/b0ac7a5202cb535de28288f15712a417de15723bfebb0b6d68
Successfully built gmpy2
Installing collected packages: gmpy2
Successfully installed gmpy2-2.0.8
Możemy teraz wykonać np. obliczanie liczby Pi :
Using cached gmpy2-2.0.8.zip
Building wheels for collected packages: gmpy2
Running setup.py bdist_wheel for gmpy2 ... done
Stored in directory: ......../.cache/pip/wheels/c5/1e/2e/b0ac7a5202cb535de28288f15712a417de15723bfebb0b6d68
Successfully built gmpy2
Installing collected packages: gmpy2
Successfully installed gmpy2-2.0.8
""" 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 https://www.craig-wood.com/nick/articles/pi-chudnovsky/ """ import math from gmpy2 import mpz, isqrt from time import time 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 = 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) else: print("Last 5 digits %05d wrong should be %05d" % (last_five_digits, check_digits[digits]))
Dodaj komentarz
Zaloguj się, aby móc dodać komentarz.
Oceny
Tylko zarejestrowani użytkownicy mogą oceniać zawartość strony
Zaloguj się , żeby móc zagłosować.
Zaloguj się , żeby móc zagłosować.
Brak ocen. Może czas dodać swoją?