Upload
egan
View
37
Download
1
Embed Size (px)
DESCRIPTION
高速フーリエ変換 (fast Fourier transform). 高速フーリエ変換とは? 簡単に言うとフーリエ変換を効率よく計算する方法 アルゴリズムの設計技法は分割統治法に基づいている 今回の目的は? 多項式の積を求める問題を取り上げ、高速フーリエ変換のアルゴリズムを用いた解法を導いて、計算時間を驚くほど短縮できることを示す. 多項式の積の計算の例1. 以下のような 2 次多項式のp(x)とq(x)をかける この場合2次式のため簡単に出来たが、一般的に N-1 次多項式の時は、このような方法では大変時間 がかかる . どうすればよいのか?. - PowerPoint PPT Presentation
Citation preview
1
高速フーリエ変換(fast Fourier transform)
2
• 高速フーリエ変換とは?– 簡単に言うとフーリエ変換を効率よく計算
する方法– アルゴリズムの設計技法は分割統治法に基
づいている
• 今回の目的は?– 多項式の積を求める問題を取り上げ、高速
フーリエ変換のアルゴリズムを用いた解法を導いて、計算時間を驚くほど短縮できることを示す
3
多項式の積の計算の例1
• 以下のような 2 次多項式のp(x)とq(x)をかける
この場合2次式のため簡単に出来たが、一般的に N-1 次多項式の時は、このような方法では大変時間 がかかる . どうすればよいのか?
回の乗算2N
42
432322
22
2
2
xx2x2
xxx2xxx2xx2
)xx2)(xx1()x(q)x(p
xx2)x(q
xx1)x(p
4
多項式の積の計算を高速化するには?
• N-1 次の多項式は N 個の異なる点における関数値で完全に決まるという事実を利用する( N-1 次式の項の数は定数も含むから N 個)⇒ 2つの N-1 次多項式同士の積は2 N-1 個
の点でその多項式の値が分かっていれば、その積を完全に決定できる
5
2つの N-1 次多項式の積を求める
基本的な手順
• 評価:入力された多項式の値を2 N-1個の 異なる点で計算する
• 乗算:各点でえられた値を掛ける• 補間:上で求めた2 N-1 個の値を補間
する– 補間とは、多項式の N 個の異なる点にお
ける値が与えられた時、その多項式の係数を求めること
6
2N-1 次の多項式R(x)=P(x)Q(x)
2つの N-1 次多項式P(x) Q(x)
乗算の計算時間2N
評価
乗算
補間
フーリエ変換逆フーリエ変換分割統治法を用いて
効率よくしたのが高速フーリエ変換
1N21
1N21
aq,),a(q
ap,),a(p
)a(r,),a(r
)x(q)x(p)x(r
1N21
7
• 例2)
28,6,2,4,24)2(r),1(r),0(r),1(r),2(r
)x(r
4,2,2,4,8)2(q),1(q),0(q),1(q),2(q
7,3,1,1,3)2(p),1(p),0(p),1(p),2(p
xq,xp2,1,0,1,2x
)x(q)x(pxr
xx2)x(q
xx1)x(p2
2
はとなる.すると
を計算するとにおいてを求めたい
8となる.
用いるとラグランジュの公式を
42 xx2x2
12
1x
02
0x
12
1x
22
2x28
21
2x
01
1x
11
1x
21
2x6
20
2x
10
1x
10
1x
20
2x2
21
2x
11
1x
01
0x
21
2x4
22
2x
12
1x
02
0x
12
1x24)x(r
9
ラグランジュの公式
jiNi1 ij
i
Nj1j
NN2211
N21
N21
xx
xxy)x(P
1N
y)x(P,,y)x(P,y)x(P
y,,y,y
x,,x,xNP(x)1N
公式)(ラグランジュの補間
式を用いることラグランジュの補間公この時の古典的な解は
(補間する)次多項式を求めたい.を満たす唯一の
が与えられた時、そこでの値
と個の点の次多項式
10
• 例2の場合、評価と補間それぞれで の計算時間がかかってしまう
• しかし、多項式の値を計算する2 N-1個の点はどこの点を選んでもよいことに注目すると、多項式の積の計算を簡単にする点集合を選べば、効率のよく計算時間を短縮できるのでは?
2N
11
1の複素累乗根• 多項式の積の計算をする点として、1
の複素累乗根を用いると計算を高速化できる
をえる.
で割ると上の式を
ともある.や虚数部が0になるこに乗算の結果、実数部となる.次の例のよう
2つの複素数の積は
12
i
2
1
216
16)i1(
i2)i1)(i1(
i)bcad()bdac()dic)(bia(
8
8
8
12
となる.であるから、はが偶数の時は
が原始8乗根であるで、
例)1の8乗根乗してえられる.をに対して、全ての根は
と表わすと、それを乗根」とよばれ、1の原始これらの中の1つは「
個ある.がとなる複素数に対して、実際、自然数
.1の累乗根とよばれるたくさんあり、して1となる複素数は一般に、その数を累乗
1W1WN
.W1W
W,W,W,W,W,W,W,W
kW1N,,2,1,0k
W
N
NZ1ZN
48N
18
08
78
68
58
48
38
28
18
08
N
N
N
2N
13
N-1 次多項式の値を 1の N 乗根において計算する• 1 の N 乗根における値をそのまま計算し
たのではあまり意味がない• 分割統治法を用いる
– 低次の項から順に交互にとって2つに分ける
– N- 1次多項式の値を N 個の点で計算するために、まず N/2 個の係数の2つの多項式に分割する。そしてそれぞれの多項式の値をN/2 個の点で計算して全体の N 点における値を求めればよい
14
• なぜ分割統治法がいいのか?– 根を2乗すると別の根が得られる– 特に N が偶数の時は、 1の N 乗根を2乗すると、1の N/2 乗根
が得られる例)
実際に N=8 で考えてみる
12
214
14
218
W)W(
W)W(
15
になる.
乗するととなる.次に各項を2
だからまず、
るを1の8乗根で計算す項式する.ここで、7次多上のように2つに分割
の時例3)
34
24
14
04
34
24
14
04
28
38
28
18
08
38
28
18
088
48
78
68
58
48
38
28
18
088
2o
2e
67
45
231
66
44
220
77
66
55
44
33
2210
w,w,w,w,w,w,w,w:W
w,w,w,w,w,w,w,w:W
1w
w,w,w,w,w,w,w,w:W
)x(p
)x(xp)x(p
)xpxpxpxp(x)xpxpxpp(
xpxpxpxpxpxpxpp)x(p
8N
16
),w(pw)w(p)w(p
),w(pw)w(p)w(p
),w(pw)w(p)w(p
),w(pw)w(p)w(p
),w(pw)w(p)w(p
),w(pw)w(p)w(p
),w(pw)w(p)w(p
),w(pw)w(p)w(p
)x(xp)x(p)x(p
34o
38
34e
78
24o
28
24e
68
14o
18
14e
58
04o
08
04e
48
34o
38
34e
38
24o
28
24e
28
14o
18
14e
18
04o
08
04e
08
2o
2e
うな次式が導かれる.に注目すると以下のよ
17
)}pp(i)pp{(i)pp(i)pp(
i)i()w(w
,i)1()w(w
)}pp(w)pp{(w)pp(w)pp(
1w
)}wpp(w)wpp{(w)wpp(w)wpp(
)}wpp(w)wpp{(w)wpp(w)wpp(
)wpwpwpp(w)wpwpwpp(
)w(pw)w(p)w(p
)w(pw)w(p)w(p
73516240
21
211
418
21
211
214
731451
1862
1440
12
1273
14
1251
18
1262
14
1240
2473
14
2451
18
2462
14
2440
347
245
1431
18
346
244
1420
14o
18
14e
18
14o
18
14e
18
だから
また
だからここで、
を計算してみる.実際に、
18
を求める.し、全体のつずつ上にあげて計算あとは
を得る.かはのどちらかだからはこのとき
の時に打ち切る.のように再帰は
する.)のベキ乗であると仮定はとなるので、算で(ただし、再帰的な計
回繰り返す.このような乗算を計算する.乗根において再帰的にのとをと
の計算をする乗根における一般的に、1の
)x(p1
ppppxpp
1)w(,1wx
2Nw
2N
,4/N,2/N
N
2/N1xpxp
)x(pN
101010
212
12
x2
oe
19NlgN2n)2(M)N(M
)Nlgn2N(
n
1112
)2(M
112
)2(M
12
)2(M
2
)2(M
2)2(M2)2(M
2N
N)2/N(M2)N(M
)N(M
N1NNlgN
nn
n
3n
3n
2n
2n
1n
1n
n
n
n1nn
n
よりよって
とおく
これを解くと、
再帰式はとする.分割統治法の乗算の回数をを参照証明)第6章漸化式4
る乗根において計算でき次多項式の値を1の回の乗算によって、約性質41.1
20
1の累乗根の関数値の補間• 1の累乗根を用いて高速で多項式の値が得られ
た⇒ その値を高速で補間すれば、高速で多項式の積
が求まったことになる.
補間する点集合が1の累乗根ならば、関数値を計算する手順で補間多項式も求まる!
フーリエ変換とその逆変換を使っているから!!
なぜなら
21使える.そのまま補間の計算に関数値の計算の手順が点を並び替えるだけでつまり値の計算すべき
の逆順にしただけは1の8乗根をここで、数列
)だからが求まる.(
の係数において計算すると、
数の値を1の累乗根の逆とする.多項式
とする多項式を各点における値を係数
を求めることである.数次の値をとるように係が1の8乗根において
式の例で、補間は、多項前と同じ
.w,w,w,w,w,w,w,w:W
WW
r8)w(ss)w(r
.r,r,r,r,r,r,r,r
)x(r
.w,w,w,w,w,w,w,w:W
)x(s
xsxsxsxsxsxsxss)x(s
.s)w(rs)w(rs)w(rs)w(r
s)w(rs)w(rs)w(rs)w(r
)8i0(r
xrxrxrxrxrxrxrr)x(r
8N
18
28
38
48
58
68
78
08
18
81
8
11
8118
76543210
78
68
58
48
38
28
18
08
18
77
66
55
44
33
2210
778,6
68,5
58,4
48
,338,2
28,1
18,0
08
i
77
66
55
44
33
2210
22
01w
1wwti
Nw,rrti
Nrwr
wr
)w()w(r
)w)(w(r
)w(s)w(s
)x(stN1
tiN
NtiN
Nj0
tijN
Nj0
tijNt
Ni0i
tNj0
tijN
Ni0i
tijN
Ni0i
Nj0
jtN
ijN
Ni0i
Nj0
jtN
jN
Nj0
jtN
Nj0j
tN
の時、
の時、
となる.
の値を計算すると、る番目の値の逆数におけ乗根のの
23
1
8i0
1ij8
8j0i
1ij8
8i0i
8j0
718
7787
7810
18
7187
1810
7087
0810
j18
ij8
8i0i
8j0
778
78
228
28
18
18
08
j18
j8
8j0
7187
2182
1810
j18
8j0j
18
r8wr
wr
)w()w(rwrr
w)w(rwrr)w(rwrr
)w()w(r
wwrwwrwwrwr
)w)(w(r
)w(s)w(swss
)w(s)w(s
)x(s181
の値を計算すると、る番目の値の逆数におけ乗根のの
24
• 性質41.21の N 乗根における値が与えられた N-1 次多項式の係数を、約 NlgN 回の乗算で求めることが出来る.
これは補間の計算は多項式の値の計算の逆であるから性質41.1より乗算は約 NlgN 回となる.
多項式の値の計算と補間の計算の乗算の回数は NlgN 回であるが、あくまで1の N 乗根に対してだ
け あてはまる
25
eval(p, outN, 0);eval(q, outN, 0);for (i = 0; i <= outN; i++) r[i] = p[i]*q[i];eval(r, outN, 0);for (i = 1; i <= N; i++) { t = r[i]; r[i] = r[outN+1-i]; r[outN+1-i] = t; }for (i = 0; i <= outN; i++) r[i] = r[i]/(outN+1);
・大域変数 outN に2 N-1 が与えられている.・ p,q,r は添字の範囲が0から2 N-1 の複素数の配列 と仮定されている.・多項式 p,q は N-1 次であり、 N 次より上位の係数
は0に 初期化されている.
26
手続き eval
• 1番目の引き数– 多項式の係数を、1の累乗根における多項
式の値に書き換える• 2番目の引き数
– 多項式の次数(係数の数、1の根の数より1少ない)
手続き eval の目的N+1 個の係数が連続して入っている配列を入力
として、同じ配列に N+1 個の関数値を入れて返す
こと
27
• しかし、再帰呼出しでは連続していない偶数番目と奇数番目の係数の配列を入れかえなければならない.⇒ここで用いられるのが、完全シャッフル
• 完全シャッフルをすることにより配列の前半に連続して偶数番目の係数を入れ、後半に奇数番目の係数を入れることが出来る.
28
完全シャッフル
P[0] P[1] P[2] P[3] P[4] P[5] P[6] P[7]
P[0] P[2] P[4] P[6] P[1] P[3] P[5] P[7]
29
高速フーリエ変換のプログラム
• 実際計算する時の 1 の N 乗根の値は、
• 配列 w に 1 の (outN+1) 乗根が入っている
上のことも考慮すると次のような高速フーリエ変換のプログラムとなる.
1N
j2sini
1N
j2cosw j
N
30
eval(struct complex p[], int N, int k)
{ int i, j; if (N == 1) { p0 = p[k]; p1 = p[k+1]; p[k] = p0+p1; p[k+1] = p0-p
1; } else { for (i = 0; i <= N/2; i++){ j = k+2*i; t[i] = p[j]; t[i+1+N/2] = p[j
+1]; }
for (i = 0; i <= N; i++) p[k+i] = t[i];
eval(p, N/2, k); eval(q, N/2, (k+1+N)/2); j = (outN+1)/(N+1); for (i = 0; i <= N/2; i++) { p0 =
w[i*j]*p[k+(N/2)+1+i]; t[i] = p[k+i]+p0; t[i+(N/2)+1] = p[k+i]-p
0; } for (i = 0; i <= N; i++) p[k
+i] = t[i]; } }
31
• 性質41.32 つの N-1 次多項式の積は 2NlgN+O(N)回の複素数の計算によって求められる.
性質41.1と性質41.2より、 N-1 次多項式を 1 の N 乗根の値への変換と補間の乗算の回数はそれぞれ NlgN回である.また 1 の N 乗根に変換した値を掛け合わせるのに O(N) の乗算が必要だから、積の回数は 2NlgN+O(N) 回となる.
32
により補間する③ ①: と同じ計算手順
合わせる.②:変換した値を掛け
乗根を使う)の(このときる.個の異なる点で計算す次多項式をつの①:
手順◎高速フーリエ変換の
回うと、高速フーリエ変換を使回の回数は普通に掛けると、乗算
時、次多項式の積を求めるつの◎
まとめ
N1
1N21N2
NONlgN2
N
1N22