正题
NTT
假设给出两个多项式,求他们的傅里叶卷积是及其简单的。
但是如果这两个多项式的值域为P,那么在运算的过程中,某一位的最大值是
,因为FFT本身自带一个limit。
所以当
的时候,
,很明显会爆long double.
通常这类问题他还会教你mod一个质数。 怎么做?
首先考虑FFT中的
替换成q,可以使得
。
考虑模mod意义下原根a,因为原根a的阶
。
所以不存在一个
,使得
。
q就显然等于
。因为只有这样,才能使得它有上面那个性质,而且和
的性质相似。
当做idft的时候,就使
就可以了。
所以这个质数要拥有的性质是
,而且这个q要尽量大,至少
。
MTT
那么当这个不是一个质数,或者没有NTT模数的性质呢?
考虑我们是因为什么才使用NTT的?没错,是因为它的乘积太大了。
FFT怎么避免这种问题?
拆分FFT(MTT)
我们对第一个多项式的每一项拆成
的形式,对于第二多项式的每一项拆成
的形式。
所以:
。
我们做四次多项式乘法然后合并就可以了。可以知道,现在FFT过程中的最大值可能超过
,所以采用long double进行存储就可以了,对某些数据比较水的直接double即可。
多项式求逆
再讲一下多项式求逆。
就是已知一个多项式P,要找到一个G,使得
。
的意思就是把第n位和后面砍掉。
使得这两个多项式相乘mod一个数之后,砍掉第n位以后的数位只有常数项剩下一个1.
假设我们已知
。
明显
那么根据多项式的分配律,我们知道
。
接着,因为P不为0,所以
所以,我们知道
的第0项到第
项,都为0.
两边同时平方,就可以得到
因为平方之后的
项,必定为0。考虑第i项从
转移过来,就可以知道转移到
项的二元组必定有一个位置
,证毕。
展开之后,乘上F可以得到
。
又因为
可以得到
。
移项就可以得到
。
用FFT,MTT,或者NTT求就可以了。
是不是加强版都是这样。
现在我们只需要递归就可以了,直到
的时候,直接令
就可以了。
那么,什么情况下一个多项式一定有逆呢?
1.首先当P的第一位肯定不为0,用因为第0项只能由两个第0项转移过来,相乘之后肯定为0,而不为1.
2.P的第0项一定与模数互质,要么常数项的逆元都没法求。
3.其他的随意。