2014-11-22 3 views
0

Я написал этот класс полиномов, но у меня возникла проблема с загрузкой mul за загрузчиком, чтобы вернуть правильный результат. Он работает для самых высоких и низких степеней полинома, но возвращает неправильный коэффициент для внутренних степеней. Я думаю, что это связано с тем, как я обновляю значения коэффициента. Пожалуйста помоги.Продукт двух полиномов python

class Polynomial: 
def __init__(self, *termpairs): 
    termdict1={} 
    for i in termpairs: 
     termdict1[i[1]]=i[0]  
    self.termdict = termdict1 
def __str__(self): 
    k = sorted(self.termdict, reverse = True) 
    v = 0 
    x = '' 
    for i in k: 
     if i == 0: 
       x += str(self.termdict.get(i)) 
     elif i == 1: 
      if self.termdict.get(i) > 0: 
       x+=' + ' 
       x+=str(self.termdict.get(i)) 
       x+='x' 
      else: 
       x+= ' - ' 
       x+=str(abs(self.termdict.get(i))) 
       x+='x' 
     elif i > 1: 
      if self.termdict.get(i) > 0: 
       x+=' + ' 
       x+=str(self.termdict.get(i)) 
       x+='x^' 
       x+=str(i) 
      else: 
       x+=' - ' 
       x+=str(abs(self.termdict.get(i))) 
       x+='x^' 
       x+=str(i) 
     elif i < 0: 
      x+=' - ' 
      x+=str(abs(self.termdict.get(i))) 
      x+='x^' 
      x+=str(i) 
    if x[1] == '+': 
     return(x[3:]) 
    else: 
     return(x) 

def degree(self): 
    k = sorted(self.termdict, reverse = True) 
    return(k[0]) 
def evaluate(self,x): 
    final = 0 
    for k,v in self.termdict.items(): 
     print(k,v) 
     final += v*(x**k) 
    return(final) 
def addterm(self,x,y): 
    if y in self.termdict.keys(): 
     self.termdict[y] = (self.termdict.get(y) + x) 
    else: 
     self.termdict[y] = x 
    return(self.termdict) 
def removeterm(self,x): 
    if x in self.termdict.keys(): 
     del self.termdict[x] 
    return(self.termdict) 
def scale(self,x): 
    for k in self.termdict.keys(): 
     self.termdict[k] = (self.termdict.get(k) * x) 
    return(self.termdict) 
def __add__(self,other): 
    New = Polynomial() 
    for k,v in self.termdict.items(): 
     New.addterm(v,k) 
    for k,v in other.termdict.items(): 
     New.addterm(v,k) 
def __sub__(self,other): 
    s = Polynomial() 
    x = Polynomial() 
    for k,v in self.termdict.items(): 
     s.addterm(v,k) 
    print(s.termdict) 
    for key in other.termdict.keys(): 
     s.removeterm(key) 
    for k,v in other.termdict.items(): 
     x.addterm(v,k) 
    print(x.termdict) 
    for key in self.termdict.keys(): 
     x.removeterm(key) 
    for k,v in x.termdict.items(): 
     s.addterm(-1*v,k) 
    print(s.termdict) 
    return(s.termdict) 
def __mul__(self,other): 
    S = Polynomial() 
    for k,v in other.termdict.items(): 
     for key, value in self.termdict.items(): 
       S.termdict[key+k]=(value*v) 
    print(S) 

ответ

0

Несколько пар термин может mulitply дать такую ​​же мощность, в результате - например, $ X^2 * х $ и $ х * х^2 $ и дают $ х^3 $. Эти коэффициенты необходимо добавить, в то время как вы фактически игнорируете все, кроме последнего, которое вы найдете. Таким образом, изменение во второй последней строке должно быть:

S.termdict[key+k] = S.termdict.get(key+k, 0) + value*v 

Вы можете сделать это совсем немного лучше, если вы инициализируете termdict1 в __init__ как defaultdict(int) (из модуля коллекций) - выше станет:

S.termdict[key + k] += value*v 
Смежные вопросы