Implemente la Transformada discreta de Fourier (DFT) para una secuencia de cualquier longitud. Esto puede implementarse como una función o un programa y la secuencia se puede dar como un argumento o utilizando una entrada estándar.
El algoritmo calculará un resultado basado en DFT estándar en la dirección hacia adelante. La secuencia de entrada tiene longitud N
y consta de [x(0), x(1), ..., x(N-1)]
. La secuencia de salida tendrá la misma longitud y consiste en [X(0), X(1), ..., X(N-1)]
donde cada uno X(k)
está definido por la siguiente relación.
Reglas
- Este es el código de golf, por lo que gana la solución más corta.
- No se permiten las unidades integradas que calculan el DFT en direcciones hacia adelante o hacia atrás (también conocido como inverso).
- Las imprecisiones de punto flotante no se contarán en su contra.
Casos de prueba
DFT([1, 1, 1, 1]) = [4, 0, 0, 0]
DFT([1, 0, 2, 0, 3, 0, 4, 0]) = [10, -2+2j, -2, -2-2j, 10, -2+2j, -2, -2-2j]
DFT([1, 2, 3, 4, 5]) = [15, -2.5+3.44j, -2.5+0.81j, -2.5-0.81j, -2.5-3.44j]
DFT([5-3.28571j, -0.816474-0.837162j, 0.523306-0.303902j, 0.806172-3.69346j, -4.41953+2.59494j, -0.360252+2.59411j, 1.26678+2.93119j] = [2, -3j, 5, -7j, 11, -13j, 17]
Ayuda
Hubo un desafío anterior para encontrar el DFT usando un algoritmo FFT para secuencias con longitudes iguales a una potencia de 2. Puede encontrar algunos trucos allí que podrían ayudarlo aquí. Tenga en cuenta que este desafío no lo limita a ninguna complejidad y también requiere que su solución funcione para secuencias de cualquier longitud.
Python 3, 77 bytes
Pruébalo en Ideone .
El código usa la fórmula equivalente
fuente
J,
3020 bytes3 bytes gracias a @miles .
Utiliza el hecho de que
e^ipi = -1
.La fórmula se convierte
X_k = sum(x_n / ((-1)^(2nk/N)))
.Uso
donde
>>
es STDIN y<<
es STDOUT."Las imprecisiones de coma flotante no se contarán en su contra".
fuente
MATL ,
2016 bytesLa entrada es un vector de columna, es decir, reemplazar comas por punto y coma:
Esto usa la fórmula en la respuesta de Leaky Nun , basada en los hechos que exp ( iπ ) = −1, y que la operación de poder de MATL con exponente no entero produce (como en la mayoría de los lenguajes de programación) el resultado de la rama principal .
Pruébalo en línea!
Debido al extraño espacio de Octave con números complejos, las partes real e imaginaria están separadas por un espacio, al igual que las diferentes entradas del vector resultante. Si eso parece demasiado feo, agregue un
!
al final ( 17 bytes ) para tener cada entrada de la salida en una fila diferente.Explicación
fuente
Pyth, 30
Banco de pruebas
Enfoque muy ingenuo, solo una implementación de la fórmula. Se encuentra con varios problemas menores de coma flotante con valores que deberían ser inversos aditivos añadidos para dar como resultado valores que están ligeramente fuera de cero.
Curiosamente
.j
no parece funcionar sin argumentos, pero no estoy seguro de si lo estoy usando correctamente.fuente
Pyth, 18 bytes
Utiliza el hecho de que
e^ipi = -1
.La fórmula se convierte
X_k = sum(x_n / ((-1)^(2nk/N)))
.Banco de pruebas.
fuente
Julia, 45 bytes
Pruébalo en línea!
El código usa la fórmula equivalente
fuente
Python 2, 78 bytes
El polinomio se evalúa para cada potencia
p
de1j**(4./len(l))
.La expresión
reduce(lambda a,b:a*p+b,l)
evalúa el polinomio dado porl
el valorp
mediante el método de Horner:Excepto, la lista de entrada se invierte, con un término constante al final. Podríamos revertirlo, pero debido
p**len(l)==1
a los coeficientes de Fourier, podemos usar un truco de invertirp
y multiplicar todo el resultado porp
.Algunos intentos de igual longitud:
En función de 1 byte más (79):
Un intento de recursión (80):
Simulando iterativamente
reduce
(80):fuente
C (gcc) ,
8678 bytesPruébalo en línea!
Esto supone que el vector de salida se pone a cero antes de su uso.
fuente
Python 2, 89 bytes
Utiliza el hecho de que
e^ipi = -1
.La fórmula se convierte
X_k = sum(x_n / ((-1)^(2nk/N)))
.Ideone it!
fuente
Mathematica,
494847 bytesBasado en la fórmula de la solución de @Dennis .
fuente
Axioma, 81 bytes
usando la fórmula que alguien publica aquí. Resultados
fuente
Octava ,
4339 bytesPruébalo en línea!
Multiplica el vector de entrada por la matriz DFT.
fuente