多项式的各种操作

本文详细介绍了多项式的逆元、除法、牛顿迭代等概念及其计算方法,包括非暴力求逆元的倍增技巧、多项式取模和多项式牛顿迭代法的实现,旨在深入理解多项式操作的本质。
摘要由CSDN通过智能技术生成

多项式的各种操作

By SemiWaker

目录

  • 多项式乘法点这里
  • 多项式逆元
  • 多项式除法
  • 多项式牛顿迭代法
  • 多项式对数
  • 多项式指数函数
  • 多项式幂函数
  • 多项式三角函数
  • 多项式多点求值
  • 多项式快速插值

多项式逆元

定义

A(x)A1(x)1(modxn)

  • A(x):要求逆元的多项式
  • A1(x) :多项式 A(x) 的逆元
  • (modxn) :在模 xn 的意义下。 xn 是一个多项式,不是一个数。
    xn 的意义类似数的除法:设 a=bd+r ,且 r<b ,那么有 ar(modb) 。在多项式中,只要r的界比b的界小就好了。
    多项式除法要用多项式逆元,但是多项式逆元的定义又是多项式除法,这里先介绍多项式逆元,所以除法部分简单略过
    xn 比较特殊,因为 xn 实际上就是舍弃掉 n 次的所有项,只剩下 0 到 n-1次的项。
    (原因显然 N1i=0aixi=xnNn1i=0aixi+n1i=0aixi
    为什么要模 xn 呢?
    因为如果不模的话,除了只有常数项的多项式以外,其他多项式的逆元都是无穷级数。
    例: 1+2x+3x2 。为了方便我们只写系数数列,从次数小的开始。
    可以写成 1 1 1 。
    设这个数列是 ai ,然后设逆元的系数数列是 bi ,最后设它们乘起来是 ci
    根据定义, ci 满足 c0=1 i>0,ci=0
    然后我们考虑这个的逆元会是什么。
    显然 b0=1
    然后 c1=a0b1+a1b0 ,可以解出 b1=1
    然后 c2=a0b2+a1b1+a2b0 ,可以解出 b2=0
    依次类推 b3=1 b4=1 ……
    发现无论如何都有非0项存在,所以是无穷级数。
    xn 之后就可以解决这个问题,我们就可以只求我们需要的前n项。

做法

暴力做法

上面举例为什么一定要模 xn 的时候,已经给出了暴力做法了。
直接递推,时间复杂度 O(n2)

非暴力:

基本思路:倍增
只有常数项的多项式求逆元是比较简单的事,即普通的求逆元。
然后考虑怎么让已经求出的多项式翻倍,也就是倍增的思路。

首先,我们设长度为 n2 的已经求出的逆元为B(x)。
注意,是向上取整。
向上取整的好处是:翻倍后保证长度 n

A(x)B(x)1(modxn2)

然后直接设当前求的逆元为 A1(x)
A(x)A
  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,我来设计一个简单的一元稀疏多项式计算器。首先,我们需要定义一个存储一元稀疏多项式的链表节点,包括该项的系数和指数,可以定义如下: ``` class PolyNode: def __init__(self, coef=0, exp=0): self.coef = coef self.exp = exp self.next = None ``` 然后,我们可以定义一个一元稀疏多项式类,该类包括多项式的头节点和一些基本操作,如多项式的加、减、乘、求导等等,具体实现如下: ``` class SparsePoly: def __init__(self): self.head = PolyNode() # 添加一项到多项式 def add_term(self, coef, exp): if coef == 0: return node = PolyNode(coef, exp) cur = self.head while cur.next and cur.next.exp > exp: cur = cur.next if cur.next and cur.next.exp == exp: cur.next.coef += coef if cur.next.coef == 0: cur.next = cur.next.next else: node.next = cur.next cur.next = node # 多项式加法 def __add__(self, other): res = SparsePoly() cur1, cur2 = self.head.next, other.head.next while cur1 and cur2: if cur1.exp > cur2.exp: res.add_term(cur1.coef, cur1.exp) cur1 = cur1.next elif cur1.exp < cur2.exp: res.add_term(cur2.coef, cur2.exp) cur2 = cur2.next else: res.add_term(cur1.coef + cur2.coef, cur1.exp) cur1, cur2 = cur1.next, cur2.next while cur1: res.add_term(cur1.coef, cur1.exp) cur1 = cur1.next while cur2: res.add_term(cur2.coef, cur2.exp) cur2 = cur2.next return res # 多项式减法 def __sub__(self, other): res = SparsePoly() cur1, cur2 = self.head.next, other.head.next while cur1 and cur2: if cur1.exp > cur2.exp: res.add_term(cur1.coef, cur1.exp) cur1 = cur1.next elif cur1.exp < cur2.exp: res.add_term(-cur2.coef, cur2.exp) cur2 = cur2.next else: res.add_term(cur1.coef - cur2.coef, cur1.exp) cur1, cur2 = cur1.next, cur2.next while cur1: res.add_term(cur1.coef, cur1.exp) cur1 = cur1.next while cur2: res.add_term(-cur2.coef, cur2.exp) cur2 = cur2.next return res # 多项式乘法 def __mul__(self, other): res = SparsePoly() cur1 = self.head.next while cur1: cur2 = other.head.next while cur2: coef = cur1.coef * cur2.coef exp = cur1.exp + cur2.exp res.add_term(coef, exp) cur2 = cur2.next cur1 = cur1.next return res # 多项式求导 def derivative(self): res = SparsePoly() cur = self.head.next while cur: coef = cur.coef * cur.exp exp = cur.exp - 1 res.add_term(coef, exp) cur = cur.next return res # 打印多项式 def __str__(self): if not self.head.next: return "0" res = "" cur = self.head.next while cur: if cur.coef > 0 and res: res += "+" res += str(cur.coef) if cur.exp > 1: res += "x^" + str(cur.exp) elif cur.exp == 1: res += "x" cur = cur.next return res ``` 以上就是一个简单的一元稀疏多项式计算器的实现。你可以通过定义两个多项式对象,然后进行加减乘等操作,最后打印结果来测试程序的正确性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值