La creación de polinomios de clase en Python

votos
1

Actualmente estoy trabajando en la creación de una clase de polinomios que incluye complemento , mul y eval métodos. Actualmente estoy atascado en la parte Además, si alguien puede dar alguna ayuda sobre cómo conseguir que la cuenta de que sería muy apreciada. Todo funciona actualmente sin errores, pero cuando lo haga p3 = P1 + P2 y P3 imprimir regrese las dos listas. Cualquier comentario sería muy apreciada.

class Polynomial(object):

    def __init__(self, *coeffs, num = 0):

        self.coeffs = list(coeffs) # turned into a list

        assert (type(num) is type(1)) 
        self.num = num

    # Needs to be operator overload
    '''
    def __mul__(self, other):
    '''

    def __eval__(self, other, coeff, x):
        result = coeff[-1]
        for i in range(-2, -len(coeff)-1, -1):
            result = result * x + coeff[i]
        return result


    def __add__(self, other):

        assert type(other) is Polynomial

        num = self.coeffs + other.coeffs

        return Polynomial(num)


    def __sub__(self, other):

        assert type(other) is Polynomial
        num = self.coeffs - other.coeffs

        return Polynomial(num)




    def __represntation__(self):
        return Polynomial + str(self.coeffs)   

    def __str__(self):
        rep =     
        degree = len(self.coeffs) - 1
        rep += str(self.coeffs[0]) + x^ + str(degree)       
        for i in range(1, len(self.coeffs)-1):
            coeff = self.coeffs[i]
            if coeff < 0:
                rep +=  -  +  str(-coeff) + x^ + str(degree - i)
            else:
                rep +=  +  +  str(coeff) + x^ + str(degree - i)

            if self.coeffs[-1] < 0:
                rep +=  -  + str(-self.coeffs[-1])
        else:
            rep +=  +  + str(self.coeffs[-1])  
        return rep
Publicado el 13/02/2020 a las 23:53
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

El problema está aquí:

num = self.coeffs + other.coeffs

Adición de una lista a otra lista concatena ellos. Para añadir simplemente elementos entre sí correspondiente, que le quiere hacer

from itertools import zip_longest

...

num = [a + b for (a, b) in zip_longest(self.coeffs, other.coeffs, fillvalue=0)]

Utilizamos zip_longest()en lugar del más genérico zip()porque un polinomio es posiblemente más largo que el otro y que no queremos arruinarlo. Cualquiera de los dos agrupará los elementos correspondientes por lo que podemos añadir fácilmente y hacer una lista de las personas.

Se podría hacer algo similar para la resta.

Respondida el 13/02/2020 a las 23:57
fuente por usuario

votos
0

No se puede agregar directamente dos listas.

def __add__(self, other):

    assert type(other) is Polynomial
    assert len(self.coeffs) != len(other.coeffs)

    new_ceffs = [item1 + item2 for (item1, item2) in zip(self.coeffs, other.coeffs)]

    return Polynomial(new_ceffs)
Respondida el 14/02/2020 a las 00:02
fuente por usuario

votos
0

usted debe invertir el orden de los coeficientes pasados a su constructor de modo que los índices de la self.coeffslista corresponden a los exponentes. Esto simplificaría el resto de su código y permitirá utilizar zip_longest de sumas y restas.

Al llegar a otras operaciones, sin embargo, creo que se dará cuenta de que su estructura interna sería más fácil de manejar si se trataba de un diccionario. Un diccionario es más permisiva de las entradas que faltan evitando así preocupaciones de asignación de espacios para nuevos índices.

class Polynomial(object):

    def __init__(self, *coeffs):
        self.coeffs = {exp:c for exp,c in enumerate(coeffs[::-1])}

    def __add__(self, other):
        assert type(other) is Polynomial
        result = Polynomial(0)
        result.coeffs = {**self.coeffs}
        for exp,c in other.coeffs.items():
            result.coeffs[exp] = result.coeffs.get(exp,0) + c
        return result

    def __sub__(self, other):
        assert type(other) is Polynomial
        result = Polynomial(0)
        result.coeffs = {**self.coeffs}
        for exp,c in other.coeffs.items():
            result.coeffs[exp] = result.coeffs.get(exp,0) - c
        return result

    def __mul__(self, other):
        assert type(other) is Polynomial
        result = Polynomial(0)
        for exp1,c1 in self.coeffs.items():
            for exp2,c2 in self.coeffs.items():
                result.coeffs[exp1+exp2] = result.coeffs.get(exp1+exp2,0) + c1*c2
        return result

    def __representation__(self):
        return "Polynomial" + str(self.coeffs)   

    def __str__(self):
        result = [""]+[f"{c}x^{i}" for i,c in sorted(self.coeffs.items()) if c]+[""]
        result = "+".join(reversed(result))
        result = result.replace("+1x","+x")
        result = result.replace("-1x","-x")
        result = result.replace("x^0","")
        result = result.replace("x^1+","x+")
        result = result.replace("+-","-")
        result = result.strip("+")
        result = result.replace("+"," + ")
        result = result[:1]+result[1:].replace("-"," - ")
        return result.strip()
Respondida el 14/02/2020 a las 02:48
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more