Avís

Per a resoldre aquests exercicis no es poden fer servir llistes, tuples, diccionaris ni cap altra estructura. Ara bé, podeu dissenyar les funcions demanades bé com a generadors, bé utilitzant les funcions predefinides de Python i les dels mòduls itertools, functools i operator.

2. Avaluació d’un Polinomi

Ara representem un polinomi com un iterador infinit de parelles (grau, coeficient) que comença pel grau zero i creix d’un en un. Per exemple, el polinomi \(p(x) = -x^5 + 7x^2 - 3\) es representa amb les parelles següents:

(0, -3) (1, 0) (2, 7) (3, 0) (4, 0) (5, -1) (6, 0) (7, 0) ...

Recordeu que un polinomi té infinits coeficients, però que són zero a partir del grau del polinomi.

Voldrem avaluar el polinomi en el punt \(x\) fins al grau \(g\) per tots els graus a partir de zero. Observeu que el valor del polinomi en el punt \(x\) fins al grau \(g\) és \(c \cdot x^g + v\) on \(c\) és el coeficient de grau \(g\) i \(v\) és el valor del polinomi en el punt \(x\) fins al grau \(g - 1\). Continuant amb l’exemple anterior, les parelles (grau, valor) per al punt \(x = 1\) són les següents:

(0, -3)   perquè -3 == -3*x**0
(1, -3)   perquè -3 ==  0*x**1 - 3
(2, 4)    perquè  4 ==  7*x**2 - 3
(3, 4)    perquè  4 ==  0*x**3 + 4
(4, 4)    perquè  4 ==  0*x**4 + 4
(5, 3)    perquè  3 == -1*x**5 + 4
...

Dissenyeu la funció especificada a continuació i deseu-la al mòdul aval_poli (fitxer aval_poli.py):

aval_poli.avalua_polinomi(p, x)
Paràmetres:
  • p – polinomi representat com un iterador infinit de parelles (grau, coeficient) que comença pel grau zero i creix d’un en un

  • x – punt en què s’avalua el polinomi

Retorna:

iterador infinit de les parelles (grau, valor) en què el valor és el del polinomi avaluat en x fins aquest grau

Per exemple,


>>> p = iter([(0, -3), (1, 0), (2, 7), (3, 0), (4, 0), (5, -1), (6, 0)])
>>> r = avalua_polinomi(p, 1)
>>> r is iter(r) # r és un iterador
True
>>> list(itertools.islice(r, 7))
[(0, -3), (1, -3), (2, 4), (3, 4), (4, 4), (5, 3), (6, 3)]


>>> p = iter([(0, 0), (1, 12), (2, 0), (3, -5), (4, -10), (5, 0), (6, 0), (7, 0), (8, 0)])
>>> r = avalua_polinomi(p, -1)
>>> list(itertools.islice(r, 9))
[(0, 0), (1, -12), (2, -12), (3, -7), (4, -17), (5, -17), (6, -17), (7, -17), (8, -17)]

Disposeu d’un joc de proves més complet al fitxer tests-aval_poli.txt