高速フーリエ変換

フーリエ変換

F(t)=0i<nf(ωni)tiF(t) = \sum_{0 \le i \lt n}{f(\omega_n^i)t^i}

逆変換

f(x)=1n0i<nF(ωni)xif(x) = \frac{1}{n}\sum_{0 \le i \lt n}{F(\omega_n^{-i})x^i}

iiについて、f(ωni)\sum{f(\omega_n^i)}を高速に求める方法があればいい

周期性を利用した高速化

f(x)=0i<ncixif0(x2)=0i<n2c2ixif1(x2)=x0i<n2c2i+1xif(x)=f0(x2)+f1(x2)f(x) = \sum_{0 \le i \lt n}{c_ix^i} \\ f_0(x^2) = \sum_{0 \le i \lt \frac{n}{2}}{c_{2i}x^i} \\ f_1(x^2) = x\sum_{0 \le i \lt \frac{n}{2}}{c_{2i+1}x^i} \\ f(x) = f_0(x^2) + f_1(x^2)
f(ωni)=f0(ωn2i)+f1(ωn2i)=f0(ωn/2i)+f1(ωn/2i)f(\omega_n^{i}) = f_0(\omega_n^{2i}) + f_1(\omega_n^{2i}) \\ = f_0(\omega_{n / 2}^i) + f_1(\omega_{n / 2}^i)
F(t)=0i<nf(ωni)ti=0i<n(f0(ωn/2i)+f1(ωn/2i))ti=0i<n2...+0i<n2...=0i<n2...+tn/20i<n2...=(1+tn/2)(0i<n2...)=(1+tn/2)(0i<n2f0(ωn/2i)ti+0i<n2f1(ωn/2i)ti)F(t) = \sum_{0 \le i \lt n}{f(\omega_n^i)t^i} \\ = \sum_{0 \le i \lt n}{(f_0(\omega_{n / 2}^i) + f_1(\omega_{n / 2}^i))t^i} \\ = \sum_{0 \le i \lt \frac{n}{2}}{...} + \sum_{0 \le i \lt \frac{n}{2}}{...} \\ = \sum_{0 \le i \lt \frac{n}{2}}{...} + t^{n/2}\sum_{0 \le i \lt \frac{n}{2}}{...} \\ = (1+t^{n/2})(\sum_{0 \le i \lt \frac{n}{2}}{...}) \\ = (1+t^{n/2})(\sum_{0 \le i \lt \frac{n}{2}}{f_0(\omega_{n / 2}^i)t^i} + \sum_{0 \le i \lt \frac{n}{2}}{f_1(\omega_{n / 2}^i)t^i}) \\