# Euler accelerator, from SICP

from __future__ import generators

def sqr(x):
	return x*x

def firstn(g, n):
	for i in range(n):
		yield g.next()

def pi_series():
	sum = 0
	i = 1.0; j = 1
	while(1):
		sum = sum + j/i
		yield 4*sum
		i = i + 2; j = j * -1

def euler_accelerator(g):
	s0 = g.next() # Sn-1
	s1 = g.next() # Sn
	s2 = g.next() # Sn+1
	while 1:
		yield s2 - (sqr(s2 - s1))/(s0 - 2*s1 + s2)
		s0, s1, s2 = s1, s2, g.next()

if __name__ == '__main__':
	print list(firstn(euler_accelerator(pi_series()), 8))
	
