手動でFFTを行う方法を示す


27

2つの多項式3+x2x2+2ます。

FFTがこれら2つの多項式の乗算にどのように役立つかを理解しようとしています。ただし、解決された例は見つかりません。FFTアルゴリズムがこれら2つの多項式をどのように乗算するかを誰かが教えてくれますか。(注:これらの多項式には特別なものはありませんが、従いやすくするためにシンプルにしたかったのです。)

擬似コードでアルゴリズムを見てきましたが、それらのすべてに問題があるようです(入力の内容、未定義の変数を指定しないでください)。そして驚くべきことに、FFTを使用して多項式を乗算する例を、実際に誰が(手で)歩いたのか見つけることができません。


2
ウィキペディアは FFTを介した整数乗算のためにこの素敵なイメージを保持しいますが、さらに明確なステップバイステップが役立つと思います。
リアルツスロー

回答:


27

その対応の代わりに、私たちは団結の第四根を使用したと1,i,1,iのためx。また、FFTアルゴリズムでは、周波数の間引きではなく、時間の間引きも使用します。(ビット反転操作もシームレスに適用されます。)

第1の多項式の変換を計算するために、我々は、係数を書き込むことによって開始:

3,1,0,0.
ザフーリエも係数の変換3,0であり、3,3、および奇数の係数の1,0であります1,1。(これは単にある変換B +のB - B。)したがって第1の多項式の変換は 4 3 + I a,ba+b,ab
4,3+i,2,3i.
これを用いて得られるX0,2=E0±O0X1,3=E1iO1。(回転因子の計算から)。

2番目の多項式についても同じことをしましょう。係数は、

2,0,2,0.
でも係数2,2に変換4,0、奇数係数0,0に変換0,0。したがって、第二の多項式の変換は
4,0,4,0.

:私たちは、フーリエ変換は2フーリエ変換点ごとに乗算することにより、製品の多項式の変換を得る

16,0,8,0.
それは逆フーリエ変換を計算するために残っています。偶数係数16,8に逆変換12,4、および奇数係数0,0逆変換に0,0。(逆変換でありx,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に到着しましたか?
ラース

Iは、式を得た:X 1 3 = E 1I O 1/ 2E 0E 1O 1O 2)であると逆偶数(奇数)式により得られた係数の変換X Y X + Y X0,2=(E0±O2)/2X1,3=(E1iO1)/2E0,E1O1,O2。答えをもう一度見てください-すべての計算があります。x,y(x+y)/2,(xy)/2
ユヴァルフィルマス

偶数の係数を2回使用するのはなぜですか?3,3-> 3,3,3,3。-> 3 + 1、3-i、3 + -1,3--i?
Aage Torleif 14

どのようにするためにこれらの式を行う及びX 1 3がより高度に拡張しますか?プラス/マイナス記号は単に反転しますか?例えば、それはのために何でしょうX 0 2 4X0,2X1,3X0,2,4
ボビー・リー

@BobbyLee FFTに関する文献を読むことをお勧めします。
ユヴァルフィルマス16

7

多項式を定義します。ここでdeg(A) = qおよびdeg(B) = pです。deg(C) = q + p

この場合、deg(C) = 1 + 2 = 3

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

係数のブルートフォース乗算により、O(n2)時間でCを簡単に見つけることができます。FFT(および逆FFT)を適用することで、O(nlog(n))時間でこれを達成できます。明示的に:

  1. AおよびBの係数表現をその値表現に変換します。このプロセスは評価と呼ばれます。このために分割統治(D&C)を実行するには、O(nlog(n))時間かかります。
  2. 値表現で多項式を成分ごとに乗算します。これは、C = A * Bの値表現を返します。このテイクO(n)時間かかります。
  3. 逆FFTを使用してCを反転し、係数表現でCを取得します。このプロセスは補間と呼ばれ、O(nlog(n))時間もかかります

続けて、各多項式を、値がその係数であるベクトルとして表します。我々 2の最小パワー0の最大とパッドベクトル、n=2k,ndeg(C)。したがって、n=4です。2のべき乗を選択すると、分割統治アルゴリズムを再帰的に適用する方法が提供されます。

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

ましょA,Bをそれぞれ、A及びBの値表現です。FFT(高速フーリエ変換)は線形変換(線形マップ)であり、行列Mとして表現できることに注意してください。かくして

A=MaB=Mb

We define M=Mn(ω) where ω is complex roots nth complex roots of unity. Notice n = 4, in this example. Also notice that the entry in the jth row and kth column is ωnjk . See more about the DFT matrix here

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]

Given the ω4=4th roots of unity, we have the ordered set equality:

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

This can be visualized as iterating thru roots of the unit circle in the counter-clockwise direction.

Also, notice the mod n nature, i.e. ω6=ω6modn=ω2=1 and i=ω3=ω3+n

To complete step 1 (evaluation) we find A,B by performing

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]

This step can be achieved using D&C algorithms (beyond the scope of this answer).

Multiply AB component-wise (step 2)

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

Finally, the last step is to represent C' into coefficients. Notice

C=McM1C=M1Mcc=M1C

Notice Mn1=1nMn(ω1)1 and ωj=ωn/2+j.

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

ωj can be visualized as iterating thru roots of the unit circle in the clockwise direction.

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

Also, it is true that, given the nth root of unity, the equality ωj=ωnj holds. (Do you see why?)

Then,

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

Thus, we get the polynomial

C=AB=6+2x+6x2+2x3
1: Inversion Formula pg 73, Algorithms by Dasgupta et. al. (C) 2006

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.