¿Cuál es la complejidad (en la RAM entera estándar) de calcular la transformada discreta estándar de Fourier de un vector de enteros?
El algoritmo clásico para transformaciones rápidas de Fourier , atribuidas inapropiadamente [1] a Cooley y Tukey, generalmente se describe como funcionando en tiempo . Pero la mayoría de las operaciones aritméticas realizadas en este algoritmo a empezar con complejos n th raíces de la unidad, que son (para la mayoría n ) irracional, evaluación de manera exacta en tiempo constante no es razonable. El mismo problema surge con el ingenuo algoritmo de tiempo O ( n 2 ) (multiplicado por una matriz de Vandermonde de raíces complejas de la unidad).
Ni siquiera está claro cómo representar la salida del DFT exactamente (en cualquier forma útil). En otras palabras, ¡no está claro que calcular DFTs sea realmente posible!
Supongamos que solo necesitamos bits de precisión en cada valor de salida. ¿Cuál es la complejidad de calcular la transformada discreta de Fourier, en función de n y b ? (Para concreción, siéntase libre de asumir que n es una potencia de 2 ).
¿O cada instancia de "FFT" en la literatura realmente significa " transformación teórica rápida de números "? [2]
Vea mis preguntas relacionadas sobre la complejidad de la eliminación gaussiana y los caminos más cortos euclidianos .
[1] Realmente debería llamarse (algún prefijo de) el algoritmo Gauss-Runge-König-Yates-Stumpf-Danielson-Lánczos-Cooley-Tukey.
[2] Y si es así, ¿por qué la mayoría de los libros de texto describen solo el algoritmo de números complejos?
Respuestas:
Esta respuesta es una variante del análisis del primer algoritmo ("Método A") de Schönhage y Strassen para la multiplicación de enteros largos.
Supongamos que queremos calcular una FFT de longitud . Ajustar la escala de entrada de tal manera que todos los valores son menores que 1. Supongamos primeramente que calculamos con m bits fija aritmética de punto ( m bits de después del punto binario). Vamos δ = 2 1 / 2 - m sea la unidad ( "complejo") de menos posición. Deje ω = exp ( 2 π i / K ) .K=2k m m δ=21/2−m ω=exp(2πi/K)
1) Uno puede calcular aproximaciones tal que | ω ′ j - ω j | ≤ ( 2 k - 1 ) δ para todos 0 ≤ j ≤ K - 1 . Esto se puede hacer en el tiempo O ( K M ( m ) ) donde M ( m ) es el tiempo necesario para multiplicar números de m bits. (ver Knuth Vol. 2, 3ª ed., página 309).ω′j |ω′j−ωj|≤(2k−1)δ 0≤j≤K−1 O(KM(m)) M(m) m
Si la RAM entera estándar significa costo logarítmico, entonces . Si la RAM entera estándar significa la palabra RAM, entonces M ( m ) = O ( m ) . (Schönhage y Strassen espectáculo en "Methode A" cómo reducir en el tiempo lineal la multiplicación de m números -bit a m multiplicación de O ( log m ) números de bits. El último se puede hacer en los costos unitarios.)M(m)=O(mlogm) M(m)=O(m) m m O(logm)
2) La clásica FFT de Cooley-Tukey calcula operaciones de la forma . Utilizamos m bits aritmética de punto fijo, estos opertions convierten en un ' = t r u n c un t e ( b ' + ω ' j c ' ) . Si conocemos b ′ y c ′ hasta un error de ϵ , obtenemos un ′ hasta un error de 2 ϵ + 2a=b+ωjc m a′=truncate(b′+ω′jc′) b′ c′ ϵ a′ .2ϵ+2kδ
3) Utilizando la inducción, es fácil ver que obtenemos el resultado final con error . Para obtener la precisión b al final, m ≥ k + log k + b + O ( 1 ) .(2k−1)⋅2kδ b m≥k+logk+b+O(1)
4) Así, el tiempo de ejecución final es .O(KkM(k+b))
Esto también debería funcionar con números de punto flotante: 1) todavía se puede hacer con aritmética de punto fijo, 2) también es cierto para números de punto flotante.
En aritmética de punto fijo, creo, incluso se puede hacer más rápido. Primero reducimos el cálculo de la FFT a la multiplicación de polinomios usando el truco de Bluestein. La longitud de los coeficientes necesarios para obtener la precisión deseada debe ser . Luego reducimos la multiplicación de polinomios a la multiplicación de enteros largos. (Agregue los coeficientes a un número largo y sepárelos por bloques de cero de longitud O ( k + b ) .) La longitud de los enteros es O ( K ( k + b ) ) .O(k+b) O(k+b) O(K(k+b))
fuente
Esta no es una respuesta completa, pero puedo señalar algunos documentos relevantes y también explicar parcialmente por qué no es tan fácil extraer una respuesta a su pregunta específica de la literatura.
Permítanme comenzar preguntando, ¿por qué quieren saber la respuesta a esta pregunta? Por lo general, las personas que se preocupan por este tipo de problema son las que se enfrentan a la implementación de una FFT de alto rendimiento para una aplicación práctica. Estas personas se preocupan menos por la complejidad asintótica en algún modelo computacional idealizado que por maximizar el rendimiento bajo sus limitaciones particulares de hardware y software. Por ejemplo, los desarrolladores de la Transformada de Fourier más rápida en Occidente escriben en su artículo:
Estos son problemas con los que los teóricos generalmente no quieren meterse, pero son de gran importancia en las implementaciones reales. Si un teórico declara: "He descubierto la mejor complejidad absoluta de bits asintóticos en el modelo RAM", el profesional podría decir: "Eso es bueno", pero puede encontrar un resultado tan teórico inútil para sus propósitos.
Dicho esto, creo que su mejor opción es mirar la literatura de análisis numérico. Por ejemplo, Tasche y Zeuner han examinado de cerca la estabilidad numérica del algoritmo FFT. Esto todavía no puede ser exactamente lo que quiere, porque el consenso general entre los profesionales parece ser que para lograr una cantidad dada de precisión numérica, el mejor enfoque práctico consiste en calcular previamente determinados números llamados "factores de rotación" de alta precisión. Si solo está haciendo una FFT, entonces este no será el enfoque más rápido porque no puede amortizar el costo de su precomputación única en una gran cantidad de cálculos de FFT. Aún así, su análisis del error de redondeo en el peor de los casos aún debería ser relevante para su pregunta.
fuente