FFT 精度误差分析
可能写的有错的,也可能没有,大家看着当个乐子就好。
FFT 是 oi 中常用的一种算法,但是我们没有关心过它的精度,所以我们现在来关心一下。
我们知道对于一个长度为 \(n\) 的向量 \(\alpha\),我们对它做 DFT,相当于左乘了一个正交矩阵 \(T\)(我们知道常规的 DFT 中做的不是标准的正交变换,但是如果每轮后将所有数除以 \(\sqrt{2}\) 就是了,因此下文中都以这种方式分析)
正交矩阵有着很好的性质,就是它相当于一个旋转,即:\(||\alpha||_2 = ||T \alpha||_2\),因此,我们考虑从 \(L_2-norm\) 入手分析误差。
我们的 \(DFT\) 算法可以看成很多步骤,每次蝴蝶变换都相当于乘上一个正交矩阵 \(M_i\),我们要乘 \(m=\log_2(n)\) 个正交矩阵,即 \(T=\prod_{i=1}^m m_{m+1-i}\)。
因此
但是我们知道,每一轮蝴蝶变换都会引入新的误差,我们用 DFT 表示计算机中的函数,因此,在计算机运算中,我们可以用这一个式子精确表示结果:
我们现在来分析一下 \(\epsilon_1\) 的精度,我们不妨假设 \(||\alpha||_2 \leq 1\)(利用浮点数的性质,我们可以进行放缩)。
我们容易分析出 \(||\epsilon_1||_2 = O(\epsilon)\),其中 \(\epsilon\) 是机器浮点数所保证的精度。
由三角不等式 \(||\alpha + \beta||_2 \leq ||\alpha||_2 + ||\beta||_2\),我们可以轻松得到 \(||\epsilon_i||_2 = O(\epsilon)\),\(||DFT(\alpha) - T\alpha||_2=O(\log_2 n \epsilon)\)
我们就分析出了 DFT 的精度误差,卷积的精度误差留作练习(没啥区别)。