이산푸리에변환DFT은 수식적인 정의를 순진하게 따라서 계산할 경우 O(N2)의 시간복잡도를 가지지만, 아래에서 설명할 알고리즘에 따라 계산하면 시간복잡도가 O(Nlog2N)로 내려간다. 이산푸리에변환을 빠르게 수행하는 이러한 알고리즘을 고속푸리에변환fast Fourier transform, FFT이라고 한다.
빌드업
두 숫자를 곱하고, 그것을 다시 다른 숫자와 더하는 것을 1번의 연산operation이라고 하자. 그러면 i=0∑n−1anbn의 값을 얻기 위해선 n번의 연산이 필요하다.
a^m을 계산하기 위해서는 N번의 연산이 필요하고 a^를 계산하기 위해선 이를 N번 수행해야하므로, 이산 푸리에 변환을 계산하기 위해서는 총 N2번의 연산이 필요하다. 즉 O(N2)의 시간복잡도를 가진다. 이는 컴퓨터 계산의 측면에서 푸리에 변환이 적지 않은 코스트를 가짐을 의미한다.
알고리즘
데이터의 길이 N을 합성수N=N1N2라고 하자. 그리고 인덱스 m,n을 다음과 같이 두자.
m=m′N1+m′′,n=n′N2+n′′
그러면 0≤m′,n′′≤N2−1이고, 0≤m′′,n′≤N1−1이다. (1)의 지수부분을 다음과 같이 나타내자.
위 식대로라면 각괄호 안의 [∑n′=0N1−1]를 계산하는데 N1번의 연산, 각괄호 밖의 ∑n′′=0N2−1를 계산하는데 N2번의 연산이 필요하므로, a^m을 계산하기 위해서는 총 (N1+N2)번의 연산이 필요함을 알수 있다. a^를 얻기 위해선 이를 N번 반복해야하므로 총 N(N1+N2)의 비용이 들어 N2보다 줄어들었음을 확인할 수 있다.
각괄호 안을 잘 보면, N1이 다시 합성수일 때 같은 논리를 적용할 수 있음을 알 수 있을 것이다. 따라서 일반적으로 데이터의 길이가 N=N1N2⋯Nk와 같은 합성수일 때, 시간복잡도는 다음과 같이 줄어든다.
O(N2)↘O(N(N1+N2+⋯+Nk))
이제 N을 2의 제곱수 N=2k라고 해보자. 그러면 log2N=k이고, N2=2k에서 2k(2k)만큼 줄어드는 것이므로, 시간 복잡도는 다음과 같이 줄어든다.
O(N2)↘O(2Nlog2N)
여담
이는 1965년 Cooley와 Tukey2에 의해 제안되었기 때문에 쿨리-튜키 알고리즘Cooley-Tukey algorithm이라고도 불린다. 하지만 이들이 최초로 발명한 것은 아니다. 가우스도 이와 같은 알고리즘을 연구했지만, 제대로 발표하지 않아 이 사실은 후에 알려지게되었다3.
Gerald B. Folland, Fourier Analysis and Its Applications (1992), p252-253 ↩︎
J. W. Cooley and J. W. Tukey, An algorithm for the machine calculation of complex Fourier series, Mathematics of Computation 19 (1965), 297-301. ↩︎
M. T. Heideman, D. H. Johnson, and C. S. Burms, Gauss and the history of the fast Fourier transform, Archive for the History of the Exact Sciences 34 (1985), 264-277. ↩︎