+#define _GNU_SOURCE
+#include <stdio.h>
+#include <math.h>
+#include <complex.h>
+
+static int rev(int i, int n)
+{
+ int j = 0;
+ n--;
+ while (n)
+ {
+ j = (j << 1) | (i & 1);
+ i >>= 1;
+ n >>= 1;
+ }
+ return j;
+}
+
+static complex omega(int k, int n)
+{
+ return cos(2*M_PI*k/n) + I*sin(2*M_PI*k/n);
+}
+
+static void fft(double *x, double *y, int n)
+{
+ complex omegas[n];
+ for (int i=0; i<n; i++)
+ omegas[i] = omega(i, n);
+
+ for (int i=0; i<n; i++)
+ y[rev(i,n)] = x[i];
+
+ for (int i=1; i<n; i*=2)
+ for (int j=0; j<n; j+=2*i)
+ for (int k=0; k<i; k++)
+ {
+ complex a = y[j+k];
+ complex b = y[j+k+i];
+ complex o = omegas[(n/(2*i))*k % n];
+ y[j+k] = a + b*o;
+ y[j+k+i] = a - b*o;
+ }
+}
+
+int main(void)
+{
+ double x[8] = { 0, 1, 0, 1, 0, 1, 0, 1 };
+ double y[8];
+ fft(x, y, 8);
+ for (int i=0; i<8; i++)
+ printf("%f + %fi\n", creal(y[i]), cimag(y[i]));
+ return 0;
+}