多项式乘法与快速傅里叶变换

多项式乘法

A(x)=a0+a1x+a2x2+a3x3+...+anxn
B(x)=b0+b1x+b2x2+b3x3+...+bnxn
C(x)=A(x)B(x)=c0+c1x+c2x2+c3x3+...+c2nx2n

暴力解法

两层循环,复杂度是 O(n2)

分治算法

A(x)=(a0+a1x+a2x2+a3x3+...+an21xn21)+(an2+...+an)xn2+=A1+A2xn2
B(x)=(b0+b1x+b2x2+b3x3+...+bn21xn21)+(bn2+...+bn)xn2+=B1+B2xn2
C(x)=A(x)B(x)=A1B1+A2B1xn2+A1B2xn2+A2B2xn

A1B1,A2B1,A1B2,A2B2n2
T(n)=4T(n2)+cn=O(n2),

C(x)=A(x)B(x)=A1B1+A2B1xn2+A1B2xn2+A2B2xn
=((A1+A2)(B1+B2)A1B1A2B2)xn2+A1B1+A2B2xn
这样我们把它转换为了3次乘法
T(n)=3T(n2)+cn=O(nlog23)<O(n2)

快速傅里叶变换

我们发现A(x)B(x)多项式相乘,可以看成N个离散数据(a0,a1,…an)和N个离散数据(b0,b1,…bn)的卷积操作,即信号处理里的时域卷积,而域卷积对应的是频域相乘,所以我们把多项式相乘的步骤转换为
1. 把A(x) B(x)系数对应的离散信号数据进行快速傅里叶变换到频域 , O(nlogn)
2. 频域对应分量相乘, O(n)
3. 傅里叶逆变换, O(nlogn)
所以整体的复杂度就是 O(nlogn)

分治法求快速傅里叶变换

这里写图片描述

这里写图片描述

解释:

傅里叶级数 Aj 即是离散数据 (a0,a1,a2...aN1) 在各个频段 e2πijk/N 的分量, 它的求法可以转化为求多项式 a(x)=N1k=0akxkwj 的取值,即 Aj=a(wj) , 我们需要求 A0>AN1 a(w0)>a(wN1),N=2n
a(x)=a0+a1x+a2x2+a3x3+...+aN1xN1
b(x)=a1+a3x+a5x2+a7x4+...+aN1xN22
c(x)=a0+a2x+a4x2+a6x4+...+aN2xN22
注意这里的a和离散数据 (a0,a1,a2...aN1) 里的a不是一个意思,这里的a只是个函数名称,可改成f或者其他
a(x),a(x)=b(x2)x+c(x2)
而且 a(wj) 的前一半和后一半都可以用奇偶项b(x^2)和 c(x^2)得到,所以可以利用分治
T(N)=2T(N/2)+cN,T(n)=O(NlogN)


参考:
多项式乘法与快速傅里叶变换
两个n项多项式相乘采用分治算法的时间复杂度怎样计算?
【算法笔记】多项式快速算法——快速傅里叶变换
FFT算法学习笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值