<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 polinomios 
      Autor: Antonio Carrillo Ledesma
"""


class Poly:
    C = []  # Coeficientes del polinomio
    Dim = 10  # Guarda la dimension del arreglo de coeficientes

    def __init__(self, coef):
        """Cosntructor de la clase"""
        self.cero = 0
        if isinstance(coef[0], Fraccion):
            self.cero = Fraccion()
        elif isinstance(coef[0], Complejos):
            self.cero = Complejos()
        elif isinstance(coef[0], complex):
            self.cero = 0.0 + 0.0j
        self.C = [self.cero for i in range(self.Dim)]
        for i in range(len(coef)):
            self.C[i] = coef[i]

    def __str__(self):
        """Visualiza el polinomio"""
        r = ""
        for i in range(self.Dim):
            # print(self.C[i])
            if self.C[i] != self.cero:
                if isinstance(self.cero, Fraccion):
                    if self.C[i].P &gt; 0:
                        r += "+"
                elif isinstance(self.cero, Complejos):
                    if self.C[i].R.P &gt; 0:
                        r += "+"
                elif isinstance(self.cero, complex):
                    if self.C[i].real &gt; 0:
                        r += "+"
                else:
                    if self.C[i] &gt; 0:
                        r += "+"

                r += str(self.C[i])
                if i == 0:
                    continue
                r += "X^" + str(i)
        return r

    def visualiza(self):
        """Visualiza el polinomio"""
        print(self)

    def grado(self):
        """Grado del polinomio"""
        for i in range(self.Dim - 1, 0, -1):
            if self.C[i] != self.cero:
                return i
        return 0

    def __add__(self, b):
        """Suma polinomios"""
        C = [self.cero for i in range(self.Dim)]
        for i in range(self.Dim):
            C[i] = self.C[i] + b.C[i]
        return Poly(C)

    def __mul__(self, b):
        """Multiplicacion de polinomios"""
        C = [self.cero for i in range(self.Dim)]
        for i in range(self.Dim // 2):
            for j in range(self.Dim // 2):
                C[i + j] += self.C[i] * b.C[j]
        return Poly(C)

    def deriva(self):
        """Deriva el polinomio"""
        C = [self.cero for i in range(self.Dim)]

        if isinstance(self.cero, Fraccion):
            for i in range(1, self.Dim):
                C[i - 1] = self.C[i] * Fraccion(i)
        elif isinstance(self.cero, Complejos):
            for i in range(1, self.Dim):
                C[i - 1] = self.C[i] * Complejos(i)
        else:
            for i in range(1, self.Dim):
                C[i - 1] = self.C[i] * i
        return Poly(C)

    def integra(self):
        """Integra el polinomio"""
        C = [self.cero for i in range(self.Dim)]
        if isinstance(self.cero, Fraccion):
            for i in range(self.Dim - 1):
                C[i + 1] = self.C[i] / (Fraccion(i) + Fraccion(1))
        elif isinstance(self.cero, Complejos):
            for i in range(self.Dim - 1):
                C[i + 1] = self.C[i] / (Complejos(i) + Complejos(1))
        else:
            for i in range(self.Dim - 1):
                C[i + 1] = self.C[i] / (i + 1)
        return Poly(C)

    def evalua(self, x):
        """Evalua el polinomio"""
        r = self.cero
        p = 1
        if isinstance(self.cero, Fraccion):
            p = Fraccion(1)
        elif isinstance(self.cero, Complejos):
            p = Complejos(1)
        for i in range(self.Dim):
            r += self.C[i] * p
            p *= x
        return r


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 __add__(self, a):
        """Suma"""
        r = self.R + a.R
        i = self.I + a.I
        return Complejos(r.P, r.Q, i.P, i.Q)

    def __sub__(self, a):
        """Resta"""
        r = self.R - a.R
        i = self.I - a.I
        return Complejos(r.P, r.Q, i.P, i.Q)

    def __mul__(self, a):
        """MultiplicaciÃ²n"""
        r = self.R * a.R - self.I * a.I
        i = self.R * a.I + self.I * a.R
        return Complejos(r.P, r.Q, i.P, i.Q)

    def __truediv__(self, a):
        """DivisiÃ²n"""
        t = (a.R * a.R) + (a.I * a.I)
        r = ((self.R * a.R) + (self.I * a.I)) / t
        i = ((self.I * a.R) - (self.R * a.I)) / t
        return Complejos(r.P, r.Q, i.P, i.Q)

    def __ne__(self, a):
        """No igual"""
        if self.R == a.R and self.I == a.I:
            return False
        return True

    def __eq__(self, a):
        """igual"""
        if self.R == a.R and self.I == a.I:
            return True
        return False


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

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

    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 __add__(self, a):
        """Suma"""
        p = self.P * a.Q + a.P * self.Q
        q = self.Q * a.Q
        return Fraccion(p, q)

    def __sub__(self, a):
        """Resta"""
        p = self.P * a.Q - a.P * self.Q
        q = self.Q * a.Q
        return Fraccion(p, q)

    def __mul__(self, a):
        """Multiplicacion"""
        p = self.P * a.P
        q = self.Q * a.Q
        return Fraccion(p, q)

    def __truediv__(self, a):
        """Division"""
        p = self.P * a.Q
        q = self.Q * a.P
        return Fraccion(p, q)

    def __ne__(self, a):
        """No igual"""
        if self.P == a.P and self.Q == a.Q:
            return False
        return True

    def __eq__(self, a):
        """igual"""
        if self.P == a.P and self.Q == a.Q:
            return True
        return False

    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"""
        if self.P == 0:
            self.Q = 1
            return
        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__":
    print("\n\nENTERO")
    a = Poly([1, -2, 3])
    a.visualiza()

    b = Poly([4, 5])
    b.visualiza()

    print("Suma")
    c = Poly([0])
    c = a + b
    c.visualiza()

    print("Multiplicacion")
    d = Poly([0])
    d = a * b
    d.visualiza()

    print("Deriva")
    a.visualiza()
    d = Poly([0])
    d = a.deriva()
    d.visualiza()

    print("Integra")
    d.visualiza()
    e = Poly([0])
    e = d.integra()
    e.visualiza()

    print("evalua")
    a.visualiza()
    print(a.evalua(10))

    print("\n\nDOUBLE")
    a = Poly([1.0, -2.0, 3.0])
    a.visualiza()

    b = Poly([4.0, 3.0])
    b.visualiza()

    print("Suma")
    c = Poly([0.0])
    c = a + b
    c.visualiza()

    print("Multiplicacion")
    d = Poly([0.0])
    d = a * b
    d.visualiza()

    print("Deriva")
    a.visualiza()
    d = Poly([0])
    d = a.deriva()
    d.visualiza()

    print("Integra")
    d.visualiza()
    e = Poly([0])
    e = d.integra()
    e.visualiza()

    print("evalua")
    a.visualiza()
    print(a.evalua(10))

    print("\n\nComplejos")
    a = Poly([1.0 + 1.0j, -2.0 + 2.0j, 3.0 + 3.0j])
    a.visualiza()

    b = Poly([4.0 + 1.0j, 5.0 + 2.0j])
    b.visualiza()

    print("Suma")
    c = Poly([0.0j])
    c = a + b
    c.visualiza()

    print("Multiplicacion")
    d = Poly([0.0j])
    d = a * b
    d.visualiza()

    print("Deriva")
    a.visualiza()
    d = Poly([0])
    d = a.deriva()
    d.visualiza()

    print("Integra")
    d.visualiza()
    e = Poly([0])
    e = d.integra()
    e.visualiza()

    print("evalua")
    a.visualiza()
    print(a.evalua(10))

    print("\n\nFRACCION")
    v1, v2, v3, v4, v5, v6 = (
        Fraccion(1, 2),
        Fraccion(1, 3),
        Fraccion(-1, 4),
        Fraccion(1, 5),
        Fraccion(1, 6),
        Fraccion(),
    )
    a = Poly([v1, v2, v3])
    a.visualiza()

    b = Poly([v4, v5])
    b.visualiza()

    print("Suma")
    c = Poly([v6])
    c = a + b
    c.visualiza()

    print("Multiplicacion")
    d = Poly([v6])
    d = a * b
    d.visualiza()

    print("Deriva")
    a.visualiza()
    d = Poly([0])
    d = a.deriva()
    d.visualiza()

    print("Integra")
    d.visualiza()
    e = Poly([0])
    e = d.integra()
    e.visualiza()

    print("evalua")
    a.visualiza()
    print(a.evalua(Fraccion(10)))

    print("\n\nCOMPLEJO FRACCIONARIO")
    v1, v2, v3, v4, v5, v6 = (
        Complejos(1, 2, 1, 2),
        Complejos(1, 3, 1, 2),
        Complejos(-1, 4, 1, 2),
        Complejos(1, 5, 1, 2),
        Complejos(1, 6, 1, 2),
        Complejos(),
    )
    a = Poly([v1, v2, v3])
    a.visualiza()

    b = Poly([v4, v5])
    b.visualiza()

    print("Suma")
    c = Poly([v6])
    c = a + b
    c.visualiza()

    print("Multiplicacion")
    d = Poly([v6])
    d = a * b
    d.visualiza()

    print("Deriva")
    a.visualiza()
    d = Poly([0])
    d = a.deriva()
    d.visualiza()

    print("Integra")
    d.visualiza()
    e = Poly([0])
    e = d.integra()
    e.visualiza()

    print("evalua")
    a.visualiza()
    print(a.evalua(Complejos(10)))
</pre></body></html>