Vytváření Polynomial třídy v Pythonu

hlasů
1

Já jsem v současné době pracuje na vytvoření polynomu třídu, která zahrnuje doplněk , MUL a eval metody. Jsem v současné době uvízl na sčítání části, pokud mi někdo mohl dát nějakou pomoc o tom, jak se dostat, že přišel na to, že by bylo velmi ocenil. Všechno, co v současné době pracuje bez chyb, ale když jsem to p3 = p1 + p2 a vytisknout p3 vrátím dva seznamy dohromady. Každá zpětná vazba bude velmi ocenil.

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
Položena 13/02/2020 v 23:53
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
0

Problémem je zde:

num = self.coeffs + other.coeffs

Přidáním jednoho seznamu do jiného seznamu zřetězí je. Jednoduše přidat odpovídající prvky k sobě navzájem, že chcete dělat

from itertools import zip_longest

...

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

Používáme zip_longest()namísto obecnější zip(), protože jeden polynom je možná delší než druhá a nechceme, aby ji zničit. Jedna z nich bude seskupit odpovídající prvky, takže můžeme snadno přidat je a vytvořit seznam těch.

Ty by něco podobného pro odčítání.

Odpovězeno 13/02/2020 v 23:57
zdroj uživatelem

hlasů
0

Nemůžete přímo přidat dva seznamy.

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)
Odpovězeno 14/02/2020 v 00:02
zdroj uživatelem

hlasů
0

byste měli obrátit pořadí koeficientů předaných vaší konstruktoru, takže indexy v self.coeffsseznamu odpovídají exponenty. To by zjednodušilo zbytek kódu a umožní používat zip_longest pro sčítání a odčítání.

Když se dostanete do dalších operací ale myslím, že si uvědomíte, že váš vnitřní struktura by bylo jednodušší spravovat, jestli je to slovník. Slovník je více tolerantní chybějící položky čímž se zabrání starostí přidělování prostor pro nové indexy.

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()
Odpovězeno 14/02/2020 v 02:48
zdroj uživatelem

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