Defina os polinômios, onde deg(A) = q
e deg(B) = p
. A deg(C) = q + p
.
Nesse caso deg(C) = 1 + 2 = 3
,.
A=3+xB=2x2+2C=A∗B=?
Podemos facilmente encontrar C no tempo O(n2) pela multiplicação da força bruta dos coeficientes. Aplicando a FFT (e a FFT inversa), conseguimos isso em O(nlog(n)) . Explicitamente:
- Converta a representação do coeficiente de A e B na sua representação de valor. Esse processo é chamado de avaliação . Executar a divisão e conquista (D&C) para isso levaria tempo O(nlog(n)) .
- Multiplique os polinômios em componentes em sua representação de valor. Isso retorna a representação do valor de C = A * B. Isso leva tempo O(n) .
- Inverta C usando FFT inverso para obter C em sua representação de coeficiente. Esse processo é chamado de interpolação e também leva tempo O(nlog(n)) .
Continuando, representamos cada polinômio como um vetor cujo valor são seus coeficientes. O vetor é preenchido com 0 até a menor potência de dois, n=2k,n≥deg(C) . Assim n=4 . Escolher uma potência de dois nos fornece uma maneira de aplicar recursivamente nosso algoritmo de dividir e conquistar.
A=3+x+0x2+0x3⇒B=2+0x+2x+0x3⇒a⃗ =[3,1,0,0]b⃗ =[2,0,2,0]
Seja A′,B′ a representação do valor de A e B, respectivamente. Note-se que FFT (Fast Fourier Transform ) é uma transformação linear ( mapa linear ) e pode ser representado como uma matriz, M . portanto
A′=Ma→B′=Mb→
Nós definimos M=Mn(ω) onde ω é raízes complexos nth raízes complexos de unidade. Observe n = 4
neste exemplo. Observe também que a entrada na coluna jth e kth é ωjkn . Veja mais sobre a matriz DFT aqui
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⎤⎦⎥⎥⎥⎥
Dadas as ω4=4th raízes da unidade, temos o conjunto de igualdade ordenada:
{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,−1,−i,1,i,...}
Isso pode ser visualizado como iterando pelas raízes do círculo da unidade no sentido anti-horário .
Observe também a mod n
natureza, ou seja, ω6=ω6modn=ω2=−1e−i=ω3=ω3+n
Para concluir a etapa 1 ( avaliação ), encontramos A′,B′ executando
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⎤⎦⎥⎥⎥
Esta etapa pode ser alcançada usando algoritmos D&C (além do escopo desta resposta).
A′∗B′
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