#include <fftw3.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    const int n = 8;
    fftw_complex *input = fftw_alloc_complex(n);
    fftw_complex *output = fftw_alloc_complex(n);
    if (!input || !output) return EXIT_FAILURE;
    fftw_plan forward = fftw_plan_dft_1d(n, input, output, FFTW_FORWARD, FFTW_ESTIMATE);
    fftw_plan backward = fftw_plan_dft_1d(n, output, input, FFTW_BACKWARD, FFTW_ESTIMATE);
    if (!forward || !backward) return EXIT_FAILURE;
    for (int i = 0; i < n; ++i) {
        input[i][0] = (i == 0) ? 1.0 : 0.0;
        input[i][1] = 0.0;
    }
    fftw_execute(forward);
    for (int i = 0; i < n; ++i)
        if (fabs(output[i][0] - 1.0) > 1e-12 || fabs(output[i][1]) > 1e-12)
            return EXIT_FAILURE;
    fftw_execute(backward);
    for (int i = 0; i < n; ++i)
        if (fabs(input[i][0] / n - ((i == 0) ? 1.0 : 0.0)) > 1e-12 ||
            fabs(input[i][1] / n) > 1e-12) return EXIT_FAILURE;
    puts("PASS: serial forward transform and normalised inverse");
    fftw_destroy_plan(backward);
    fftw_destroy_plan(forward);
    fftw_free(output);
    fftw_free(input);
    return EXIT_SUCCESS;
}
