1.
ATCODER TYPICAL CONTEST 001
C 高速フーリエ変換
AtCoder 株式会社
2.
問題概要
AtCoder 食堂では,
円の主菜が 種類
円の副菜が 種類
i Ai
j Bj
ある.
ちょうど 円になる, 主菜と副菜一つずつの組合せがい
くつあるかを出力せよ.
k
3.
畳込み
ちょうど 円になる組合せの数を とすると, 主菜で
円の物を選んだ時, 副菜として 円の物を選べばよ
く,
となる. 但し, とおく.
k Ck i
k − i
=Ck
∑
i=0
k
Ai Bk−i
= = 0A0 B0
このような を, と の畳込み (convolution) という.C A B
4.
畳込みから多項式乗算へ
ここで, , を係数とする多項式
を考えると, その積は
で定まる.
A B
g(x) = ,
∑
i=0
N
Ai x
i
h(x) =
∑
j=0
N
Bj x
j
(g ∗ h)(x) = g(x) ∗ h(x)
=
∑
i=0
N
∑
j=0
N
Ai Bj x
i+j
5.
畳込みから多項式乗算へ
ここで, とおいて
を書きなおすと,
i + j = k
(g ∗ h)(x) =
∑
i=0
N
∑
j=0
N
Ai Bj x
i+j
(g ∗ h)(x) =
( )
∑
k=0
2N
∑
i=0
k
Ai Bk−i x
k
=
∑
k=0
2N
Ck x
k
となるから, この が計算出来ればよい.(g ∗ h)(x)
6.
多項式乗算
を高速に求めたい.(g ∗ h)(x)
普通に書くと, こんな感じで .O (deg(g) ∗ deg(h))
def multiply(g, h):
f = [ 0 for _ in range(len(g) + len(h) 1) ]
for i in range(len(g)):
for j in range(len(h)):
f[i+j] += g[i] * h[j]
return f
9.
点の選び方
実際には, が の冪乗になるようにし, と
しては の 乗根全体を選ぶ.
n 2 , …,x0 xn−1
1 n
つまり, として, とする.= exp(2π /n)ζn −1‾‾‾√ =xi ζi
n
10.
の性質ζn
には, 次の性質がある.= exp(2π /n)ζn −1‾‾‾√
.
"直交性" が成り立つ. すなわち,
(最後の は, 等比級数の和の公式から.)
= ⇔ i = j mod nζi
n ζj
n
=
∑
i=0
n−1
( )ζj
n
i
( )
ζk
n
⎯ ⎯⎯⎯⎯⎯ i
∑
i=0
n−1
ζi(j−k)
n
=
{
n, if j = k mod n,
0, otherwise.
= 0
を で置き換えても, これらの性質は変わらない.ζn ζ−1
n
11.
離散フーリエ変換
前述の通り, として, 評価と補完をする. こうする
と, 何がよいのかを見ていこう.
=xi ζi
n
多項式 に対し, を
で定める. つまり, 評価した各点での値を係数に持つ多項
式である.
f (x) (t)fˆ
(t) = f ( )fˆ
∑
i=0
n−1
ζi
n t
i
これを, の離散フーリエ変換 (Discrete Fourier
Transformation, DFT) と呼ぶ.
f
12.
離散フーリエ変換
とすると,f (x) = ∑n−1
j=0
cj x
j
(t)fˆ = f ( )
∑
i=0
n−1
ζi
n t
i
=
(
(
)
∑
i=0
n−1
∑
j=0
n−1
cj ζi
n )
j
t
i
= ( t
∑
j=0
n−1
cj
∑
i=0
n−1
ζj
n )
i
13.
離散フーリエ逆変換
を求めてみると,
だが,
だったから,
( )fˆ ζ−k
n
( )fˆ ζ−k
n = (
∑
j=0
n−1
cj
∑
i=0
n−1
ζj
n ζ−k
n )
i
=
{∑
i=0
n−1
ζi(j−k)
n
n, if j = k mod n,
0, otherwise
( )fˆ ζ−k
n = n .ck
14.
離散フーリエ逆変換
よって, の DFT
から,
と, を で置き換えた DFT で を復元出来る. こ
れを, 離散フーリエ逆変換と呼ぶ.
f
(t) = f ( )fˆ
∑
i=0
n−1
ζi
n t
i
f (x) = ( )
1
n ∑
i=0
n−1
fˆ ζ−i
n x
i
ζn ζ−1
n f (x)
15.
積の離散フーリエ変換 (DFT)
さて, "多項式を評価した値" を係数としたのだから当然
ではあるが, は,
と, と の係数毎の積で求められる.
(t)g ∗ hˆ
(t)g ∗ hˆ = (g ∗ h)( )
∑
i=0
n−1
ζi
n t
i
= g( )h( )
∑
i=0
n−1
ζi
n ζi
n t
i
gˆ hˆ
19.
高速フーリエ変換
の冪乗 と 次以下の多項式
に対し,
とすると,
で, , はそれぞれ 次以下の多項式.
2 n n − 1 f (x) = ∑n−1
i=0
ci x
i
(x)f0
(x)f1
= = + + + …,
∑
i=0
n/2−1
c2i x
i
c0 x
0
c2 x
1
c4 x
2
= = + + + …∑
i=0
n/2−1
c2i+1 x
i
c1 x
0
c3 x
1
c5 x
2
f (x) = ( ) + x ( )f0 x
2
f1 x
2
f0 f1 n/2 − 1
20.
高速フーリエ変換
を求めるには,fˆ
f ( ), f ( ), …, f ( )ζ0
n ζ1
n ζn−1
n
を求められればよかったが, だ
から,
f (x) = ( ) + x ( )f0 x
2
f1 x
2
( ), ( ), …, ( ),f0 ζ0
n f0 ζ2
n f0 ζ2(n−1)
n
( ), ( ), …, ( )f1 ζ0
n f1 ζ2
n f1 ζ2(n−1)
n
を求めればよい.
21.
高速フーリエ変換
だから,
= exp (2 ∗ 2π /n) = exp (2π /(n/2)) =ζ2
n −1‾‾‾√ −1‾‾‾√ ζn/2
( ), ( ), …, ( ),f0 ζ0
n f0 ζ2
n f0 ζ2(n−1)
n
( ), ( ), …, ( )f1 ζ0
n f1 ζ2
n f1 ζ2(n−1)
n
は,
( ), ( ), …, ( ),f0 ζ0
n/2
f0 ζ1
n/2
f0 ζn−1
n/2
( ), ( ), …, ( )f1 ζ0
n/2
f1 ζ1
n/2
f1 ζn−1
n/2
と同じ.
Be the first to comment