前言
递归版的FFT比较容易理解, 然而递归会消耗大量额外的内存空间, 通过位逆序置换(又称蝴蝶变换)可以模拟递归FFT的分治步骤从而对递归FFT进行优化;
而在此基础上由于FFT的精度等问题, 我们可以通过用原根替换单位复根来进一步优化, 以下是我的学习笔记.
一、位逆序置换
1. 分治
以一个长度为8的多项式为例, 其系数如下:
{ a 0 , a 1 , a 2 , a 3 , a 4 , a 5 , a 6 , a 7 } \left\{ a_0,a_1,a_2,a_3,a_4,a_5,a_6,a_7 \right \} {
a0,a1,a2,a3,a4,a5,a6,a7}
第一次二分之后:
{ a 0 , a 2 , a 4 , a 6 } , { a 1 , a 3 , a 5 , a 7 } \left\{ a_0,a_2,a_4,a_6 \right \}, \left\{ a_1,a_3,a_5,a_7 \right \} {
a0,a2,a4,a6},{
a1,a3,a5,a7}
重复……
{ a 0 , a 4 } , { a 2 , a 6 } , { a 1 , a 5 } , { a 3 , a 7 } \left\{a_0,a_4 \right \},\left\{ a_2,a_6 \right \},\left\{ a_1,a_5 \right \},\left\{ a_3,a_7 \right \} {
a0,a4},{
a2,a6},{
a1,a5},{
a3,a7}
直到多项式只有常数项:
{ a 0 } , { a 4 } , { a 2 } , { a 6 } , { a 1 } , { a 5 } , { a 3 } , { a 7 } \left\{ a_0 \right \},\left\{ a_4 \right \},\left\{ a_2 \right \},\left\{ a_6 \right \},\left\{ a_1 \right \},\left\{ a_5 \right \},\left\{ a_3 \right \},\left\{ a_7 \right \} {
a0},{
a4},{
a2},{
a6},{
a1},{
a5},{
a3},{
a7}
让我们不妨将它们的下标化为二进制进行观察
原 数 组 : { ( 000 ) 2 } , { ( 001 ) 2 } , { ( 010 ) 2 } , { ( 011 ) 2 } , { ( 100 ) 2 } , { ( 101 ) 2 } , { ( 110 ) 2 } , { ( 111 ) 2 } 最 终 数 组 : { ( 000 ) 2 } , { ( 100 ) 2 } , { ( 010 ) 2 } , { ( 110 ) 2 } , { ( 001 ) 2 } , { ( 101 ) 2 } , { ( 011 ) 2 } , { ( 111 ) 2 } 原数组:\\ \left\{ (000)_2 \right \},\left\{ (001)_2 \right \},\left\{ (010)_2 \right \},\left\{ (011)_2 \right \},\left\{ (100)_2 \right \},\left\{ (101)_2 \right \},\left\{ (110)_2 \right \},\left\{ (111)_2 \right \}\\ 最终数组:\\ \left\{ (000)_2 \right \},\left\{ (100)_2 \right \},\left\{ (010)_2 \right \},\left\{ (110)_2 \right \},\left\{ (001)_2 \right \},\left\{ (101)_2 \right \},\left\{ (011)_2 \right \},\left\{ (111)_2 \right \} 原数组:{ (000)2},{ (001)2},{ (010)2