| STUDIO KAMADA | Japanese to English by @nifty |
| 離散フーリエ変換を用いた多倍長乗算の話 | 2007-09-22(Sat) 02:16 |
|---|
|
(*1) そのような多倍長の数値データの四則演算を行うライブラリとしては、電脳倶楽部でも Vol.26 と Vol.28 に (*2) こんなの使うの、円周率の計算くらいだよね。 (*3) 勿論、アルゴリズムの検証のために実際に計算してみることは重要だ。 (*4) FFT で掛け算をやろうという時点で既に FFT の使い方を間違っているという話もある。 |
| X | = |
| |||||||
| Y | = |
| |||||||
| X*Y | = |
| |||||||||||||||
| = |
| ||||||||||||||||
| X | = | x1・B + x0 | |
| Y | = | y1・B + y0 | |
| X*Y | = | (x1・B + x0)*(y1・B + y0) | |
| = | x1*y1・B2 + (x1*y0 + x0*y1)・B + x0*y0 (1) | ||
| x1*y0 + x0*y1 | = | -(- x1*y0 - x0*y1) | |
| = | x1*y1 + x0*y0 - (x1*y1 - x1*y0 - x0*y1 + x0*y0) | ||
| = | x1*y1 + x0*y0 - (x1 - x0)*(y1 - y0) (2) | ||
| X*Y | = | (x1・B + x0)*(y1・B + y0) | ||||||||||||||||||
| = | x1*y1・B2 + (x1*y0 + x0*y1)・B + x0*y0 | |||||||||||||||||||
| = |
|
|||||||||||||||||||
|
(*5) この方法は 1962 年に (*6) この事実は私が学生だった頃に自分で発見したものです。 |
| X(m) | = |
|
| (一般的に離散フーリエ変換には係数 |
| ω | = | e2πi/N | = | cos(2π/N) + i・sin(2π/N) |
| (e は自然対数の底、i は虚数単位) |
| ωN | = | 1 |
| ( |
| X(m) | = |
|
|||||||
| Y(m) | = |
|
|||||||
| Z(m) | = | X(m)*Y(m) m=0,1,…,N-1 |
| Z(m) | = | X(m)*Y(m) | |||||||||||||||||||
| = |
|
||||||||||||||||||||
| = | { ω-m*0*x(0) + ω-m*1*x(1) + … + ω-m*(N-1)*x(N-1) } | ||||||||||||||||||||
| * | { ω-m*0*y(0) + ω-m*1*y(1) + … + ω-m*(N-1)*y(N-1) } | ||||||||||||||||||||
| = | ω-m*0*{ x(0)*y(0) + x(1)*y(N-1) + … + x(N-1)*y(1) } | ||||||||||||||||||||
| + | ω-m*1*{ x(0)*y(1) + x(1)*y(0) + x(2)*y(N-1) + … + x(N-1)*y(2) } | ||||||||||||||||||||
| + | ω-m*2*{ x(0)*y(2) + x(1)*y(1) + x(2)*y(0) + x(3)*y(N-1) + … + x(N-1)*y(3) } | ||||||||||||||||||||
| : | |||||||||||||||||||||
| + | ω-m*(N-2)*{ x(0)*y(N-2) + x(1)*y(N-3) + … + x(N-1)*y(N-1) } | ||||||||||||||||||||
| + | ω-m*(N-1)*{ x(0)*y(N-1) + x(1)*y(N-2) + … + x(N-1)*y(0) } | ||||||||||||||||||||
| = |
|
||||||||||||||||||||
| z(n) | = |
|
| x(n) | = | y(n) | = | 0 n=M,M+1,…,2M-1 |
| z(0) | = | x(0)*y(0) | |||||||
| z(1) | = | x(0)*y(1) | + | x(1)*y(0) | |||||
| : | |||||||||
| z(M-2) | = | x(0)*y(M-2) | + | x(1)*y(M-3) | + … + | x(M-2)*y(0) | |||
| z(M-1) | = | x(0)*y(M-1) | + | x(1)*y(M-2) | + … + | x(M-2)*y(1) | + | x(M-1)*y(0) | |
| z(M) | = | x(1)*y(M-1) | + … + | x(M-2)*y(2) | + | x(M-1)*y(1) | |||
| : | |||||||||
| z(2M-3) | = | x(M-2)*y(M-1) | + | x(M-1)*y(M-2) | |||||
| z(2M-2) | = | x(M-1)*y(M-1) | |||||||
| z(2M-1) | = | 0 | |||||||
| X | = |
|
|||||||
| Y | = |
|
|||||||
| X*Y | = |
|
| t(n) | = | x(n) + i・y(n) |
| ( |
| X(m) | = | {Re(T(m)) + Re(T(N-m))}/2 + i・{Im(T(m)) - Im(T(N-m))}/2 | |
| Y(m) | = | {Im(T(m)) + Im(T(N-m))}/2 - i・{Re(T(m)) - Re(T(N-m))}/2 | |
| ( |
| t(n) | = | x(n) + i・y(n) |
| p | := | Re(T(m)) | |
| q | := | Im(T(m)) | |
| r | := | Re(T(N-m)) | |
| s | := | Im(T(N-m)) | |
| ( |
| X(m) | = | {Re(T(m)) + Re(T(N-m))}/2 + i・{Im(T(m)) - Im(T(N-m))}/2 | |
| = | (p + r)/2 + i・(q - s)/2 | ||
| Y(m) | = | {Im(T(m)) + Im(T(N-m))}/2 - i・{Re(T(m)) - Re(T(N-m))}/2 | |
| = | (q + s)/2 - i・(p - r)/2 | ||
| Z(m) | = | X(m)*Y(m) | |
| = | {(p + r)/2 + i・(q - s)/2}*{(q + s)/2 - i・(p - r)/2} | ||
| = | {(p + r) + i・(q - s)}*{(q + s) - i・(p - r)}/4 | ||
| = | {(p + r)*(q + s) - (q - s)*-(p - r)}/4 | ||
| + | i・{(p + r)*-(p - r) + (q - s)*(q + s)}/4 | ||
| = | (p*q + p*s + q*r + r*s + p*q - q*r - p*s + r*s)/4 | ||
| + | i・(- p2 + r2 + q2 - s2)/4 | ||
| = | (p*q + r*s)/2 | ||
| + | i・{(r2 + q2) - (p2 + s2)}/4 | ||
| Z(m) | = | (Re(T(m))*Im(T(m)) + Re(T(N-m))*Im(T(N-m)))/2 | |
| + | i・{(Re(T(N-m))2 + Im(T(m))2) - (Re(T(m))2 + Im(T(N-m))2)}/4 |
| Z(0) | = | Re(T(0))*Im(T(0)) |
| Z(N/2) | = | Re(T(N/2))*Im(T(N/2)) |
| x(n+1) | = | 2*x(n) - A*x(n)2 |
| Copyright (C) 1999-2007 Makoto Kamada All Rights Reserved. | Return from mirror |
|
|