#! /usr/local/bin/python3.6"""PI Computation by Binary Splitting Algorithm with GMP libarary"""importmathimportsysimporttracebackfromgmpy2importmpzfromgmpy2importisqrtfromtimeimporttimeclassPiChudnovsky:A=13591409B=545140134C=640320D=426880E=10005C3_24=C**3//24DIGITS_PER_TERM=math.log(53360**3)/math.log(10)#=> 14.181647462725476FILENAME="pi.txt"def__init__(self,digits):""" Initialization :param int digits: digits of PI computation """self.digits=digitsself.n=math.floor(self.digits/self.DIGITS_PER_TERM+1)self.prec=math.floor((self.digits+1)*math.log2(10))defcompute(self):""" Computation """try:tm_s=time()p,q,t=self.__bsa(0,self.n)one_sq=mpz(10)**(2*self.digits)sqrt_c=isqrt(self.E*one_sq)pi=(q*self.D*sqrt_c)//twithopen(self.FILENAME,"w")asf:f.write(str(pi))returntime()-tm_sexceptExceptionase:raisedef__bsa(self,a,b):""" PQT computation by BSA(= Binary Splitting Algorithm) :param int a: positive integer :param int b: positive integer :return list [int p_ab, int q_ab, int t_ab] """try:ifa+1==b:ifa==0:p_ab=q_ab=mpz(1)else:p_ab=mpz((6*a-5)*(2*a-1)*(6*a-1))q_ab=mpz(a*a*a*self.C3_24)t_ab=p_ab*(self.A+self.B*a)ifa&1:t_ab*=-1else:m=(a+b)//2p_am,q_am,t_am=self.__bsa(a,m)p_mb,q_mb,t_mb=self.__bsa(m,b)p_ab=p_am*p_mbq_ab=q_am*q_mbt_ab=q_mb*t_am+p_am*t_mbreturn[p_ab,q_ab,t_ab]exceptExceptionase:raiseif__name__=='__main__':try:iflen(sys.argv)<2:digits=100else:digits=int(sys.argv[1])print("#### PI COMPUTATION ( {} digits )".format(digits))obj=PiChudnovsky(digits)tm=obj.compute()print(" Output file:","pi.txt")print(" Elapsed time: {} seconds".format(tm))exceptExceptionase:traceback.print_exc()sys.exit(1)