引言
史诗级巨坑填完再划
主要参考资料:
(和一些奇奇怪怪的东西
预备知识
多项式
定义
(参见初中人教版七年级上课本)
系数表示法
将的每一个 前的系数提取出来看作一个维向量
此向量$\vec{a}$就是$P(X)$的系数表示法的向量。
点值表示法
对于这个多项式若我们不知道它的系数,我们可以用采样的方式将一组插值节点$(x_0,x_1,\cdot\cdot\cdot,x_n)$代入上式
得到$n+1$个不同的结果$(y_0,y_1,\cdot\cdot\cdot,y_n)$,就可以唯一确定这个多项式.
点值表示法正确性的证明
证明:
假设原命题不成立即存在两个不同的多项式$A(x),B(x)$在$\forall i\in[0,n]$,都有$A(x_i)=B(x_i)$
那么假设用$A(x_i)-B(x_i) = H(x_i) = 0$,那么$H(x_i)$有$(n+1)$个根,这与$n$次多项式只有$n$个根的代数基本定理相矛盾,矛盾!故假设不成立!
$\therefore$原命题正确性显然.
而$FFT$就是利用了点值和系数表示之间的关系,在快速求点值来表示系数,搭起这两个变换的桥梁.
多项式的乘除法
乘法:叫做卷积,也作奆积。形象地可以写成:
用这个公式不难得到一个$O(n^2)$的算法.
除法:就是大除法,小学/初中奥数部分不赘述了.
单位根及其性质
证明一:
由几何意义,这两者表示的向量终点是相反的,左边较右边在单位圆上多转了半圈。
证明二:
由计算的公式:
最后一步由三角恒等变换得到。
FFT(法法塔)
但是这样的操作常数爆炸..FFT本身的常数就很奆..
观察分组情况
1 | //递归爆栈 LUOGU热掉77分 |
递归爆栈..没话说了.
改迭代
1 |
|
所以说算是差不多学会了FFT
上道题目
大整数乘法用FFT来跑
其实就是规定了$x=10$的FFT.
注意前导0的处理,具体实现看代码.
1 |
|
NTT
$NTT$就是快速数论变换,是FFT的虚部变成非浮点而改为Mod一个值的应用.
实部是可以不管的.我们的重点是把虚部转化为其他便于计算的东西.
掌握了关于原根的知识后。就可以得到
所以这个形式只能满足一部分形如$2^n*p+1$的质数,这种质数因为满足费马小定理$a^p\equiv{1}\mod{p}$
叫做费马质数。
1 | //只能Mod费马质数的NTT |
那么如果不是费马质数
取一个任意的数取模
岂不是要$gg$
因为MYY在论文中提出三次求Mod再CRT(China Remainder Theorem)的做法
就被称为MTT了(雾
模板题
1 | //对于任意Mod的NTT |