Python实现多项式加减乘除-1

1、多项式的表达

如何在程序中表示多项式?在这里我们用 列表 这个数据结构来表示多项式。对于多项式的运算,我们关注的就是系数以及指数(也就是次数)的变化,所以只需要记录多项式的系数和次数就可以了。

2、如何用列表表达多项式

这里用的是列表从多项式低次项开始。列表按照次数依次递增记录每一项的系数,也就是说列表记录的系数是从零次项依次递增到高次项系数。列表的索引值代表的是多项式的次数,保存的元素表示该次项的系数,,若不存在该次项则系数为0。例如 x^2+5x可表示成 [0,5,1],-x^3-2x^2+3可表示成[3,0,-2,-1]。这种表示方法自动完成了系数的对齐

3、多项式加减法的运算

计算多项式加法时,首先同次项对齐,然后同次项的系数相加即可。列表从多项式低次项开始的表示方法自动完成了对齐,所以直接从零次项开始,列表下标相同的元素相加存到结果列表中,对于较长的列表剩余元素直接复制到结果列表。

多项式减法,减去一个数加上这个数的相反数。L1-L2时,只需要将L2中元素都乘以-1,然后直接求和即可。

4、多项式乘除法

多项式乘法:第一步,选择最高次项较小的多项式作为基准(假设最高次为n),依次从该多项式中选择一个单项式乘以另一个多项式的每一项,这样就得到了n+1个多项式,每一回多项式的次数要比前一次多1,所以系数列表前面要补一个0。第二步将这n+1个多项式用之前的多项式相加的函数累加起来即可。

多项式除法:

  1. 当被除数最高项指数小于除数最高项指数时,商为0,余数为被除数。
  2. 当被除数最高项指数大于除数最高项指数时,计算如下:

  • 计算出需要循环除的次数为d=len(L1)-len(L2)+1。因为当新的被除数与除数次数相同时也要循环除一次。如上d=4-3+1=2
  • 用被除数最高次系数除以除数最高次系数,结果为商R的一部分。并在商前面填补适当个数的0记为T1,用于和除数的相乘。如上,-x^3除以x^2除以x^2得到-x,补0之后T1=[0,-1]。补0的个数为d-i。
  • 然后用商T1乘以除数,得到结果为T2。如上的[0,-1]*[0,5,1]得到结果-x^3-5x^2+0+0即[0,0,-5,-1]
  • 用被除数T减去T2,得到除一次后余下的多项式,除完之后被除数要少一次。用-x^3-x^2+0+1减去-x^3-5x^2+0+0得到4x^2+0+1即是[1,0,4,0],然后去掉最低次,新的被除数就是[1,0,4]。

以下附上多项式加减乘除的Python代码;

def add_poly(L1,L2): #多项式加法,同次项系数相加
    R=[]
    if len(L1)>len(L2):#默认L2比较长
        L1,L2=L2,L1
    i=0
    while i<len(L1):
        R.append(L1[i]+L2[i])#从低次项开始对应相加
        i+=1
    R=R+L2[len(L1):len(L2)]#较长的多项式高次项直接复制
    return R

def subtract_poly(L1,L2): #多项式减法
    L2=L2[:]#为了不改变传入的L2
    for i in range(len(L2)):
        L2[i]=-L2[i]
    return(add_poly(L1,L2))

def multiply_poly(L1,L2):#多项式乘法
    if len(L1)>len(L2):
        L1,L2=L2,L1
    zero=[];R=[]
    for i in L1:
        T=zero[:]#存储中间产生的结果多项式,每次更新结果多项式的列表长度
        for j in L2:#一个单项式乘以多项式的每一项
            T.append(i*j)
        R=add_poly(R,T)
        zero=zero+[0]# 每一个新的多形式都要比前一个多项式次数高1,列表长度增加,所以多补一个0
    return R

def divide_poly(L1,L2):
    if len(L1)<len(L2):return 0,L1#商为0的情况
    d=len(L1)-len(L2)#循环除的次数为d+1
    T=L1[:]#被除数
    R=[]#商
    for i in range(d+1):
        n=T[len(T)-1]/L2[len(L2)-1]#被除数的最高次项系数除以除数的最高次项的系数
        R=[n]+R
        T1=[0]*(d-i)+[n]#对得到的商补若干个0
        T2=multiply_poly(T1,L2)#商乘以除数结果为T2
        T=subtract_poly(T,T2)#被除数减去T2
        T=T[:len(T)-1]#切片,被除数减少一次方
    return R,T

while True:
    L1=input("\n请输入一个多项式L1的系数,低次在前,空格隔开")
    L1=L1.split(" ")
    L1=[int(e) for e in L1]
    L2=input("请输入一个多项式L2的系数,低次在前,空格隔开")
    L2=L2.split(" ")
    L2=[int(e) for e in L2]
    print("L1+L2:",add_poly(L1,L2))
    print("L1-L2:",subtract_poly(L1,L2))
    print("L1*L2:", multiply_poly(L1,L2))
    print("L1/L2:",divide_poly(L1,L2))


    

 

  • 11
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值