假设有两个多项式
如果要算两个多项式的乘积
时间复杂度为O(n*m),显然是不能接受的,随后就引入了快速傅里叶变换FFT
FFT是以时间复杂度为O(nlogn)级别计算两个多项式乘积的方法
FFT以时间复杂度为O(nlogn)级别计算两个多项式乘积的大致过程就是:第一步,先把两个多项式的系数表示法以时间复杂度O(nlogn)转化为点表示法,然后以O(n)得出两个多项式乘积的点表示法,第二步,把乘积的点表示法以时间复杂度O(nlogn)再转化为系数表示法
首先,我们知道n个点可以唯一确定一个n-1次多项式
即设n个点为
那么代入方程可得方程组
所以可以得到一个满秩矩阵,n个方程n个未知系数,最后可以得到n-1次的多项式
那么如何将系数表示转化为容易求乘积的点表示?
首先引入复数域的单位根,因为它可以更好的用来表示若干个点的坐标,假设有n个点,那么只需要把单位圆划分为n份,设每一个点为
易知的是
先讨论将转化为点表示法
将x的奇数次方和偶数次方分开
将H(x)化成与G(x)相同的形式,
再将x的系数缩小
那么可得
将带入方程
再将带入方程
从这两个方程能看出什么?
假设A(x)的系数分别为
将x的系数奇偶划分后就变成了
再看第一个方程发生了什么
可以带入方程发现
再看第二个方程
因此,就容易递归得到点表示法的纵坐标,即点就可以表示为
但递归的常数非常大,而且容易爆栈,再看看递归的时候有什么规律
再观察一下第一行和最后一行的二进制有什么规律
发现两行的二进制表示正好互为翻转,这个是可以O(n)递推出来
递推方程
其中bit是二进制表示的最长长度,即为i的二进制翻转
B(x)同理也可得到点表示法
那么f(x)=A(x)B(x)就很容易得出来f(x)的点表示法
因为满足复数乘法
所以二者相乘得
所以以时间复杂度为O(n)即可得出f(x)在点表示法下得多项式,但这并没有结束,需要将f(x)转化为系数表示法,只需要再做一次FFT即可,时间复杂度为O(nlogn)