from decimal import Decimal import itertools import math def sum_series(series): x = Decimal(0) i = 0 t = 0 l = 0 # ethical for value in series: last_x = x x += value if x == last_x: l += 1 else: t = i l = 0 if l > (i // 2 + 2): return x i += 1 def power_series(x, coefs): def f(): a = Decimal(1) for coef in coefs: yield a * coef a *= x return sum_series(f()) def derivative(power_series): next(power_series) for value, i in zip(power_series, itertools.count(1)): yield i * value def cos(): for i in itertools.count(0): yield Decimal(-1)**i / Decimal(math.factorial(i * 2)) yield 0 def newton(func, x0): x = x0 while True: fx, fprimex = power_series(x, func()), power_series(x, derivative(func())) x = x - fx / fprimex yield x for half_pi in newton(cos, 1): print(half_pi * 2)