设参与运算的多项式最高次数是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)总结的更多相关文章

  1. 多项式乘法,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 ...

  2. 洛谷 - P3803 -【模板】多项式乘法(FFT) - NTT

    https://www.luogu.org/problemnew/show/P3803 看别人偏偏就是要用NTT去过.实验证明大概是这样用.求0~n的多项式和0~m的多项式的乘积.注意MAXN取值.A ...

  3. FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)

    前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...

  4. 多项式fft、ntt、fwt 总结

    做了四五天的专题,但是并没有刷下多少题.可能一开始就对多项式这块十分困扰,很多细节理解不深. 最简单的形式就是直接两个多项式相乘,也就是多项式卷积,式子是$N^2$的.多项式算法的过程就是把卷积做一种 ...

  5. 「学习笔记」FFT及NTT入门知识

    前言 快速傅里叶变换(\(\text{Fast Fourier Transform,FFT}\) )是一种能在\(O(n \log n)\)的时间内完成多项式乘法的算法,在\(OI\)中的应用很多,是 ...

  6. FFT和NTT学习笔记_基础

    FFT和NTT学习笔记 算法导论 参考(贺) http://picks.logdown.com/posts/177631-fast-fourier-transform https://blog.csd ...

  7. fft,ntt总结

    一个套路:把式子推成卷积形式,然后用fft或ntt优化求解过程. fft的扩展性不强,不可以在fft函数里多加骚操作--DeepinC T1:多项式乘法 板子题 T2:快速傅立叶之二 另一个板子,小技 ...

  8. 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 ...

  9. 洛谷P3803 【模板】多项式乘法(FFT)

    P3803 [模板]多项式乘法(FFT) 题目背景 这是一道FFT模板题 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: ...

随机推荐

  1. 每日冲刺报告——Day3(Java-Team)

    第三天报告(11.4  周六) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://git ...

  2. 201621123031 《Java程序设计》第3周学习总结

    Week03-面向对象入门 1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系 ...

  3. python 进程复习

    import os import time ret = os.fork() # 创建子线程 if ret ==0: # 子进程中返回值为0,父进程>0 while True: print('.. ...

  4. 如何用tomcat实现类似weblogic那样的热部署方式

    平时weblogic部署程序包时一般是到控制台去部署,不需要重启. 相反之前用tomcat部署应用时,我一般都是把tomcat重启来完成程序包的更新或新包部署.但是这次要部署的应用有点多,大概10几个 ...

  5. vue中一个dom元素可以绑定多个事件?

    其实这个问题有多个解决方法的  这里提出两点 第一种 第二种 现在dom上绑定一个 然后在你的methods中直接调用 如果要传参数  这时候千万别忘记 原创 如需转载注明出处 谢谢

  6. STL之queue

    描述 使用STL中的queue,完成入队.出队.获取队首.获取队尾等基本操作. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { queue<int> ...

  7. Python 列表嵌套多种实现方式

    #coding=utf-8 list=[] for i in range(1,101): list.append(i) # print(list) tempList=[] newList=[] whi ...

  8. MongoDb进阶实践之五 MongoDB修改命令详述

    一.引言         上一篇文章我们已经详细介绍了MongoDB数据库的有关查询的内容,但是这只是所有查询命令的冰山一角.所有查询命令都写完也没有必要,我只是写了一些常用的命令,对MongoDB的 ...

  9. Docker学习笔记 - 在运行中的容器内启动新进程

    docker psdoker top dc1 # 容器情况# 在运行中的容器内启动新进程docker exec [-d] [-i] [-t] 容器名 [command] [args]docker ex ...

  10. 实现GridControl的行单元格非顺序跳转

    用GridControl控件添加数据的时候发现,有一些字段过多但是并不是每个字段都需要用户输入,每个单元格都回车跳转的时候不仅浪费时间,而且用户体验也不好,就需要单元格跳转的时候,不需要的字段可以隔过 ...