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:

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

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