Cooley-Tukey算法python超出范围

时间:2016-04-26 15:01:03

标签: python algorithm

我正在分析用Python编写的Cooley-Tukey算法实现的复杂性(代码取自here):

def fft(x):
N = len(x)
print N, N//2
if N <= 1:
    return x
even = fft(x[0::2])
odd = fft(x[1::2])
T = [exp(-2j*pi*k/N)*odd[k] for k in range(N//2)]
return [even[k] + T[k] for k in range(N//2)] + [even[k] - T[k] for k in range(N//2)]

该代码适用于网页中显示的示例;实际上,它似乎适用于任何长度为&lt; = 9的列表。出于某种原因,尝试使用长度列表&gt; 10:

print( ' '.join("%5.3f" % abs(f) for f in fft([0,1,2,3,4,5,6,7,8,9])))

返回以下错误:

T = [exp(-2j*pi*k/N)*odd[k] for k in range(N//2)]
     

IndexError:列表索引超出范围

有谁知道失败的原因?

2 个答案:

答案 0 :(得分:2)

您使用的Cooley-Tukey实现假设输入长度是2的幂。到目前为止,Power-of-two输入长度是Cooley-Tukey最容易实现的;将此代码扩展为非幂的两个输入长度需要完全重写它。

答案 1 :(得分:1)

这是数字错误len(odd)<N//2。以下代码

try:
    T = [exp(-2j*pi*k/N)*odd[k] for k in range(N//2)]
except IndexError:
    print len(odd), N
    raise

将打印出来

4 10

表示N==10len(odd)==4,因此您获得了IndexError。