这个的后半部分似乎可以当做金策大佬论文的人话解读。
推销一下窝的博客 , 本文所有的代码都在窝的博客上。
多项式主要的用途是用来优化式子,因为笔者也刚刚入门多项式,可能谈到的内容也十分浅,有错请直接开 D。
我们从大整数乘法入手,我们经常写的算法是通过枚举两个整数的每一位,通过位权来更新答案,这里显然是
我们直接分治可以算出答案复杂度
复杂度怎么算?
之后我们考虑优化
主定理:
但是我们可以我们 FFT 将系数表示法变成点值表示法,从而得到答案复杂度
我们常用的表示法是系数表示法
DFT 就是把一个多项式从系数转化成点值,IDFT 反之。
FFT
对于两个个点值表示法的多项式
设
但是直接暴力 DFT,IDFT 是
我们发现
在一个复平面上,以原点为圆心,1 为半径作圆,所得到的圆就是单位圆,将其 n 等分( n 等分点就是终点),形成 n 个向量,设幅角为正且最小的向量
剩下的复数为
单位根的幅角为周角的
证明考虑将其展开
将左边的那项展开得到
证明考虑,复数相乘,幅角相加,模长为
因为都是单位根
首先我们先假设一个多项式的系数 假设 n 为偶数
$$
A(x)=a_0+a_1x+a_2{x^2}+a_3*{x^3}+a_4*{x^4}+a_5*{x^5}+ \dots+a_{n-2}*x^{n-2}+a_{n-1}*x^{n-1}
$$
我们把它的下标按奇偶性分类
所以我们可以得到
所以我们可以将其分成两部分进行递归,也就是
但是根据主定理,这是
我们考虑
所以可以化简
发现只要知道了 RHS 就可以直接求出, 复杂度为
这叫蝴蝶变换
这里就只想结论
其中
发现
所以我们只要用 FFT 之后再将数组反过来就可以了
递归形式的 FFT
我们发现原来的每一个位置,在结束之后会变成其的反序
具体来说
1 | 原来的序列: 000 001 010 011 100 101 110 111 |
我们考虑求出最终的位置,之后再倒序回去,因为
1 | i 和 i / 2 的关系: |
1 | for(int i = 0; i < lim; ++ i) |
最后我们考虑蝴蝶操作过程
之后我们一层层向上递推就可以了
NTT
我们发现 FFT 的精度其实不是很够,最多处理
常用的模数是:
因为他们的原根都是 3。(这里的模数都是常在 3% NTT 中使用的)
3 模数 NTT
我们考虑如果模数不支持 NTT 怎么办?我们可以自己定模数,只要保证答案符合(大于)范围即可。
其实很简单,就是用 3 个模数做一遍 NTT 之后 CRT 合并即可,用的就是之前说的模数。
MTT
我们考虑如果模数不支持 NTT 而且还卡常怎么办?虽然说 NTT 跑得很快,如果码力不行怎么办?用 MTT。
这里其实有点争议,就是 3% NTT 到底算不算 MTT。
本文只介绍一种最简单的,但是最常用的优化。
我们考虑进行 FFT 的时候我们用到了复数。那么我们为什么不把一个多项式的系数拆成几的部分分别进行处理,这样就可以保证精度。
假设我们要求
我们考虑将系数拆成两部分
之后我们考虑通过复数来表示,设
这样我们可以先通过 FFT 之后再将其表示成答案的形式,最后在计算。
但是我们发现,需要表示之前的式子需要
表示 F 的共轭复数。
那么我们来证明一个东西。我们不妨记
用
之后我们考虑能不能将 Q 用 P 表示出来,我们考虑将 Q 进行展开。
这里有两个细节,我们一开始是将两个式子都展开,之后通过欧拉定理进行展开,猜测两个数是共轭质数。
这里变成共轭的时候,将 cos 部分变成负数。
我们考虑一个更加普通的形式对于一个
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 (img-pQ3sobeh-1618049627378)(https://z3.ax1x.com/2021/04/10/cabTrq.png)]]
可以发现其在轴上的对应点就是
之后将其展开也是同理,可以得到
但是我们计算答案的时候可没有负的指数,我们可以用
这样我们就证明了
所以我们总共只需要进行 4 次 FFT 就可以得到答案了。
多项式求逆
我们需要求
考虑使用递归解决,假设我们已经得到
我们需要求
可以得到
考虑将两个式子进行相减来消除 1
因为
这样递归去做就可以了。
多项式 Ln
需要求
我们考虑直接进行 exp 发现我们还没学过
那么能消去 Ln 的还有什么呢? 求导!
之后又手就行。
多项式 Exp
需要求
我们优先考虑 Ln 转换成
我们考虑将之前的式子变换得到
我们设函数
然后考虑带入之前的式子
这里说明一下
之后有手就行。
多项式开根
我们需要求
还是考虑消元
还是很简单。
多项式除法
给定多项式
求出多项式 使得 。
其中
的次数为 的次数为 。
可以想到如果没有余数的话,我们直接用多项式求逆就可以水掉。
因为这是个多项式,我们考虑将 R 给消掉,然后就可以与愉快得求逆了。
考虑构造 4 个多项式,满足
那么我们得到
之后我们求出了
很简单。
这边之后还会更新。