add FFT algorithm to be merged
parent
0ae417b362
commit
069603e621
|
@ -0,0 +1,56 @@
|
||||||
|
# Recursive Fast Fourier Transform (FFT) applied
|
||||||
|
# to polynomial multiplication. The basic algorithm proceeds
|
||||||
|
# as followes:
|
||||||
|
# 1. Add n higher-order zero coefficients to A(x) and B(x)
|
||||||
|
# 2. Evaluate A(x) and B(x) using FFT for 2n points
|
||||||
|
# 3. Pointwise multiplication of point-value forms
|
||||||
|
# 4. Interpolate C(x) using FFT to compute inverse DFT
|
||||||
|
# FFT can perform Discrete Transform and Inverse Discrete
|
||||||
|
# Transform (IDFT) in average O(n log n) time.
|
||||||
|
|
||||||
|
from math import sin,cos,pi
|
||||||
|
|
||||||
|
# Recursive function of FFT
|
||||||
|
def fft(a):
|
||||||
|
|
||||||
|
n = len(a)
|
||||||
|
|
||||||
|
# if input contains just one element
|
||||||
|
if n == 1:
|
||||||
|
return [a[0]]
|
||||||
|
|
||||||
|
# For storing n complex nth roots of unity
|
||||||
|
theta = -2*pi/n
|
||||||
|
w = list( complex(cos(theta*i), sin(theta*i)) for i in range(n) )
|
||||||
|
|
||||||
|
# Separe coefficients
|
||||||
|
Aeven = a[0::2]
|
||||||
|
Aodd = a[1::2]
|
||||||
|
|
||||||
|
# Recursive call for even indexed coefficients
|
||||||
|
Yeven = fft(Aeven)
|
||||||
|
|
||||||
|
# Recursive call for odd indexed coefficients
|
||||||
|
Yodd = fft(Aodd)
|
||||||
|
|
||||||
|
# for storing values of y0, y1, y2, ..., yn-1.
|
||||||
|
Y = [0]*n
|
||||||
|
|
||||||
|
middle = n//2
|
||||||
|
for k in range(n//2):
|
||||||
|
w_yodd_k = w[k] * Yodd[k]
|
||||||
|
yeven_k = Yeven[k]
|
||||||
|
|
||||||
|
Y[k] = yeven_k + w_yodd_k
|
||||||
|
Y[k + middle] = yeven_k - w_yodd_k
|
||||||
|
|
||||||
|
return Y
|
||||||
|
|
||||||
|
|
||||||
|
# Driver code
|
||||||
|
if __name__ == '__main__':
|
||||||
|
|
||||||
|
a = [1, 2, 3, 4]
|
||||||
|
b = fft(a)
|
||||||
|
for B in b:
|
||||||
|
print(B)
|
Loading…
Reference in New Issue