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.


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,b↦a+b,a−b
4,3+i,2,3−i.
X0,2=E0±O0X1,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,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,(x−y)/2
6,2,6,2)
X0 0,2=(E0 0±O0 0)/2X1 1,3=(E1 1∓EuO1 1)/2
(3+x)(2+2x2)=6+2x+6x2+2x3.


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=(E1∓iO1)/2E0,E1O1,O2x,y↦(x+y)/2,(x−y)/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=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:

  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,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⇒a→=[3,1,0,0]B=2+0x+2x+0x3⇒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 = 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...ωn−11ω2ω4...............ωjk...1ωn−1ω2(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 nnatureza, 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 Mn−1=1nMn(ω−1)1 and ωj=−ωn/2+j.

Mn−1=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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.