public static void ConvolveU01_U01(int N) { double[] x = new double[N]; Complex[] data = new Complex[N]; double min = U01.min(); double max = 2.0 * U01.max(); double step = (max - min) / (double)(N - 1); for (int k = 0; k != N; ++k) { x[k] = 0.0 + (double)k * step; data[k] = new Complex(U01.PDF(x[k]), 0.0); } Fourier.Forward(data, FourierOptions.Default); // var invN = 1.0 / Math.Sqrt(N); var invN = 1.0; // FT of convolution of the same PDSs is just a multiplication for (int k = 0; k != N; ++k) { var v = data[k]; data[k] = v * v * invN; } Fourier.Inverse(data, FourierOptions.Default); // something is wrong with normalization for (int k = 0; k != N; ++k) { Console.WriteLine($" {x[k]} {data[k].Real}"); } }