3. Seqüència de racionals (3 punts)

Avís

Per a resoldre aquest exercici no es poden fer servir llistes, tuples, diccionaris ni cap altra estructura de dades per a desar tots els elements d’un iterador.

Definim la següent seqüència (potencialment infinita) de nombres racionals \(S(u) = r_1 \, r_2 \, r_3 \, \dots\), que depèn d’un nombre enter u:

\[\begin{split}r_1 & = {1 \over u} \\ r_{i+1} & = \begin{cases} {3q_i \over 2p_i} & \text{si} \; r_i < 1 \\ {1+2p_i \over 1+3q_i} & \text{altrament} \end{cases} \;\;\;\; \forall i \geq 1\end{split}\]

on \(r_i = {p_i \over q_i}\) són les fraccions canòniques de la seqüència, és a dir, els racionals simplificats (tal com queden creats pel mòdul fractions).

En un fitxer anomenat seqrac.py, deseu-hi la funció generadora especificada a continuació:

seqrac.sequencia(u)
Paràmetres:

u – enter estrictament positiu

Retorna:

iterador sobre la seqüència \(S(u)\)

Tipus de retorn:

iterador de fractions.Fraction

Per exemple:


>>> it = sequencia(3)
>>> next(it)
Fraction(1, 3)
>>> next(it)
Fraction(9, 2)
>>> next(it)
Fraction(19, 7)
>>> for i in range(10):
...    print(next(it), end=",")
39/22,79/67,159/202,101/53,203/160,11/13,39/22,79/67,159/202,101/53,

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