多项式的各种运算总结(持续更新)

多项式的各种运算总结(持续更新)

标签: 多项式开方 多项式求逆


多项式

多项式是个啥呢?
我们通常说的都是一元的多项式,所以一个多项式可以写成形如:
\(a_ 0+a_ 1x+a_ 2x^2+a_ 3x^3......\)的式子
注意到,真正有用的是数列\(\{a_i\}\)
但是一旦我们要涉及到什么运算,就会发现对于\(\{a_i\}\)的某些运算不是特别方便。
所以我们定义生成函数\(A(x)=\sum_{i=0}^{\infty}a _ix^i\)\(A(x)\)就称为数列\(\{a _i\}\)的生成函数。
通过生成函数,我们可以重新定义对于数列的一系列运算。

相等

对于数列来说,相等的条件是数列的每一项都相等。
但是对于生成函数来讲,对于任意\(x\in C\)都有\(A(x)=B(x)\),那么有多项式\(A(x)=B(x)\)

加法

对于数列来说,加法就是数列的每一项都做加法。
但是对于生成函数来讲,对于任意\(x\in C\)都有\(C(x)=A(x)+B(x)\),那么有多项式\(C(x)=A(x)+B(x)\)

讲了这么多,是不是感觉很没用,too young too simple啊,接下来看点有用的。

乘法

假如数列\(\{c_i\}\)是数列\(\{a _i\},\{b _i\}\)相乘的结果,
那么有\(c_i=\sum_{j=0}^ia _jb_{i-j}\)
注意到直接计算的复杂度是\(O(n^2)\)的。
这时候,就需要用到生成函数了。
显然,对于任意\(x \in C\),都有\(C(x)=A(x)B(x)\),那么多项式\(C(x)=A(x)B(x)\)
借用方程的思想,如果我们知道了这个多项式n+1个点的值,那么就可以确定这个多项式的前n+1项。(假设其他项都为0)
所以现在的问题是,怎么快速的计算这n+1个点的值。
由于点是我们随便取得,我们可以通过取一些特殊的点来达到这个目的。
不妨取1的n次负根的各个次幂,设\(w_ n\)表示1的n次复根,我们分别取\(w_ n^0,w_ n^1,......w_ n^{n-1}\)
对于这些点来说,有一些奇怪的性质。

  1. \(w_ {2n}^{2k}=w_ n^k\)
  2. \(w_ {2n}^{k}=-w_ {2n}^{k+n}\)

这有什么用呢,
假如要求一个多项式\(A(x)=\sum_{i=0}^{2n-1}a _ix^i\)\(w _{2n}^k(k\in[0,2n))\)代入的结果
我们可以利用分治的思想,先求出\(B(x)=\sum_{i=0}^{n-1}a _{2i}x^i,C(x)=\sum _{i=0}^{n-1}a _{2i+1}x^i\)\(w _{n}^k(k\in[0,n))\)代入的结果。
接下来,对于任意一个\(A(w _{2n}^k)\),都能表示成\(B,C\)两个多项式的和。

我们只需要对k讨论即可。
假如\(k < n\),那么\(A(w _{2n}^k)\)=\(B(w _n^k)+w _{2n}^kC(w _n^k)\)
假如\(k >= n\),那么\(A(w _{2n}^k)\)=\(B(w _n^{k-n})-w _{2n}^{k-n}C(w _n^{k-n})\)

这样,复杂度\(T(n)=O(n)+2T(n/2)\)
最终复杂度为\(O(nlogn)\)

我们现在已经将多项式转化成了点值,如果想将点值重新转化成多项式,只需要再做一次逆矩阵的乘法即可。
实现的时候还需要注意,因为分治严格的分成了两份,所以一开始先要把n变为2的幂,然后才能做分治。

除了整个复数域都可以,模意义下也可以进行多项式的乘法。
可以注意到,原根有着与上面一样的性质。
模意义下,显然有\(x^{p-1 \over 2}=-1\)(x为p的原根,p为质数)
于是在模意义下也可以进行多项式乘法。

求逆

对多项式而言,两个多项式相乘等于单位多项式,那么这两个多项式互逆。
显然,单位多项式的条件是任何多项式乘以单位多项式都为原来的多项式。
不难发现这样的多项式是\(F(x)=1\)
写成数学符号:若\(A(x)B(x)=1\),则\(A,B\)两个多项式互逆。
当然,一般情况下几乎都是在模意义下进行,而且只关注前n项的值。
和乘法类似,求逆也需要用到分治的方法。
\(A(x)B(x)=C(x)\ \ \ [n]\)代表\(A(x)与B(x)的乘积在前n项的结果与多项式C(x)的前n项相同\)

假如有\(A(x)C(x)=1 \ \ \ \ [{n \over 2}]\)
我们需要知道\(B(x)C(x)=1 \ \ \ \ [n]\)
相减得\((B(x)-A(x))C(x)=0 \ \ \ \ [n \ over 2]\)
显然\(C(x)\)不等于0.
所以\(B(x)-A(x)=0 \ \ \ \ \ \ [{n \over 2}]\)
但是我们需要求的是前n项的,所以我们可以对上面这个式子平方。
如果一个多项式前\({n \over 2}\)项都是0,那么平方之后前\(n\)项应该都是0.
\((B(x)-A(x))^2=0 \ \ \ \ [n]\)
$A(x)^2-2A(x)B(x)+B(x)^2=0     [n] $
移项,得\(B(x)^2=2A(x)B(x)-A(x)^2\)
\(B(x)=2A(x)-{A(x)^2 \over B(x)}\)
又有\(B(x)C(x)=1 [n]\)
分母分子同时乘上\(C(x)\),
\(B(x)=2A(x)-A(x)^2C(x)\)
当n=1时,显然可以直接求逆元。

复杂度\(T(n)=T(n/2)+O(nlogn)\)

开方

即求\(B(x)^2=C(x)\ \ \ \ [n]\)
借用刚才的思路,我们先求出\(A(x)^2=C(x)\ \ \ \ [{n \over 2}]\)
\(B(x)^2-A(x)^2=0 \ \ \ \ [{n \over 2}]\)
\((B(x)^2-A(x)^2)^2=0 \ \ \ \ [n]\)
那么 \(A(x)^4-2A(x)^2B(x)^2+B(x)^4 =0\ \ \ \ \ [n]\)
\(B(x)^2={A(x)^4+B(x)^4 \over 2A(x)^2}[n]\)
\(2B(x)^2={(A(x)^2+B(x)^2)^2 \over 2A(x)^2}[n]\)
\(B(x)^2=({A(x)^2+B(x)^2 \over 2A(x)})^2[n]\)
\(B(x)^2=({A(x)^2+C(x) \over 2A(x)})^2[n]\)
那么括号里面的即为所求。
当其只有一项的时候,只需要在模意义下做二次剩余即可。

(未完待续)

转载于:https://www.cnblogs.com/gzy-cjoier/p/8451245.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值