Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- # Explained @ https://youtu.be/NaL_Cb42WyY
- class Pi :
- _a: int
- _b: int
- _c: int
- __FIRST_C: int = 1
- def __gcd(self, a: int, b: int) -> int :
- while b :
- c = a % b
- a = b
- b = c
- return a
- def __simplify(self) :
- tmp = self.__gcd(self._a, self._b)
- self._a //= tmp
- self._b //= tmp
- def __init__(self) :
- self._a = 0
- self._b = 1
- self._c = self.__FIRST_C
- def get_num(self) -> int :
- return self._a
- def get_dom(self) -> int :
- return self._b
- def get_steps(self) -> int :
- return self._c
- def approximate(self) -> float :
- return self._a * 4 / self._b
- def step_forward(self) :
- num, dom, tmp = ((self._c % 2) * (-1 if (self._c + 1) % 4 == 0 else 1)), self._c, self._b
- self._a *= dom
- self._b *= dom
- num *= tmp
- self._a += num
- self._c += 1
- self.__simplify()
- def step_backward(self) :
- if self._c == self.__FIRST_C : return
- num, dom, tmp = (((self._c - 1) % 2) * (-1 if self._c % 4 == 0 else 1)), self._c - 1, self._b
- self._a *= dom
- self._b *= dom
- num *= tmp
- self._a -= num
- self._c -= 1
- self.__simplify()
- if __name__ == '__main__' :
- def p_print(p0: Pi) :
- print(f'Step {p0.get_steps()}, Numerator {p0.get_num()} Denominator {p0.get_dom()} = {p0.approximate()} / 4')
- p: Pi = Pi()
- print('Forward')
- for _ in range(30) : p.step_forward()
- p_print(p)
- print('Backward')
- for _ in range(10) : p.step_backward()
- p_print(p)
- print('Forward')
- for _ in range(10) : p.step_forward()
- p_print(p)
- #
- input('Done. ')
- exit()
Advertisement
Add Comment
Please, Sign In to add comment