Mostre como fazer a FFT manualmente

27

Digamos que você tenha dois polinômios: 3+x e .2x2+2

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.

Lars
fonte
2
A Wikipedia mantém essa bela imagem para multiplicação de números inteiros via FFT, mas acho que um passo a passo ainda mais explícito pode ser útil.
Realz Slaw

Respostas:

27

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,ix

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,03,31,01,1a,ba+b,ab
4,3+i,2,3i.
X0,2=E0±O0X1,3=E1iO1

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,24,00,00,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 desejada

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

Yuval Filmus
fonte
como você chegou em 6,2 6, 2?
Lars 23/10
Eu dei as fórmulas: , , onde ( ) é o inverso transformação dos coeficientes pares (ímpares), obtidos através da fórmula . Por favor, olhe a resposta novamente - todos os cálculos estão lá. X0,2=(E0±O2)/2X1,3=(E1iO1)/2E0,E1O1,O2x,y(x+y)/2,(xy)/2
Yuval Filmus
Por que você usa os coeficientes pares duas vezes? 3,3 -> 3,3,3,3. -> 3 + 1, 3-i, 3 + -1,3 - i?
Aage Torleif
Como essas fórmulas para e estendem a graus mais altos? Os sinais de mais / menos continuam girando? Por exemplo, o que seria para ? X0,2X1,3X0,2,4
Bobby Lee
@BobbyLee Convido você a ler alguma literatura sobre FFT.
Yuval Filmus
7

Defina os polinômios, onde deg(A) = qe deg(B) = p. A deg(C) = q + p.

Nesse caso deg(C) = 1 + 2 = 3,.

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

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:

  1. 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)) .
  2. 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) .
  3. 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,ndeg(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+0x3a=[3,1,0,0]B=2+0x+2x+0x3b=[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=MaB=Mb

Nós definimos M=Mn(ω) onde ω é raízes complexos nth raízes complexos de unidade. Observe n = 4neste exemplo. Observe também que a entrada na coluna jth e kth é ωnjk . Veja mais sobre a matriz DFT aqui

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]

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 nnatureza, ou seja, ω6=ω6modn=ω2=1ei=ω3=ω3+n

Para concluir a etapa 1 ( avaliação ), encontramos A,B executando

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]

Esta etapa pode ser alcançada usando algoritmos D&C (além do escopo desta resposta).

AB

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

j__gt
fonte