展示如何手动执行FFT


27

假设您有两个多项式:和。3+x2x2+2

我试图了解FFT如何帮助我们将这两个多项式相乘。但是,我找不到任何可行的示例。有人可以告诉我FFT算法如何将这两个多项式相乘。(注意:这些多项式没有什么特别的,但我想简化它以使其易于理解。)

我已经看过伪代码中的算法,但是它们似乎都存在问题(不要指定输入应该是什么,未定义的变量)。令人惊讶的是,我找不到任何人实际经过(手动)使用FFT相乘多项式的示例。


2
维基百科通过FFT为整数乘法保留了这张漂亮的图片,但是我认为更明确的逐步操作可能会有所帮助。
Realz Slaw

Answers:


27

假设我们使用单位的第四根,它对应于用代替。在FFT算法中,我们还使用时间抽取,而不是频率抽取。(我们还无缝地应用了位反转操作。)1,i,1,ix

为了计算第一个多项式的变换,我们首先编写系数: 偶数系数的傅立叶变换为,奇数系数的傅立叶变换为。(此变换只是。)因此,第一个多项式的变换为 这是使用,。(根据旋转因子计算)。

3,1,0,0.
3,03,31,01,1a,ba+b,ab
4,3+i,2,3i.
X0,2=E0±O0X1,3=E1iO1

让我们对第二个多项式做同样的事情。系数为 偶数系数转换为,奇数系数转换为。因此,第二多项式的变换为

2,0,2,0.
2,24,00,00,0
4,0,4,0.

我们获得由两个傅里叶变换相乘的傅里叶变换的乘积多项式的点态: 它仍然以计算傅立叶逆变换。偶数系数逆变换为,奇数系数逆变换为。(逆变换为)因此,乘积多项式的变换为 这是使用,。我们已经获得了所需的答案

16,0,8,0.
16,812,40,00,0x,y(x+y)/2,(xy)/2
6,2,6,2.
X0,2=(E0±O0)/2X1,3=(E1iO1)/2
(3+x)(2+2x2)=6+2x+6x2+2x3.


您是如何到达6,2 6,2的?
拉斯

我给出了公式:,,其中()是反函数通过公式获得的偶数(odd)系数的变换。请再次查看答案-所有计算都在那里。X0,2=(E0±O2)/2X1,3=(E1iO1)/2E0,E1O1,O2x,y(x+y)/2,(xy)/2
Yuval Filmus 2013年

为什么要使用偶数系数两次?3,3-> 3,3,3,3。-> 3 + 1,3-i,3 + -1,3--i?
Aage Torleif 2014年

和这些公式如何扩展到更高的程度?加号/减号是否一直在翻转?例如什么?X0,2X1,3X0,2,4
鲍比·李

@BobbyLee我鼓励您阅读一些有关FFT的文献。
Yuval Filmus

7

定义多项式,其中deg(A) = qdeg(B) = p。的deg(C) = q + p

在这种情况下,deg(C) = 1 + 2 = 3

A=3+xB=2x2+2C=AB=?

通过系数的蛮力乘法,我们可以轻松地在时间内找到C。通过应用FFT(和逆FFT),我们可以在时间内实现这一目标。明确地:O(n2)O(nlog(n))

  1. 将A和B的系数表示形式转换为其值表示形式。这个过程称为评估。为此执行分而治之(D&C)将花费时间。O(nlog(n))
  2. 将多项式在其值表示中逐项相乘。这将返回C = A * B的值表示形式。这需要时间。O(n)
  3. 使用逆FFT反转C以获得系数表示形式的C。此过程称为插值,它也需要时间。O(nlog(n))

继续,我们将每个多项式表示为一个向量,其值就是其系数。我们将矢量填充0到最小的2的幂,。因此。选择2的幂可以为我们递归地应用分而治之算法。n=2k,ndeg(C)n=4

A=3+x+0x2+0x3a=[3,1,0,0]B=2+0x+2x+0x3b=[2,0,2,0]

令分别为A和B的值表示。注意,FFT(快速傅立叶变换)是一种线性变换(线性图),并且可以表示为矩阵,。从而A,BM

A=MaB=Mb

我们定义,其中是复数根复数根。注意,在此示例中。还要注意,第行和第列中的条目是。在此处查看有关DFT矩阵的更多信息M=Mn(ω)ωnthn = 4jthkthωnjk

M4(w)=[111...11ω1ω2...ωn11ω2ω4...............ωjk...1ωn1ω2(n1)...ω(n1)(n1)]=[11111ωω2ω31ω2ω4ω61ω3ω6ω9]

给定的单位根,我们得到有序的集合相等性:ω4=4th

{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,1,i,1,i,...}

这可以通过在逆时针方向上遍历单位圆的根部来可视化。

另外,请注意mod n性质,即和ω6=ω6modn=ω2=1i=ω3=ω3+n

为了完成步骤1(评估),我们通过执行以下操作找到A,B

A=Ma=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][3100]=[3+13+1ω3+ω23+ω3]=[43+i23i]B=Mb=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][2020]=[2+22+2ω22+2ω42+2ω6]=[4040]

可以使用D&C算法来完成此步骤(超出此答案的范围)。

将分量相乘(步骤2)AB

AB=[43+i23i][4040]=[16080]=C

最后,最后一步是将C'表示为系数。注意

C=McM1C=M1Mcc=M1C

注意 1和。Mn1=1nMn(ω1)ωj=ωn/2+j

Mn1=14[11111ω1ω2ω31ω2ω4ω61ω3ω6ω9]=14[11111i1i11111i1i]

ωj可以可视化为沿顺时针方向遍历单位圆弧的根部。

{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,1,i,1,i,...}

同样,在给定统一的根的情况下,确实存在等式。(你明白为什么吗?)nthωj=ωnj

然后,

c=M1C=1nMn(w1)=14[11111i1i11111i1i][16080]=[(16+8)/4(168)/4(16+8)/4(168)/4]=[6262]

因此,我们得到多项式 1:反演公式第73页,Dasgupta等人的算法。等 (C)2006

C=AB=6+2x+6x2+2x3

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.