Digamos que você tenha dois polinômios: e .
Estou tentando entender como a FFT nos ajuda a multiplicar esses dois polinômios. No entanto, não consigo encontrar nenhum exemplo elaborado. Alguém pode me mostrar como o algoritmo FFT multiplicaria esses dois polinômios. (Observação: não há nada de especial nesses polinômios, mas eu queria simplificá-lo para facilitar o acompanhamento.)
Analisei os algoritmos no pseudocódigo, mas todos eles parecem ter problemas (não especifique qual deve ser a entrada, variáveis indefinidas). E, surpreendentemente, não consigo encontrar por onde alguém realmente percorreu (manualmente) um exemplo de multiplicação de polinômios usando a FFT.
Respostas:
Suponha que usemos a quarta raiz da unidade, que corresponde à substituição de por . Também usamos decimação no tempo, em vez de decimação na frequência, no algoritmo FFT. (Também aplicamos uma operação de reversão de bits sem problemas.)1,i,−1,−i x
Para calcular a transformação do primeiro polinômio, começamos escrevendo os coeficientes: A transformada de Fourier dos coeficientes pares é e dos coeficientes ímpares é . (Essa transformação é apenas .) Portanto, a transformação do primeiro polinômio é Isso é obtido usando , . (Do cálculo do fator twiddle).3,1,0,0. 3,0 3,3 1,0 1,1 a,b↦a+b,a−b 4,3+i,2,3−i. X0,2=E0±O0 X1,3=E1∓iO1
Vamos fazer o mesmo para o segundo polinômio. Os coeficientes são Os coeficientes pares transformam-se em e os coeficientes ímpares transformam-se em . Portanto, a transformação do segundo polinômio é2 , 0 , 2 , 0. 2 , 2 4 , 0 0 , 0 0 , 0 4 , 0 , 4 , 0.
Obtemos a transformação de Fourier do polinômio do produto multiplicando as duas transformadas de Fourier no sentido do ponto: Resta calcular a transformação de Fourier inversa. Os coeficientes pares transformam inversamente a e os coeficientes ímpares transformam inversamente a . (A transformação inversa é ) Portanto, a transformação do polinômio do produto é Isso é obtido usando , . Obtivemos a resposta desejada16 , 0 , 8 , 0. 16 , 8 12 , 4 0 , 0 0 , 0 x , y↦ ( x + y) / 2 , ( x - y) / 2 6 , 2 , 6 , 2. X0 , 2= ( E0 0± O0 0) / 2 X1 , 3= ( E1 1∓ i ó1 1) / 2 ( 3 + x ) ( 2 + 2 x2) = 6 + 2 x + 6 x2+ 2 x3.
fonte
Defina os polinômios, onde
deg(A) = q
edeg(B) = p
. Adeg(C) = q + p
.Nesse caso
deg(C) = 1 + 2 = 3
,.Podemos facilmente encontrar C no tempoO(n2) pela multiplicação da força bruta dos coeficientes. Aplicando a FFT (e a FFT inversa), conseguimos isso em O(nlog(n)) . Explicitamente:
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.
SejaA′,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
Nós definimosM=Mn(ω) onde ω é raízes complexos nth raízes complexos de unidade. Observe jth e kth é ωjkn . Veja mais sobre a matriz DFT aqui
n = 4
neste exemplo. Observe também que a entrada na colunaDadas asω4=4th raízes da unidade, temos o conjunto de igualdade ordenada:
Isso pode ser visualizado como iterando pelas raízes do círculo da unidade no sentido anti-horário .
Observe também aω6=ω6modn=ω2=−1 e−i=ω3=ω3+n
mod n
natureza, ou seja,Para concluir a etapa 1 ( avaliação ), encontramosA′,B′ executando
Esta etapa pode ser alcançada usando algoritmos D&C (além do escopo desta resposta).
Finally, the last step is to represent C' into coefficients. Notice
NoticeM−1n=1nMn(ω−1) 1 and ωj=−ωn/2+j .
Also, it is true that, given thenth 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 polynomialC=A∗B=6+2x+6x2+2x3
1: Inversion Formula pg 73, Algorithms by Dasgupta et. al. (C) 2006
fonte