浅谈FFT

假设有两个多项式

如果要算两个多项式的乘积

时间复杂度为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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值