2014-12-05 3 views
0

Я написал небольшой класс, инициализатор которого принимает в качестве аргумента словарь. Следующий словарь {2:3, 4:5, 6:7} переводит на многочлен 3x^2 + 5x^4 + 7x^6, поэтому ключи моего словаря являются показателями и его значениями являются коэффициенты.Умножая полиномы на Python с использованием словарей

Мне удалось реализовать сравнение двух полиномов в моем классе с использованием метода eq, и я могу их добавить. Вот мой код:

class Polynomial(object): 
def __init__(self, polynom = {}): 
    self.polynom = polynom 
    self.poly_string = self.nicePolynom(polynom) #just a method that will make my output look nice 

def __str__(self): 
    return self.poly_string # for debugging purposes 

def coefficient(self, exponent): 
    """ 
    A small function that returns the coefficient of the corresponding exponent 

    i.e. if our Polynomial is P = 3x^9 then p.coefficient(9) return 3 
    """ 
    try: 
     return self.polynom[exponent] 
    except KeyError: 
     pass 

def __add__(self,other): 
    """ 
    Overloading the + operator 

    Not the most elegant solution but easily understandable. 
    We check first if our exponent is present in both polynomials 
    then if its only present in one and the symmetric case, adding the result 
    to the dictionary add 
    """ 
    add = {} 

    for exponent in self.polynom: 
     if exponent in other.polynom: 
      add[exponent] = self.polynom[exponent] + other.polynom[exponent] 

    for exponent in self.polynom: 
     if exponent not in other.polynom: 
      add[exponent] = self.polynom[exponent] 

    for exponent in other.polynom: 
     if exponent not in self.polynom: 
      add[exponent] = other.polynom[exponent] 
    return add 

def __mul__(self, other): 

    mult = {} 

    for exponent1 in self.polynom: 
     for exponent2 in other.polynom: 
      mult[exponent1 + exponent2] = self.coefficient(exponent1) * other.coefficient(exponent2) 

    return mult 

Решающий шаг, и моя основная проблема заключается в том, что при размножении я хочу, чтобы использовать дополнение. Но я совершенно новичок в ООП, и я не вижу, как я могу инициализировать объект Polynom, на котором я могу выполнить арифметику добавления.

Если я умножаю многочлен сам по себе в тот момент, когда я получаю правильные показатели, но помимо начального и конечного членов все коэффициенты удаляются.

+0

Коэффициенты отключены, потому что более одного термина в вашем расширении вносит один и тот же ответ в ответ, и вы переписываете запись «mult» с одним и тем же ключом экспонирования в этом случае ... например. что происходит, когда 'exponent1, exponent2 = 1,3', а затем позже,' exponent1, exponent2 = 2,2'? – xnx

+0

Я согласен с этим @xnx, но я не вижу, как это исправить, есть ли простой способ предотвратить это с аргументом if/else? – Spaced

+0

Если это учебное упражнение, то, во что бы то ни стало, пойти на это. Но если вы хотите использовать это для чего-то серьезного, мой совет заключается не в том, чтобы изобретать колесо, а просто для того, чтобы посмотреть на [sympy] (http://docs.sympy.org/latest/tutorial/intro.html), который очень хорошо разбирается в полиномах (между прочим). –

ответ

2

Вот один подход, который мог бы работать:

for exponent1 in self.polynom: 
    for exponent2 in other.polynom: 
     this_exponent = exponent1 + exponent2 
     this_coeff = self.coefficient(exponent1) * other.coefficient(exponent2) 
     try: 
      mult[this_exponent] += this_coeff 
     except KeyError: 
      mult[this_exponent] = this_coeff 

То есть, обновить коэффициент новой власти, и поймать исключение, которое возникает в первый раз власти встречается для инициализации словаря в соответствующем ключ экспоненты. (Это более «Pythonic», что оговорка if..else, если вы заботитесь о таких вещах).