[英]How to calculate sum of two polynomials?
例如 3x^4 - 17x^2 - 3x + 5。多項式的每一項都可以表示為一對整數(系數,指數)。 多項式本身就是這樣的對的列表,例如
[(3,4), (-17,2), (-3,1), (5,0)]
為多項式,如圖所示。
零多項式 0 表示為空列表[]
,因為它沒有具有非零系數的項。
我想編寫兩個函數來添加和乘以具有相同元組表示的兩個輸入多項式(系數,指數):
addpoly(p1, p2)
multpoly(p1, p2)
測試用例:
addpoly([(4,3),(3,0)], [(-4,3),(2,1)])
應該給[(2, 1),(3, 0)]
addpoly([(2,1)],[(-2,1)])
應該給[]
multpoly([(1,1),(-1,0)], [(1,2),(1,1),(1,0)])
應該給[(1, 3),(-1, 0)]
這是我開始的東西,但完全被震撼了!
def addpoly(p1, p2):
(coeff1, exp1) = p1
(coeff2, exp2) = p2
if exp1 == exp2:
coeff3 = coeff1 + coeff2
在 Python 中,最接近多重集的是Counter數據結構。 使用將指數映射到系數的Counter
(甚至只是一個普通字典)將自動合並具有相同指數的條目,就像您在編寫簡化多項式時所期望的那樣。
您可以使用Counter
執行操作,然后在使用完這樣的函數后轉換回您的對列表表示:
def counter_to_poly(c):
p = [(coeff, exp) for exp, coeff in c.items() if coeff != 0]
# sort by exponents in descending order
p.sort(key = lambda pair: pair[1], reverse = True)
return p
要添加多項式,您可以將相似的指數組合在一起並將它們的系數相加。
def addpoly(p, q):
r = collections.Counter()
for coeff, exp in (p + q):
r[exp] += coeff
return counter_to_poly(r)
(事實上,如果你一直堅持使用 Counter 表示,你可以只return p + q
)。
要乘以多項式,您可以將一個多項式中的每一項與另一個多項式中的每一項成對地相乘。 此外,要乘以項,您可以添加指數並乘以系數。
def mulpoly(p, q):
r = collections.Counter()
for (c1, e1), (c2, e2) in itertools.product(p, q):
r[e1 + e2] += c1 * c2
return counter_to_poly(r)
這個python代碼對我有用,希望這對你也有用......
def addpoly(p1,p2):
i=0
su=0
j=0
c=[]
if len(p1)==0:
#if p1 empty
return p2
if len(p2)==0:
#if p2 is empty
return p1
while i<len(p1) and j<len(p2):
if int(p1[i][1])==int(p2[j][1]):
su=p1[i][0]+p2[j][0]
if su !=0:
c.append((su,p1[i][1]))
i=i+1
j=j+1
elif p1[i][1]>p2[j][1]:
c.append((p1[i]))
i=i+1
elif p1[i][1]<p2[j][1]:
c.append((p2[j]))
j=j+1
if p1[i:]!=[]:
for k in p1[i:]:
c.append(k)
if p2[j:]!=[]:
for k in p2[j:]:
c.append(k)
return c
def multipoly(p1,p2):
p=[]
s=0
for i in p1:
c=[]
for j in p2:
s=i[0]*j[0]
e=i[1]+j[1]
c.append((s,e))
p=addpoly(c,p)
return p
我想出了一個解決方案,但我不確定它是否經過優化!
def addpoly(p1,p2):
for i in range(len(p1)):
for item in p2:
if p1[i][1] == item[1]:
p1[i] = ((p1[i][0] + item[0]),p1[i][1])
p2.remove(item)
p3 = p1 + p2
for item in (p3):
if item[0] == 0:
p3.remove(item)
return sorted(p3)
第二個:-
def multpoly(p1,p2):
for i in range(len(p1)):
for item in p2:
p1[i] = ((p1[i][0] * item[0]), (p1[i][1] + item[1]))
p2.remove(item)
return p1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.