Here is a ruby implementation of the algorithm explained in detail at
Yet another attempt at developing intuition for the Fast Fourier Transform
# Solve "vec = fft_matrix * beta" for beta (modulo a constant.) # (Divide result by Math::sqrt(vec.size) to preserve length.) # vec.size is assumed to be a power of 2. # # Example use: puts fft([1,1,1,1]) # def fft(vec) return vec if vec.size <= 1 even = Array.new(vec.size / 2) { |i| vec[2 * i] } odd = Array.new(vec.size / 2) { |i| vec[2 * i + 1] } fft_even = fft(even) fft_odd = fft(odd) fft_even.concat(fft_even) fft_odd.concat(fft_odd) Array.new(vec.size) {|i| fft_even[i] + fft_odd [i] * omega(-i, vec.size)} end # calculate individual element of FFT matrix: (e ^ (2 pi i k/n)) # fft_matrix[i][j] = omega(i*j, n) # def omega(k, n) Math::E ** Complex(0, 2 * Math::PI * k / n) end