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