using System;
using System.Numerics;
class Test
{
static
void ft(int n, ref Complex[] f)
{
if (n > 1)
{
Complex[] g = new Complex[(int)n / 2];
Complex[] u = new Complex[(int)n / 2];
for (int i = 0; i < n / 2; i++)
{
g[i] = f[i * 2];
u[i] = f[i * 2 + 1];
}
ft(n / 2, ref g);
ft(n / 2, ref u);
for (int i = 0; i < n / 2; i++)
{
float a = i;
a = (float) (-2.0 * Math.PI * a / n);
float cos = (float)Math.
Cos(a
); float sin = (float)Math.
Sin(a
); Complex c1
= new Complex
(cos, sin); c1 = Complex.Multiply(u[i], c1);
f[i] = Complex.Add(g[i], c1);
f[i + (int)n / 2] = Complex.Subtract(g[i], c1);
}
}
}
static
void inverseFt(ref Complex[] f)
{
for (int i = 0; i < f.Length; i++)
{
f[i] = Complex.Conjugate(f[i]);
}
ft(f.Length, ref f);
float scaling = (float)(1.0 / f.Length);
for (int i = 0; i < f.Length; i++)
{
f[i] = scaling * Complex.Conjugate(f[i]);
}
}
static
void toWolframAlphaDefinition(ref Complex[] f)
{
float scaling = (float)(1.0/Math.Sqrt(f.Length));
for (int i = 0; i < f.Length; i++)
{
f[i] = scaling * Complex.Conjugate(f[i]);
}
}
static
void demoFt()
{
int N = 4;
Complex[] f = new Complex[N];
for (int i = 0; i < f.Length; ++i)
{
f[i] = 0.6 + 0.1 * i;
}
ft(f.Length, ref f);
System.Console.WriteLine("Forward transform:");
for (int i = 0; i < f.Length; ++i)
{
System.Console.WriteLine(" " + f[i]);
}
inverseFt(ref f);
System.Console.WriteLine("Inverse transform:");
for (int i = 0; i < f.Length; ++i)
{
System.Console.WriteLine(" " + f[i]);
}
}
static void Main()
{
demoFt();
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTnVtZXJpY3M7CgpjbGFzcyBUZXN0CnsKICBzdGF0aWMKICB2b2lkIGZ0KGludCBuLCByZWYgQ29tcGxleFtdIGYpCiAgewogICAgaWYgKG4gPiAxKQogICAgewogICAgICBDb21wbGV4W10gZyA9IG5ldyBDb21wbGV4WyhpbnQpbiAvIDJdOwogICAgICBDb21wbGV4W10gdSA9IG5ldyBDb21wbGV4WyhpbnQpbiAvIDJdOwoKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuIC8gMjsgaSsrKQogICAgICB7CiAgICAgICAgZ1tpXSA9IGZbaSAqIDJdOwogICAgICAgIHVbaV0gPSBmW2kgKiAyICsgMV07CiAgICAgIH0KCiAgICAgIGZ0KG4gLyAyLCByZWYgZyk7CiAgICAgIGZ0KG4gLyAyLCByZWYgdSk7CgogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG4gLyAyOyBpKyspCiAgICAgIHsKICAgICAgICBmbG9hdCBhID0gaTsKICAgICAgICBhID0gKGZsb2F0KSAoLTIuMCAqIE1hdGguUEkgKiBhIC8gbik7CiAgICAgICAgZmxvYXQgY29zID0gKGZsb2F0KU1hdGguQ29zKGEpOwogICAgICAgIGZsb2F0IHNpbiA9IChmbG9hdClNYXRoLlNpbihhKTsKICAgICAgICBDb21wbGV4IGMxID0gbmV3IENvbXBsZXgoY29zLCBzaW4pOwogICAgICAgIGMxID0gQ29tcGxleC5NdWx0aXBseSh1W2ldLCBjMSk7CiAgICAgICAgZltpXSA9IENvbXBsZXguQWRkKGdbaV0sIGMxKTsKCiAgICAgICAgZltpICsgKGludCluIC8gMl0gPSBDb21wbGV4LlN1YnRyYWN0KGdbaV0sIGMxKTsKICAgICAgfQogICAgfQogIH0KCiAgc3RhdGljCiAgdm9pZCBpbnZlcnNlRnQocmVmIENvbXBsZXhbXSBmKQogIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZi5MZW5ndGg7IGkrKykKICAgIHsKICAgICAgZltpXSA9IENvbXBsZXguQ29uanVnYXRlKGZbaV0pOwogICAgfQogICAgZnQoZi5MZW5ndGgsIHJlZiBmKTsKICAgIGZsb2F0IHNjYWxpbmcgPSAoZmxvYXQpKDEuMCAvIGYuTGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZi5MZW5ndGg7IGkrKykKICAgIHsKICAgICAgZltpXSA9IHNjYWxpbmcgKiBDb21wbGV4LkNvbmp1Z2F0ZShmW2ldKTsKICAgIH0KICB9CgogIHN0YXRpYwogIHZvaWQgdG9Xb2xmcmFtQWxwaGFEZWZpbml0aW9uKHJlZiBDb21wbGV4W10gZikKICB7CiAgICBmbG9hdCBzY2FsaW5nID0gKGZsb2F0KSgxLjAvTWF0aC5TcXJ0KGYuTGVuZ3RoKSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGYuTGVuZ3RoOyBpKyspCiAgICB7CiAgICAgIGZbaV0gPSBzY2FsaW5nICogQ29tcGxleC5Db25qdWdhdGUoZltpXSk7CiAgICB9CiAgfQoKICBzdGF0aWMKICB2b2lkIGRlbW9GdCgpCiAgewogICAgaW50IE4gPSA0OwogICAgQ29tcGxleFtdIGYgPSBuZXcgQ29tcGxleFtOXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZi5MZW5ndGg7ICsraSkKICAgIHsKICAgICAgZltpXSA9IDAuNiArIDAuMSAqIGk7CiAgICB9CiAgICBmdChmLkxlbmd0aCwgcmVmIGYpOwogICAgU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKCJGb3J3YXJkIHRyYW5zZm9ybToiKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZi5MZW5ndGg7ICsraSkKICAgIHsKICAgICAgU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKCIgICIgKyBmW2ldKTsKICAgIH0KICAgIGludmVyc2VGdChyZWYgZik7CiAgICBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoIkludmVyc2UgdHJhbnNmb3JtOiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmLkxlbmd0aDsgKytpKQogICAgewogICAgICBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoIiAgIiArIGZbaV0pOwogICAgfQogIH0KICBzdGF0aWMgdm9pZCBNYWluKCkKICB7CiAgICBkZW1vRnQoKTsKICB9Cn0=
Forward transform:
(3, 0)
(-0.199999991257722, 0.2)
(-0.2, 0)
(-0.200000008742278, -0.2)
Inverse transform:
(0.6, 0)
(0.7, -2.77555905048799E-18)
(0.8, 0)
(0.9, 2.77555905048799E-18)