Создание Полиномиальной классы в Python

голоса
1

Я в настоящее время работаю над созданием полиномиального класса , который включает надстройку , MUL и Eval методу. Я в настоящее время застрял на капельную части, если кто - то может дать мне некоторую помощь о том , как получить , что понял, что было бы весьма признателен. Все в настоящее время работает без ошибок , но когда я p3 = p1 + p2 и p3 печатаю я вернусь два списка вместе. Любая обратная связь будет принята с благодарностью.

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
Задан 13/02/2020 в 23:53
источник пользователем
На других языках...                            


3 ответов

голоса
0

Проблема здесь:

num = self.coeffs + other.coeffs

Добавление одного списка в другой список объединяющих их. Для того, чтобы просто добавить соответствующие элементы друг к другу, вы хотите сделать

from itertools import zip_longest

...

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

Мы используем zip_longest()вместо более общего характера, zip()поскольку один многочлен, возможно , больше , чем другие , и мы не хотим , чтобы разрушить его. Либо один из них будет группироваться соответствующие элементы так , что мы можем легко добавить их и сделать список тех.

Вы бы сделать что-то подобное для вычитания.

Ответил 13/02/2020 в 23:57
источник пользователем

голоса
0

Вы не можете напрямую добавить два списка.

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)
Ответил 14/02/2020 в 00:02
источник пользователем

голоса
0

вы должны изменить порядок коэффициентов , переданных конструктор так , что индексы в self.coeffsсписке соответствует показателям. Это упростит остальную часть кода и позволяет использовать zip_longest для сложения и вычитания.

Когда вы получите другие операции, однако, я думаю, вы поймете, что ваша внутренняя структура была бы проще, если это был словарь. Словарь является более снисходительным недостающими записями, таким образом избегая заботы о выделении мест для новых индексов.

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()
Ответил 14/02/2020 в 02:48
источник пользователем

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