RosettaCodeData/Task/Formal-power-series/Python/formal-power-series-2.py

59 lines
1.5 KiB
Python

from itertools import islice, tee
from fractions import Fraction
try:
from itertools import izip as zip # for 2.6
except:
pass
def pluspower(*powergenerators):
for elements in zip(*powergenerators):
yield sum(elements)
def minuspower(*powergenerators):
for elements in zip(*powergenerators):
yield elements[0] - sum(elements[1:])
def mulpower(fgen,ggen):
'From: http://en.wikipedia.org/wiki/Power_series#Multiplication_and_division'
a,b = [],[]
for f,g in zip(fgen, ggen):
a.append(f)
b.append(g)
yield sum(f*g for f,g in zip(a, reversed(b)))
def constpower(n):
yield n
while True:
yield 0
def diffpower(gen):
'differentiatiate power series'
next(gen)
for n, an in enumerate(gen, start=1):
yield an*n
def intgpower(gen):
'integrate power series with bounds from 0 to x'
yield 0
for n, an in enumerate(gen, start=1):
yield an * Fraction(1,n)
def sine_cosine_series():
def deferred_sin():
for i in sinx_temp:
yield i
def deferred_cos():
for i in cosx_temp:
yield i
sinx_result, sinx_copy1 = tee(deferred_sin(), 2)
cosx_result, cosx_copy1 = tee(deferred_cos(), 2)
sinx_temp = intgpower(cosx_copy1)
cosx_temp = minuspower(constpower(1), intgpower(sinx_copy1))
return sinx_result, cosx_result
sinx, cosx = sine_cosine_series()
print("cosine")
print(list(islice(sinx, 10)))
print("sine")
print(list(islice(cosx, 10)))