1

FFT および IFFT 関数があります。そして、私はそれを知っています

A*B = IFFT(FFT(A)*FFT(B))

どこ

FFT(A) FFT(B)=[ zip(A,B) の q,w に対する q w]

しかし、入力すると: 10 10 => 出力: [(0.5+0j), (0.5+0j)] 何が間違っているのでしょうか? これが私のコードです:

from cmath import exp,pi

def FFT(X):
    n = len(X)
    w = exp(-2*pi*1j/n)
    if n > 1:
        X = FFT(X[::2]) + FFT(X[1::2])
        for k in range(n//2):
            xk = X[k]
            X[k] = xk + w**k*X[k+n//2]
            X[k+n//2] = xk - w**k*X[k+n//2]
    return X

def IFFT(X):
    n = len(X)
    w = exp(2*pi*1j/n)
    if n > 1:
        X = IFFT(X[::2]) + IFFT(X[1::2])
        for k in range(n//2):
            xk = X[k]
            X[k] = (xk + w**k*X[k+n//2])/n
            X[k+n//2] = ((xk - w**k*X[k+n//2]))/n
    return X

s = input().split()
a1 = s[0]
b1 = s[1]
a = [int(x) for x in a1]
b = [int(x) for x in b1]
if (len(a)>len(b)):
   n = len(a)
   b.reverse()
   while (len(b)<n):
       b.extend([0])
   b.reverse()
else:
    n = len(b)
    a.reverse()
    while(len(a)<n):
        a.extend([0])
    a.reverse()
c = [q*w for q,w in zip(a,b)]

print (IFFT(c))
4

1 に答える 1

1

実際には、FFT を入力シーケンスaおよびに適用する必要がありますb。大規模なパディング手順の後に見落としがあるようです。

c = IFFT( [ q*w for q,w in zip( FFT(a), FFT(b) ) ] )

あなたがしていることは、多くの方法の 1 つで、次の多項式乗算を実行していると解釈できます。

a[0]+a[1]*z+...+a[n-1]*z^(n-1)  mod (z^n-1) 

b[0]+b[1]*z+...+b[n-1]*z^(n-1)  mod (z^n-1) 

最初nに単位円上の等距離点で評価し、点の値を乗算してから、乗算された値から結果の多項式を補間します。実装、特に1/nへの係数の配布は、IFFTこの手順に準拠しています。

于 2015-04-26T16:40:48.257 に答える