HasteBin0

Python Pi Generator

Jul 25th, 2017
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.86 KB | None | 0 0
  1. #!/usr/bin/python3
  2.  
  3. # Explained @ https://youtu.be/NaL_Cb42WyY
  4. class Pi :
  5.     _a: int
  6.     _b: int
  7.     _c: int
  8.    
  9.     __FIRST_C: int = 1
  10.    
  11.     def __gcd(self, a: int, b: int) -> int :
  12.         while b :
  13.             c = a % b
  14.             a = b
  15.             b = c
  16.         return a
  17.    
  18.     def __simplify(self) :
  19.         tmp = self.__gcd(self._a, self._b)
  20.         self._a //= tmp
  21.         self._b //= tmp
  22.    
  23.     def __init__(self) :
  24.         self._a = 0
  25.         self._b = 1
  26.         self._c = self.__FIRST_C
  27.    
  28.     def get_num(self) -> int :
  29.         return self._a
  30.    
  31.     def get_dom(self) -> int :
  32.         return self._b
  33.    
  34.     def get_steps(self) -> int :
  35.         return self._c
  36.    
  37.     def approximate(self) -> float :
  38.         return self._a * 4 / self._b
  39.    
  40.     def step_forward(self) :
  41.         num, dom, tmp = ((self._c % 2) * (-1 if (self._c + 1) % 4 == 0 else 1)), self._c, self._b
  42.         self._a *= dom
  43.         self._b *= dom
  44.         num *= tmp
  45.         self._a += num
  46.         self._c += 1
  47.         self.__simplify()
  48.    
  49.     def step_backward(self) :
  50.         if self._c == self.__FIRST_C : return
  51.         num, dom, tmp = (((self._c - 1) % 2) * (-1 if self._c % 4 == 0 else 1)), self._c - 1, self._b
  52.         self._a *= dom
  53.         self._b *= dom
  54.         num *= tmp
  55.         self._a -= num
  56.         self._c -= 1
  57.         self.__simplify()
  58.  
  59.  
  60. if __name__ == '__main__' :
  61.     def p_print(p0: Pi) :
  62.         print(f'Step {p0.get_steps()}, Numerator {p0.get_num()} Denominator {p0.get_dom()} = {p0.approximate()} / 4')
  63.    
  64.    
  65.     p: Pi = Pi()
  66.     print('Forward')
  67.     for _ in range(30) : p.step_forward()
  68.     p_print(p)
  69.     print('Backward')
  70.     for _ in range(10) : p.step_backward()
  71.     p_print(p)
  72.     print('Forward')
  73.     for _ in range(10) : p.step_forward()
  74.     p_print(p)
  75.     #
  76.     input('Done. ')
  77.     exit()
Advertisement
Add Comment
Please, Sign In to add comment