python - 将两个多项式相乘的函数给出错误的结果
问题描述
我想创建一个名为的函数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)]))
解决方案
如果你只是想要一个函数来乘以两个多项式,表示为一个元组列表,[(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]
d
0
最后,您希望将结果作为元组列表返回
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)]
推荐阅读
- python - 使用 boto3 和 python 将 AWS EC2 详细信息导出到 xlsx/csv
- dart - 发生异常:类型'列表
' 不是类型 'Map 的子类型 ' - javascript - 单击按钮不执行 Firefox 中的功能
- reactjs - 使用 TypeScript 的 Eslint react/prop-types 错误
- vue.js - 无法访问 nuxt.config.js 中的 env
- sql-server - where 条件基于具有 Max 记录的多列
- node.js - dynamoDB 相对于 mongoDB 的技术优势:考虑迁移
- java - 在 Java 中使用添加函数/字段来枚举案例而不是覆盖?
- javascript - 获取确切的一个 ngFor 元素的值,我输入了该值
- python - HTTP Post 请求仅在重新加载网页时