#!/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 > 0: r += "+" elif isinstance(self.cero, Complejos): if self.C[i].R.P > 0: r += "+" elif isinstance(self.cero, complex): if self.C[i].real > 0: r += "+" else: if self.C[i] > 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 < 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) < 2 or self.Q < 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)))