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

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


多项式

多项式是个啥呢?
我们通常说的都是一元的多项式,所以一个多项式可以写成形如:
\(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]\)
那么括号里面的即为所求。
当其只有一项的时候,只需要在模意义下做二次剩余即可。

(未完待续)

原文地址:https://www.cnblogs.com/gzy-cjoier/p/8451245.html

时间: 2024-10-07 21:33:05

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

多项式相关——FFT(学习中……持续更新)

FFT 参考blog: 十分简明易懂的FFT(快速傅里叶变换) 快速傅里叶变换(FFT)详解 系数表示法 一个一元\(n\)次多项式\(f(x)\)可以被表示为:\[f(x) = \sum_{i = 0}^{n}a_{i}x^{i}\] 即用\(i\)次项的系数来表示\(f(x)\),展开就是\(f(x) = {a_{0}, a_{1}...a_{n}}\) 点值表示法 把多项式看做一个函数,然后带入\(n\)个不同的\(x\),可以得到\(n\)个不同的\(y\),每对\((x, y)\)就组

多项式总结(持续更新)

多项式的一堆乱七八糟的操作学了一部分了--(多点求值和快速插值还没有) 打算写下来整理一下.不过因为还有一些没学的以及没完全理解的--只好先持续更新了. 不扯淡了,直接开始. 1.NTT FFT咱就不说了,有兴趣可以看兔哥博客. NTT和FFT很相似.但是因为FFT涉及到复数运算所以会有一些精度误差,然后有的时候也会遇到需要取模的情况--于是快速数论变换NTT应运而生.因为单位根和原根有相似的性质,所以NTT使用原根取代了单位根进行运算.模数998244353的原根是3,每次取原根的\(\fra

自己总结的 iOS ,Mac 开源项目以及库,知识点------持续更新

自己在 git  上看到一个非常好的总结的东西,但是呢, fork  了几次,就是 fork  不到我的 git 上,干脆复制进去,但是,也是认真去每一个每一个去认真看了,并且也是补充了一些,感觉非常棒,所以好东西要分享,为啥用 CN 博客,有个好处,可以随时修改,可以持续更新,不用每次都要再发表,感觉这样棒棒的 我们 自己总结的iOS.mac开源项目及库,持续更新.... github排名 https://github.com/trending,github搜索:https://github.

( 译、持续更新 ) JavaScript 上分小技巧(二)

考虑到文章过长,不便于阅读,这里分出第二篇,如有后续,每15个知识点分为一篇... #29 - 使用缓存的记忆让递归函数加速运行波非那切数列(Fibonacci sequence)想必大家都不陌生(针对学霸而言,在这之前本兽完全不知道这是个什么鬼,虽然经常会用到递归),我们可以在20秒内写出以下的函数: var fibonacci = function(n){ return n < 2 ? n : fibonacci(n-1) + fibonacci(n-2); } 它确实是运行了,但是效率并不

关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】

最近一直用ASP.NET MVC 4.0 +LINQ TO SQL来开发设计公司内部多个业务系统网站,在这其中发现了一些问题,也花了不少时间来查找相关资料或请教高人,最终都还算解决了,现在我将这些问题及对应的解决方案都整理汇总出来,供大家参供,有不对之处或有更好的解决办法,欢迎在本文评论,谢谢! 问题一:执行类似语句:dbDataContext.TableName.Join(modelList as List<实体对象类型>,t1=>t1.id,t2=>t2.id,(t1,t2)=

【持续更新】JavaScript常见面试题整理

[重点提前说]这篇博客里的问题涉及到了JS中常见的的基础知识点,也是面试中常见的一些问题,建议初入职场的园友Mark收藏,本文会持续更新~ 1. 引入JS的三种方式 1.在HTML标签中直接使用,直接内嵌JS(但是不提倡使用): >>>不符合W3C关于内容和行为分离的要求: 2.在HTML页面中使用<scrip> </script>标签包裹JS代码: >>>script标签可以放到页面的各种位置: 3.引入外部的JS文件使用<script&

GSS - Can you answer these queries I ~ ? (持续更新...)

GSS - Can you answer these queries I ~ ? (持续更新...) \(\text{SPOJ}\) 毒瘤的 数据结构系列, 值得一做 GSS I : 给定一数列\(A\), 支持查询区间最大子段和 \(A[i] \le 15007,\ N\le 5e4\) 线段树常规做法 : //知识点:线段树 /* By:Luckyblock */ #include <cstdio> #include <cctype> #include <algorith

哪还有卖115资源的—持续更新

[十 薇:T77554][诚信经营][持续更新][品种繁多][任意挑选][质量有保障] HashMap 面试题,看这一篇就够了! ? structures Chat 作者 来自某BAT互联网大厂的一枚程序员,注重总结.分享和自我成长. 长期不间断的投资自己,未来可期. ? 在程序员这一职业中,集合是我们使用频率相当高的一个工具,而其中的 HashMap,则更是我们用以处理业务逻辑的好帮手,同时 HashMap 的底层实现和原理,也成了面试题中的常客. 还在担心面试中被问到 HashMap.Has

功能使用来源(持续更新)

从开始编写项目到现在,用过好多插件,但是有的时候用过后,时间一长就会忘记,这里我整理一下,以防忘记,我会持续更新的!!! 图表类: Jfreechart 适合java和jsp使用 界面差,不易维护,说白了,显示的就是一张图片: highcharts web使用,js插件,界面绚丽,官网有好多demo(当时没有找到这个,于是用的jfreechart...): echarts 近期找到的,百度制作,叫百度图说,我很看好这个,下次如有需要制作图表的时候,我一定用这个!!!这个也有好多的demo,我看了