En el contexto de los algoritmos de transformada rápida de Fourier , una mariposa es una parte del cálculo que combina los resultados de transformadas discretas de Fourier (DFT) más pequeñas en una DFT más grande, o viceversa (dividiendo una DFT más grande en subtransformadas). El nombre "mariposa" proviene de la forma del diagrama de flujo de datos en el caso de radix-2, como se describe a continuación. [1] Se cree que la primera aparición impresa del término se produjo en un informe técnico del MIT de 1969. [2] [3] La misma estructura también se puede encontrar en el algoritmo de Viterbi , utilizado para encontrar la secuencia más probable de estados ocultos.
Más comúnmente, el término "mariposa" aparece en el contexto del algoritmo FFT de Cooley-Tukey , que descompone recursivamente una DFT de tamaño compuesto n = rm en r transformaciones más pequeñas de tamaño m donde r es la "base" de la transformada. Estas DFT más pequeñas luego se combinan a través de mariposas de tamaño r , que a su vez son DFT de tamaño r (realizadas m veces en las salidas correspondientes de las subtransformaciones) premultiplicadas por raíces de la unidad (conocidas como factores de giro ). (Este es el caso de "diezmado en el tiempo"; también se pueden realizar los pasos a la inversa, conocidos como "diezmado en frecuencia", donde las mariposas aparecen primero y se multiplican posteriormente por factores de giro. Consulte también el artículo Cooley-Tukey FFT .)
En el caso del algoritmo Cooley-Tukey radix-2, la mariposa es simplemente una DFT de tamaño 2 que toma dos entradas ( x 0 , x 1 ) (salidas correspondientes de las dos subtransformadas) y proporciona dos salidas ( y 0 , y 1 ) por la fórmula (sin incluir los factores de giro ):
Si se dibuja el diagrama de flujo de datos para este par de operaciones, las líneas ( x 0 , x 1 ) a ( y 0 , y 1 ) se cruzan y se asemejan a las alas de una mariposa , de ahí el nombre (ver también la ilustración a la derecha). ).
Más específicamente, un algoritmo FFT de diezmado en el tiempo radix-2 en n = 2 p entradas con respecto a una n -ésima raíz primitiva de la unidad se basa en O ( n log 2 n ) mariposas de la forma:
donde k es un número entero que depende de la parte de la transformación que se calcula. Mientras que la transformación inversa correspondiente se puede realizar matemáticamente reemplazando ω con ω −1 (y posiblemente multiplicando por un factor de escala general, dependiendo de la convención de normalización), también se pueden invertir directamente las mariposas:
correspondiente a un algoritmo FFT de diezmado en frecuencia.
La mariposa también se puede utilizar para mejorar la aleatoriedad de grandes conjuntos de números parcialmente aleatorios, poniendo cada palabra de 32 o 64 bits en contacto causal con todas las demás palabras a través de un algoritmo hash deseado, de modo que un cambio en cualquier bit tenga la posibilidad. de cambiar todos los bits en la gran matriz. [4]
Este cálculo, denominado "mariposa".