多项式学习笔记

FFT

FFT就是利用单位根,实现 O(nlogn) 的将一个多项式 A(x)=i=0n1aixi 由它的系数表示法转化为点值表示法,然后 O(n) 的与另一个多项式实现多项式乘法,然后再转化为系数表示法的过程。

FFT复杂度低的原因是它把 nA(x) 在系数和点值表示法之间转化变成 n2

什么是单位根?想象一个画在复平面上的圆,半径为 1 ,将这个圆 n 等分,从 (1,0) 开始逆时针编号 0  n1 ,那么每一个等分点就是一个单位根,其中第 k 个记作 ωnk

关于单位根有几个性质,FFT就是依靠这些性质来进行的:

1.ωnk=(ωn1)k

这个比较显然,根据复数相乘时模相乘,幅角相加,可以从几何意义上理解。

2.ωdndk=ωnk

依然是看图

3.ωnk+n2=ωnk

二者正好差一个半圆。

那么现在就可以利用这些性质来优化本来是 O(n2) 的DFT啦:

首先需要将 A(x) 的项数补成 2 的正整数次幂,方便后面计算。

A(x) 展开:

A(x)=a0x0+a1x1++an1xn1

=(a0x0+a2x2++an2xn2)+(a1x1+a3x3++an1xn1)

=(a0x0+a2x2++an2xn2)+x(a1x0+a3x2++an1xn2)

设:

A0(x)=a0x0+a2x1++an2xn22

A1(x)=a1x0+a3x1++an1xn22

然后可以发现:

A(x)=A0(x2)+xA1(x2)

那么假设现在要计算的是 A(ωnk)  (k<n2)

A(ωnk)=A0(ωn2k)+ωnkA1(ωn2k)

=A0(ωn2k)+ωnkA1(ωn2k)

那当 k>n2 时呢?因为这个 k 是枚举的,所以只要考虑怎么算出 A(ωnk+n2) 就行了:

因为 ωnk+n2=ωnk,所以:

A(ωnk+n2)=A0(ωn2k)ωnkA1(ωn2k)

然后我们发现,我们成功地把求 A(ωn0)    A(ωnn1) 转化为了求 A(ωn0)    A(ωnn21),这样一直递归下去,复杂度就从 O(n2) 优化到了 O(nlogn)

那么现在我们成功地把系数表示法转换为了点值表示法,再怎么转回来呢?其实只要把跑出来的点值表示法当成系数,把 (wnk)1 带入再FFT一次,再除以 n 就行了:

依然是设 k<n2

C(k)=i=0n1(j=0n1aj(ωni)j)(ωnk)i

=j=0n1aji=0n1(ωnjk)i

=nA(k)

posted @   wapmhac  阅读(71)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示