<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#!/usr/bin/python
# -*- coding: utf-8 -*-

""" Bosquejo de un programa para manipular nuemeros complejos
      Autor: Antonio Carrillo Ledesma
"""


class Complejos:
    """Definicion de la clase Complejos"""

    def __init__(self, rp=0, rq=1, ip=0, iq=1):
        """Constructor nulo rp/rq + ip/iqi"""
        self.R = Fraccion(rp, rq)
        self.I = Fraccion(ip, iq)

    def __str__(self):
        return str(self.R) + " + " + str(self.I) + "i"

    def visualiza(self):
        """Visualiza la Fraccion"""
        print("{} + {}i".format(self.R, self.I))

    def suma1(self, a):
        self.R.suma1(a.R)
        self.I.suma1(a.I)

    def suma(self, a, b):
        self.R.suma(a.R, b.R)
        self.I.suma(a.I, b.I)


class Fraccion:
    """Definicion de la clase Fraccion"""

    Pr = []  # inicializa el arreglo que contendra los primos encontrados
    nPr = 100

    def __init__(self, p=0, q=1):
        """Constructor fraccion p/q"""
        self.P = p
        self.Q = q
        self.cribaEratostenes()

    def __str__(self):
        """Visualiza la Fraccion"""
        self.simplifica()
        return str(self.P) + "/" + str(self.Q)

    def visualiza(self):
        """Visualiza la Fraccion"""
        self.simplifica()
        print("{} / {}".format(self.P, self.Q))

    def suma1(self, a):
        """Suma un operador"""
        self.P = self.P * a.Q + a.P * self.Q
        self.Q = self.Q * a.Q

    def suma(self, a, b):
        """Suma dos operadores"""
        self.P = a.P * b.Q + b.P * a.Q
        self.Q = a.Q * b.Q

    def cribaEratostenes(self):
        """Calcular los primeros N numeros primos
        por el algoritmo de la criba de Eratostenes
        """
        # Guarda los primeros 2 primos
        self.Pr.append(2)
        self.Pr.append(3)
        npr = 2
        # Empieza la busqueda de primos a partir del numero 4
        n = 4
        # Ciclo para buscar los primeros N primos
        while npr &lt; self.nPr:
            for i in range(npr):
                if (n % self.Pr[i]) == 0:
                    break
            if i == npr - 1:
                self.Pr.append(n)
                npr += 1
            n += 1

    def visualizaPrimos(self):
        """Visualiza los primos encontrados"""
        print("Visualiza los primeros " + str(self.nPr) + " primos ")
        for i in range(self.nPr):
            print(self.Pr[i])

    def simplifica(self):
        """Simplifica la fraccion"""
        for i in range(self.nPr):
            sw = 1
            while sw == 1:
                sw = 0
                if abs(self.P) &lt; 2 or self.Q &lt; 2:
                    break
                if self.P % self.Pr[i] == 0 and self.Q % self.Pr[i] == 0:
                    self.P //= self.Pr[i]
                    self.Q //= self.Pr[i]
                    sw = 1


"""
Prueba de las clases
"""
if __name__ == "__main__":
    a = Complejos(1, 3, 2, 4)
    b = Complejos(2, 3)
    c = Complejos()

    a.visualiza()
    b.visualiza()
    c.visualiza()

    print("Suma de un operando")
    r = str(a) + " + " + str(b) + " = "
    a.suma1(b)
    r = r + str(a)
    print(r)

    print("Suma de dos operandos")
    c.suma(a, b)
    r = str(a) + " + " + str(b) + " = " + str(c)
    print(r)

    # a.visualizaPrimos()
</pre></body></html>