多项式的基本运算(FFT和NTT)总结
设参与运算的多项式最高次数是n,那么多项式的加法,减法显然可以在O(n)时间内计算。
所以我们关心的是两个多项式的乘积。朴素的方法需要O(n^2)时间,并不够优秀。
考虑优化。
多项式乘积
方案一:分治乘法。
对于多项式X,Y,假设各有2m项,(即最高次数是2m-1)
X,Y分别可以用两个含m项的多项式来表示,即:

则

由此可见,为了计算XY,只需计算出AC, (A+B)(C+D), BD,然后用多项式加减法求得XY即可。
设含有m项的多项式相乘的时间为T(m)
则

于是容易算出时间复杂度是
,约等于
以上方法的优点在于,代码难度低,思维难度低,多项式系数任意,对运算没有任何限制。
缺点在于:太慢了!
方案二:FFT / NTT
这种方法除了快之外,没有任何优点。但仍是一种好方法。
FFT的详细推导不再描述,这里只是简单的总结。
对于多项式乘法,有一种思路,
a. 是先从系数表示法转换为点值表示法,
b. 然后乘起来(得到乘积式的点值表示法),
c. 最后从点值表示法转变回系数表示法。
对于操作a,很容易做到O(n^2),
对于操作b,很容易做到O(n),
对于操作c,用高斯消元可以做到O(n^3),用拉格朗日插值法可以做到O(n^2)。
FFT则是利用了单位根的性质,将操作a和操作c优化到了O(nlogn)。
虽然在复数域中永远存在单位根,但是容易出现精度问题。
NTT并没有用复数域的单位根。
当某两个多项式相乘,系数对某一模数取模的时候,必须存在2^k次(2^k>=2n)单位根,且必须存在2的逆元。
当模数p是形如 998244353 的质数时,998244353 = 7 × 17 × 2^23 + 1,( 2^k | phi(p) )
设p的原根是g,则模p意义下,2^k次单位根是
。
当模数并不是满足要求的模数,我们可以知道,一次多项式乘法的结果,每一位上的数不超过n*p*p。
我们可以取多个不同的NTT模数,使得它们的乘积大于n*p*p。对每一个NTT模数做一次多项式乘法,最后用中国剩余定理计算即可。
多项式求逆
我们定义多项式A的乘法逆元B,满足A*B=1。
多项式求逆能解决多项式除法等一系列问题,因为X/Y=X*Y的逆元。
我们首先证明,多项式A存在乘法逆元的充要条件是A的常系数存在逆元。
必要性显然,因为A的常数项*B的常数项=1。
由此,我们可以求出B的常数项,接着推出一次项系数,二次项系数...
所以乘法逆元存在且唯一,充分性同样显然。
为了求逆元,一种方法是O(n^2),即先求常数项,再推出一次项系数,继续推完整个多项式。
还有一种用O(nlogn)时间计算乘法逆元的方法,
先求出A(x)的常数项的逆元b,初始化B(x)=b,则

多项式的基本运算(FFT和NTT)总结的更多相关文章
- 多项式乘法,FFT与NTT
多项式: 多项式?不会 多项式加法: 同类项系数相加: 多项式乘法: A*B=C $A=a_0x^0+a_1x^1+a_2x^2+...+a_ix^i+...+a_{n-1}x^{n-1}$ $B=b ...
- 洛谷 - P3803 -【模板】多项式乘法(FFT) - NTT
https://www.luogu.org/problemnew/show/P3803 看别人偏偏就是要用NTT去过.实验证明大概是这样用.求0~n的多项式和0~m的多项式的乘积.注意MAXN取值.A ...
- FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...
- 多项式fft、ntt、fwt 总结
做了四五天的专题,但是并没有刷下多少题.可能一开始就对多项式这块十分困扰,很多细节理解不深. 最简单的形式就是直接两个多项式相乘,也就是多项式卷积,式子是$N^2$的.多项式算法的过程就是把卷积做一种 ...
- 「学习笔记」FFT及NTT入门知识
前言 快速傅里叶变换(\(\text{Fast Fourier Transform,FFT}\) )是一种能在\(O(n \log n)\)的时间内完成多项式乘法的算法,在\(OI\)中的应用很多,是 ...
- FFT和NTT学习笔记_基础
FFT和NTT学习笔记 算法导论 参考(贺) http://picks.logdown.com/posts/177631-fast-fourier-transform https://blog.csd ...
- fft,ntt总结
一个套路:把式子推成卷积形式,然后用fft或ntt优化求解过程. fft的扩展性不强,不可以在fft函数里多加骚操作--DeepinC T1:多项式乘法 板子题 T2:快速傅立叶之二 另一个板子,小技 ...
- FFT与NTT专题
先不管旋转操作,考虑化简这个差异值 $$begin{aligned}sum_{i=1}^n(x_i-y_i-c)^2&=sum_{i=1}^n(x_i-y_i)^2+nc^2-2csum_{i ...
- 洛谷P3803 【模板】多项式乘法(FFT)
P3803 [模板]多项式乘法(FFT) 题目背景 这是一道FFT模板题 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: ...
随机推荐
- C++之异常捕获和处理
一.简介 在C++语言中,异常处理包括:throw表达式,try语句块,一套异常类.其中,异常类用于在throw表达式和相关的catch子句之间传递异常的具体信息.exception头文件定义了最 ...
- 20162323周楠《Java程序设计与数据结构》第六周总结
学号 2016-2017-2 <程序设计与数据结构>第六周学习总结 教材学习内容总结 继承:从已有类派生一个新类,是面向对象程序设计的一个特点 在Java中只支持单继承,不支持多继承 继承 ...
- 201621123057 《Java程序设计》第7周学习总结
1. 本周学习总结 1.1 思维导图:Java图形界面总结 1.2 可选:使用常规方法总结其他上课内容. 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 答: ...
- 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)
标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象 ...
- linux服务器操作系统,在相同环境下,哪个做lamp服务器更稳定点?哪个版本更稳定?
随着国内WEB服务越来越多,如何才能选择一个合适的linux服务器操作系统?在国内用的最多的好像是红帽子系列也就是red hat系列,但有些版本缺乏稳定性.新手在选择操作系统的时候最好只用偶数版本,还 ...
- webview缓存及跳转时截取url地址、监听页面变化
缓存及一些设定 我在做一些项目时,h5做的项目手机浏览器能使用,但是在搬到webview时候不能用,这个时候通过查阅资料,原来是webview没有设定好,包括缓存.缓存大小及路径等等 mWebview ...
- Python习题(第一课)
想了想其他的太简单了,还是不放了,剩三题吧. 一.完美立方 编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a^3= b^3 + c^3 + d^3,其中 ...
- TFTP通信原理
TFTP的通信流程 TFTP共定义了五种类型的包格式,格式的区分由包数据前两个字节的Opcode字段区分,分别是: · l 读文件请求包:Read request,简写为RRQ,对应Opcode字段值 ...
- Oracle 存储过程简单语法
一.无参数的存储过程 --创建存储过程create or replace procedure getdate as datetime varchar2(); begin select to_char( ...
- JSON(一)——JSON与JavaScript的关系
JSON是一种轻量级的数据交换格式,全称--JavaScript 对象表示法(JavaScript Object Notation). 类比XML,你可以把JSON看作是一种存储数据的格式类型,一种数 ...