Tworzenie wielomian klasy w Pythonie

głosy
1

Obecnie pracuję nad stworzeniem wielomian klasę, która zawiera dodatek , Mul i eval metod. Obecnie jestem zakleszczony na część Ponadto, jeśli ktoś mógłby mi dać jakąś pomoc jak zdobyć, że zorientowali się, że byłoby bardzo mile widziane. Wszystko obecnie pracuje bez błędów, ale gdy robię p3 = P1 + P2 i P3 wydrukować wrócę dwóch list razem. Wszelkie uwagi będą bardzo mile widziane.

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
Utwórz 13/02/2020 o 21:53
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

Problemem jest tutaj:

num = self.coeffs + other.coeffs

Dodanie jednej listy do innej listy skleja ich. Po prostu dodać odpowiednie elementy do siebie, że chcesz to zrobić

from itertools import zip_longest

...

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

Używamy zip_longest()zamiast bardziej ogólny zip(), ponieważ jeden wielomian jest prawdopodobnie dłużej niż inne i nie chcemy, aby go zniszczyć. Albo jeden z nich będzie grupować odpowiednie elementy tak, że można je łatwo dodać i zrobić listę tych.

Można by zrobić coś podobnego do odejmowania.

Odpowiedział 13/02/2020 o 21:57
źródło użytkownik

głosy
0

Nie można bezpośrednio dodać dwie listy.

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)
Odpowiedział 13/02/2020 o 22:02
źródło użytkownik

głosy
0

należy odwrócić kolejność współczynników przekazywane do konstruktora tak, że indeksy w self.coeffsliście odpowiadają wykładników. To uproszczenie resztę swojego kodu i pozwalają na skorzystanie zip_longest do dodawania i odejmowania.

Gdy dojdziesz do innych operacji, jednak myślę, że zdasz sobie sprawę, że wewnętrzna struktura byłaby łatwiejsza do zarządzania, jeśli był to słownik. Słownik jest bardziej liberalne brakujących wpisów unikając w ten sposób troski o przydzielenie miejsca dla nowych indeksów.

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()
Odpowiedział 14/02/2020 o 00:48
źródło użytkownik

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