30 votos

Ejemplo concreto de multiplicación polinómica de la FFT

He leído varias explicaciones sobre los pasos para multiplicar dos polinomios mediante la transformada rápida de Fourier y no acabo de entenderlo en la práctica. Me preguntaba si podría recibir ayuda con un ejemplo concreto como:

$$ p(x) = a_0 + a_2x^2 + a_4x^4 + a_6x^6 $$ $$ q(x) = b_0 + b_4x^4 + b_6x^6 + b_8x^8 $$

Desde el $p(x)$ no es una potencia de 2, ¿lo relleno con términos de coeficiente cero y lo evalúo también como un polinomio de grado 8? Me he dado cuenta de que estos polinomios no tienen valores para los términos Impares; ¿se sigue multiplicando en O(nlog(n)) ¿complejidad temporal? No estaba seguro de cómo dividirlo.

¿Cuándo empiezo a evaluar cada término en la octava raíz de la unidad? $e^{\frac{i\pi k}{8}}$ para $k \in 2,4,6$ .

Esencialmente, me parece entender cada componente de la multiplicación fft cuando lo leo, pero aún no veo un ejemplo concreto paso a paso de su proceso.

¿Puede alguien describir los pasos para la multiplicación de los polinomios anteriores (o una multiplicación simple similar) utilizando fft? Me ayudaría mucho.

33voto

Daniel Kitachewsky Puntos 123

Tomemos su ejemplo concreto:- $$p(x) = a_0 + a_2x^2 + a_4x^4 + a_6x^6$$ $$q(x) = b_0 + b_4x^4 + b_6x^6 + b_8x^8$$

Podemos expresar los dos polinomios anteriores en formato vectorial:- $$\mathbf{p}=[a_0,0,a_2,0,a_4,0,a_6]$$ $$\mathbf{q}=[b_0,0,0,0,b_4,0,b_6,0,b_8]$$

donde el $k$ ª entrada (para $k\in\{0,1,2,..\}$ ) representa el coeficiente de $x^k$ .

Una vez que tenemos los vectores, tenemos que rellenar $\mathbf{p}$ con $8$ ceros (la longitud del vector $\mathbf{q}$ menos $1$ ), y tenemos que rellenar $\mathbf{q}$ con $6$ ceros (la longitud del vector $\mathbf{p}$ menos $1$ ), por lo que tenemos:-

$$\mathbf{p'}=[a_0,0,a_2,0,a_4,0,a_6,\color{red}{0,0,0,0,0,0,0,0}]$$ $$\mathbf{q'}=[b_0,0,0,0,b_4,0,b_6,0,b_8,\color{red}{0,0,0,0,0,0}]$$
La razón por la que necesitamos el relleno cero es para asegurar que cuando realicemos la FFT en los vectores, multipliquemos los FFTs por elementos y realicemos una FFT inversa (IFFT), el resultado corresponderá a un lineal convolución.

Cabe destacar que la duración de $\mathbf{p'}$ y $\mathbf{q'}$ es $15$ . Como la FFT está diseñada para procesar de forma óptima una potencia entera de $2$ número de muestras, podemos rellenar $\mathbf{p'}$ y $\mathbf{q'}$ por un extra $0$ para que tengamos $16$ muestras para procesar.

$$\mathbf{p''}=[a_0,0,a_2,0,a_4,0,a_6,\color{red}{0,0,0,0,0,0,0,0,0}]$$ $$\mathbf{q''}=[b_0,0,0,0,b_4,0,b_6,0,b_8,\color{red}{0,0,0,0,0,0,0}]$$

A continuación realizamos la FFT sobre los vectores $\mathbf{p''}$ y $\mathbf{q''}$ y denotamos los vectores resultantes por $\mathbf{P}$ y $\mathbf{Q}$ respectivamente (cada elemento será un número complejo):-

$$\mathbf{P}=[A_0,A_1,A_2,A_3,A_4,A_5,A_6,A_7,A_8,A_9,A_{10},A_{11},A_{12},A_{13},A_{14},A_{15}]$$ $$\mathbf{Q}=[B_0,B_1,B_2,B_3,B_4,B_5,B_6,B_7,B_8,B_9,B_{10},B_{11},B_{12},B_{13},B_{14},B_{15}]$$ A continuación, multiplicamos cada elemento de $\mathbf{P}$ con el elemento correspondiente de $\mathbf{Q}$ , dando como resultado el vector $$\mathbf{R}=[C_0,C_1,C_2,...,C_{15}]$$ donde $C_k=A_k\times B_k$ .

El último paso es calcular el IFFT del vector $\mathbf{R}$ , lo que da lugar a $$\mathbf{r}=[r_0,r_1,r_2,...,r_{15}]$$ donde el elemento $r_k$ es el coeficiente de $x^k$ , para $\in{0,1,..,15}$ . Tenga en cuenta que $r_{15}$ debe ser $0$ ya que hemos puesto a cero ambos vectores con un extra $0$ plazo.

Suponiendo que los coeficientes de los polinomios $p(x)$ y $q(x)$ fueran reales, entonces los elementos de $\mathbf{r}$ debe ser real (cualquier desviación, en términos de un pequeño componente imaginario, podría surgir de la naturaleza de precisión finita de cómo se implementa la FFT en un procesador).

Dada la naturaleza de los polinomios $p(x)$ y $q(x)$ los elementos $r_m$ para impar $m$ será cero (o un número muy pequeño, también debido a los efectos de la precisión finita).

3voto

Anonymous Puntos 11

Deberías leer "Introducción a los algoritmos" [CLRS] explica cada proceso del algoritmo y demuestra los lemas/teoremas necesarios para derivarlo.

por ejemplo, responde a su pregunta:

"¿Cómo se utilizan las raíces de la unidad de cada polinomio para reducir el tamaño del problema?"

La idea básica es que utiliza un enfoque de divide y vencerás (parte nlogn) basado en los lemas de división por la mitad y cancelación. Las raíces de la unidad se utilizan sólo para obtener los polinomios en su representación de valor puntual (se podría utilizar cualquier punto diferente para obtener dicha representación) pero éstas permiten aplicar convenientemente los teoremas anteriores y obtener la complejidad asintótica deseada.

"¿lo relleno con términos de coeficiente cero y lo evalúo también como un polinomio de grado 8? ".

Tomando 2 polinomios en su representación de valor puntual y dejando $x_k$ ser los puntos que van a evaluar tanto $ 0 \leq k \leq n$ dará lugar a $n+1$ pares punto-valor, pero necesita $2n + 1$ para interpolar un único polinomio de grado $2n$ (el grado del polinomio producto de ambos de grado $n$ ). Por lo tanto, hay que extender las representaciones de valor puntual de los polinomios a un $2n + 1$ pares punto-valor cada uno.

"¿Cuándo empiezo a evaluar cada término en la 8ª raíz de la unidad?" http://imgur.com/NlZzXv0 Esta imagen le responde "cuando" (línea 4). y no sólo se evalúa la 8ª raíz de la unidad sino también la 4ª raíz de la unidad, la 2ª raíz de la unidad. ( divide y vencerás ... O(nlgn)) el tamaño del vector $\vec{a}$ se reduce a la mitad, como puedes comprobar.

"Me he dado cuenta de que estos polinomios no tienen valores para los términos Impares; ¿sigue esto multiplicando en complejidad de tiempo O(nlog(n))? "

Tenga en cuenta que esta notación sólo establece un límite superior para el algoritmo, esto significa que si sus polinomios tienen "algunos" términos el límite superior será el mismo que si tiene "todos" los términos.

Si realmente entiendes el algoritmo y la teoría que hay detrás de esto (bastante fácil pero lo suficientemente largo para una respuesta simple aquí OMI) serías capaz de "ver" el proceso y responder a tus dudas como "cuándo" y "cómo", "hago..." y "complejidad".

Buena suerte y sigue aprendiendo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X