多項式を定義します。ここでdeg(A) = q
およびdeg(B) = p
です。deg(C) = q + p
。
この場合、deg(C) = 1 + 2 = 3
。
A=3+xB=2x2+2C=A∗B=?
係数のブルートフォース乗算により、O(n2)時間でCを簡単に見つけることができます。FFT(および逆FFT)を適用することで、O(nlog(n))時間でこれを達成できます。明示的に:
- AおよびBの係数表現をその値表現に変換します。このプロセスは評価と呼ばれます。このために分割統治(D&C)を実行するには、O(nlog(n))時間かかります。
- 値表現で多項式を成分ごとに乗算します。これは、C = A * Bの値表現を返します。このテイクO(n)時間かかります。
- 逆FFTを使用してCを反転し、係数表現でCを取得します。このプロセスは補間と呼ばれ、O(nlog(n))時間もかかります。
続けて、各多項式を、値がその係数であるベクトルとして表します。我々 2の最小パワー0の最大とパッドベクトル、n=2k,n≥deg(C)。したがって、n=4です。2のべき乗を選択すると、分割統治アルゴリズムを再帰的に適用する方法が提供されます。
A=3+x+0x2+0x3⇒B=2+0x+2x+0x3⇒a⃗ =[3,1,0,0]b⃗ =[2,0,2,0]
ましょA′,B′をそれぞれ、A及びBの値表現です。FFT(高速フーリエ変換)は線形変換(線形マップ)であり、行列Mとして表現できることに注意してください。かくして
A′=Ma→B′=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 ωjkn . See more about the DFT matrix here
M4(w)=⎡⎣⎢⎢⎢⎢⎢⎢111...11ω1ω2...ωn−11ω2ω4...ω2(n−1).........ωjk...1ωn−1......ω(n−1)(n−1)⎤⎦⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢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′=M∗a⃗ =⎡⎣⎢⎢⎢⎢11111ωω2ω31ω2ω4ω61ω3ω6ω9⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢⎢3100⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢⎢3+13+1ω3+ω23+ω3⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢43+i23−i⎤⎦⎥⎥⎥B′=M∗b⃗ =⎡⎣⎢⎢⎢⎢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 A′∗B′ component-wise (step 2)
A′∗B′=⎡⎣⎢⎢⎢43+i23−i⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢4040⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢16080⎤⎦⎥⎥⎥=C′
Finally, the last step is to represent C' into coefficients. Notice
C′=Mc⃗ ⇒M−1C′=M−1Mc⃗ ⇒c⃗ =M−1C′
Notice M−1n=1nMn(ω−1)1 and ωj=−ωn/2+j.
M−1n=14⎡⎣⎢⎢⎢⎢11111ω−1ω−2ω−31ω−2ω−4ω−61ω−3ω−6ω−9⎤⎦⎥⎥⎥⎥=14⎡⎣⎢⎢⎢11111−i−1i1−11−11i−1−i⎤⎦⎥⎥⎥
ω−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=ωn−j holds. (Do you see why?)
Then,
c⃗ =M−1C′=1nMn(w−1)=14⎡⎣⎢⎢⎢11111−i−1i1−11−11i−1−i⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢16080⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢⎢(16+8)/4(16−8)/4(16+8)/4(16−8)/4⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢6262⎤⎦⎥⎥⎥
Thus, we get the polynomial C=A∗B=6+2x+6x2+2x3
1: Inversion Formula pg 73, Algorithms by Dasgupta et. al. (C) 2006