Terapkan Discrete Fourier Transform (DFT) untuk urutan berapa pun panjangnya. Ini dapat diimplementasikan sebagai fungsi atau program dan urutannya dapat diberikan sebagai argumen atau menggunakan input standar.
Algoritma akan menghitung hasil berdasarkan DFT standar di arah maju. Urutan input memiliki panjang N
dan terdiri dari [x(0), x(1), ..., x(N-1)]
. Urutan output akan memiliki panjang yang sama dan terdiri dari di [X(0), X(1), ..., X(N-1)]
mana masing X(k)
- masing didefinisikan oleh hubungan di bawah ini.
Aturan
- Ini adalah kode-golf sehingga solusi terpendek menang.
- Builtin yang menghitung DFT dalam arah maju atau mundur (juga dikenal sebagai terbalik) tidak diperbolehkan.
- Ketidaktepatan titik-mengambang tidak akan dihitung terhadap Anda.
Uji Kasus
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]
Tolong
Ada tantangan sebelumnya untuk menemukan DFT menggunakan algoritma FFT untuk urutan dengan panjang yang sama dengan kekuatan 2. Anda mungkin menemukan beberapa trik di sana yang mungkin membantu Anda di sini. Ingatlah bahwa tantangan ini tidak membatasi Anda pada kerumitan apa pun dan juga mengharuskan solusi Anda bekerja untuk urutan berapa pun panjangnya.
Python 3, 77 byte
Uji di Ideone .
Kode menggunakan rumus yang setara
sumber
J,
3020 byte3 byte terima kasih kepada @miles .
Menggunakan fakta itu
e^ipi = -1
.Rumusnya menjadi
X_k = sum(x_n / ((-1)^(2nk/N)))
.Pemakaian
di mana
>>
STDIN dan<<
STDOUT."Ketidaktepatan titik mengambang tidak akan dihitung melawanmu."
sumber
MATL ,
2016 byteInput adalah vektor kolom, yaitu ganti koma dengan titik koma:
Ini menggunakan rumus dalam jawaban Leaky Nun , berdasarkan pada fakta bahwa exp ( iπ ) = −1, dan bahwa operasi daya MATL dengan eksponen non-integer menghasilkan (seperti dalam kebanyakan bahasa pemrograman) hasil cabang utama .
Cobalah online!
Karena jarak aneh Oktaf dengan bilangan kompleks, bagian nyata dan imajiner dipisahkan oleh spasi, seperti juga entri yang berbeda dari vektor yang dihasilkan. Jika itu terlihat terlalu jelek, tambahkan a
!
di akhir ( 17 byte ) untuk memiliki setiap entri output di baris yang berbeda.Penjelasan
sumber
Pyth, 30
Test Suite
Pendekatan yang sangat naif, hanya implementasi dari formula. Berlari ke berbagai masalah titik apung kecil dengan nilai yang harus ditambahkan inverses untuk menghasilkan nilai yang sedikit dari nol.
Anehnya
.j
sepertinya tidak berfungsi tanpa argumen, tapi saya tidak yakin apakah saya menggunakannya dengan benar.sumber
Pyth, 18 byte
Menggunakan fakta itu
e^ipi = -1
.Rumusnya menjadi
X_k = sum(x_n / ((-1)^(2nk/N)))
.Suite uji.
sumber
Julia, 45 byte
Cobalah online!
Kode menggunakan rumus yang setara
sumber
Python 2, 78 byte
Polinomial dievaluasi untuk setiap kekuatan
p
dari1j**(4./len(l))
.Ekspresi
reduce(lambda a,b:a*p+b,l)
mengevaluasi polinomial yang diberikan olehl
pada nilaip
melalui metode Horner:Kecuali, daftar input keluar dibalik, dengan suku konstan di akhir. Kita dapat membalikkannya, tetapi karena
p**len(l)==1
untuk koefisien Fourier, kita dapat menggunakan retasan pembalikanp
dan mengalikan seluruh hasil denganp
.Beberapa upaya sama panjang:
Sebagai fungsi untuk 1 byte lebih banyak (79):
Upaya rekursi (80):
Simulasi berulang
reduce
(80):sumber
C (gcc) ,
8678 byteCobalah online!
Ini mengasumsikan vektor output nol sebelum digunakan.
sumber
Python 2, 89 byte
Menggunakan fakta itu
e^ipi = -1
.Rumusnya menjadi
X_k = sum(x_n / ((-1)^(2nk/N)))
.Ide itu!
sumber
Mathematica,
494847 byteBerdasarkan formula dari solusi @Dennis .
sumber
Aksioma, 81 byte
menggunakan rumus yang dikirim seseorang di sini. Hasil
sumber
Oktaf ,
4339 byteCobalah online!
Mengalikan vektor input dengan matriks DFT.
sumber