首页 > 解决方案 > 将两个多项式相乘的函数给出错误的结果

问题描述

我想创建一个名为的函数multipoly(x,y),它将两个列表作为输入,将列表相乘并返回答案。

多项式表示如下:例如 x^4+2X^3 表示为[(1,4),(2,3)]
这是我得到的东西,但它对某些测试用例返回错误的答案:

def multipoly(p1,p2):
    x=max(p1,p2)
    y=min(p1,p2)
    p1=x
    p2=y
    for i in range(len(x)):
        for item in p2:
            p1[i] = ((p1[i][0] * item[0]), (p1[i][1] + item[1]))
            p2.remove(item)
    return p1
print(multipoly([(1,1),(-1,0)],[(1,2),(1,1),(1,0)])) 

标签: pythonpolynomials

解决方案


如果你只是想要一个函数来乘以两个多项式,表示为一个元组列表,[(coef, expn) ...]你可以通过p1, p2将这两个多项式逐项相乘来开始

p3 = [(c1*c2, e1+e2) for c1, e1 in p1 for c2, e2 in p2]

但是你有一个问题,因为一般来说,你会有多个具有相同指数的术语,为了标准化结果,p3我们可以使用字典

d = {}
for c, e in p3:
    d[e] = d.get(e, 0) + c

请注意,如果指数已经存在于或返回d.get(e, 0),则返回。d[e]d0

最后,您希望将结果作为元组列表返回

p3 = [(c, e) for e, c in d.items()]

但不保证此列表按指数递减顺序排序

p3 = sorted(p3, key=lambda t: -t[1])

可以将所有这些放在一个可调用的

def pmult(p1, p2):
     d = {}
     for coef, expn in [(c1*c2, e1+e2) for c1, e1 in p1 for c2, e2 in p2]:
         d[expn] = d.get(expn,0)+coef
     return sorted([(c, e) for e, c in d.items()], key=lambda t: -t[1])

一个测试:

In [25]: a = [(1,2),(3,0)]
In [26]: b = [(1,4),(2,3),(3,2),(4,1),(5,0)]
In [27]: def pmult(p1, p2):
    ...:     d = {}
    ...:     for coef, expn in [(c1*c2, e1+e2) for c1, e1 in p1 for c2, e2 in p2]:
    ...:         d[expn] = d.get(expn,0)+coef
    ...:     return sorted([(c, e) for e, c in d.items()], key=lambda t: -t[1])
In [28]: pmult(a, b)
Out[28]: [(1, 6), (2, 5), (6, 4), (10, 3), (14, 2), (12, 1), (15, 0)]

推荐阅读