3. Congruents (4 punts)

Avís

Per a resoldre aquest exercici no es poden fer servir iteracions (ni for ni while ), només les funcions predefinides de Python i les dels mòduls itertools, functools i operator. Tampoc es poden fer servir llistes, tuples, diccionaris ni cap altra estructura de dades per a desar tots els elements dels iterables.

Definim que una fracció és congruent amb una altra si tenen el mateix denominador, i l’operació de mòdul entre numerador i denominador de cadascuna coincideix.

Es demana que al mòdul congruents (fitxer congruents.py) facis la funció generadora següent:

congruents.congruent_nums(it, fra)
Paràmetres:
Retorna:

dos iteradors sobre les seqüències d’enters dels numeradors de les fraccions de it que són congruents amb fra: el 1r amb els numeradors positius i el 2n amb els negatius. Ambdós segueixen el mateix ordre de l’iterador d’entrada it.

Per exemple:


>>> l = [Fraction(1, 3), Fraction(3, 3), Fraction(4, 3), Fraction(2, 6)]
>>> l.extend([Fraction(14, 6), Fraction(5, 3), Fraction(-2, 3), Fraction(-22, 6)])
>>> it1, it2 = congruent_nums(iter(l), Fraction(1, 3))
>>> it1 == iter(it1) and list(it1) == [1, 4, 1, 7] and  it2 == iter(it2) and list(it2) == [-2, -11]
True

Disposes d’un joc de proves més complet al fitxer congruent_nums-test.txt