O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

多倍長整数の乗算と高速フーリエ変換

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Carregando em…3
×

Confira estes a seguir

1 de 32 Anúncio

多倍長整数の乗算と高速フーリエ変換

Baixar para ler offline

多倍長整数の乗算を高速に行うアルゴリズムを、カラツバ法から始めて、最終的に高速フーリエ変換を用いた乗算に至るまでを解説しました。

多倍長整数の乗算を高速に行うアルゴリズムを、カラツバ法から始めて、最終的に高速フーリエ変換を用いた乗算に至るまでを解説しました。

Anúncio
Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (17)

Semelhante a 多倍長整数の乗算と高速フーリエ変換 (20)

Anúncio

Mais de 京大 マイコンクラブ (20)

Mais recentes (20)

Anúncio

多倍長整数の乗算と高速フーリエ変換

  1. 1. 多倍長整数の乗算と高速フーリエ変換 KMC6 回生 prime 2018/11/01
  2. 2. 2 自己紹介 ● KMC-ID: prime ● Twitter: @_primenumber ● Mastodon: @prime@mstdn.poyo.me ● KMC での活動 – 競技プログラミング – 難解プログラミング言語 – 電子錠の管理 (root) – 第 37 代会計
  3. 3. 3 目次 ● コンピューターにおける整数の表現 ● 多倍長整数とは ● ナイーブな乗算アルゴリズム ● Karatsuba 法 ● Toom-3/4 法 ● 高速フーリエ変換
  4. 4. 4 コンピューターにおける整数の表現 ● 多くのコンピューターでは整数は二進数で表される ● 負の数は 2 の補数を使って表される ● 1 バイトなら -128 〜 127 ● 2 バイトなら -32768 〜 32767 ● 4 バイトなら -2147483648 〜 2147483647 ● 8 バイトなら -9223372036854775808 〜 9223372036854775807 ● 有限のバイト数では有限の大きさしか表せない
  5. 5. 5 多倍長整数 ● 8 バイトでも表せないような、大きな数値を扱いたい ときがある ● 複数の小さな整数表現を組み合わせて大きな数値を扱う ● 非負整数 を 進数で書くと、 ●    とすれば   個の 4 バイトデータで表せる x B x=a0+a1 B+a2 B2 +⋯+aN BN (0≤ai<B) B≤232 N+1
  6. 6. 6 ナイーブな乗算アルゴリズム ● 筆算と同様に下の桁から計算する x=∑i=0 N ai Bi y=∑j=0 M bj B j xy=∑i=0 N ∑j=0 M ai bj Bi+ j = ∑l=0 N+M Bl ∑ i=max(0,l−M) min(N ,l) ai bl−i
  7. 7. 7 Karatsuba 法 ●        とおく      とかける ● このとき、積  を と書ける ●  の桁数の積 3 回に分解できた ● 加算や減算が増えるが、計算量としては小さい C=B⌈max(N , M )/2⌉ x=c0+c1 C y=d0+d1 C xy xy=(c0+c1 C)(d0+d1 C)=c0 d0+(c1 d0+c0 d1)C+c1 d1 C2 =c0 d0(1+C)−(c1−c0)(d1−d0)C+c1 d1(C+C2 ) 1 2
  8. 8. 8 Karatsuba 法 ●  の桁数の乗算 3 回(と加算数回)に帰着できるので これより 1 2 f (N)=3 f ( N 2 )+O( N) f (N)∈O(N log 3 log 2 )⊂O(N 1.585 )
  9. 9. 9 Toom-3 ●        とおく         と書ける ● ここで多項式        を とおくと、積  は   と書ける C=B⌈max(N , M )/3⌉ x=c0+c1 C+c2 C2 y=d0+d1 C+d2 C2 f (z) , g(z) , h(z) f (z)=c0+c1 z+c2 z2 g(z)=d0+d1 z+d2 z2 h(z)=f (z) g(z) xy h(C)
  10. 10. 10 Toom-3 ●   は 4 次多項式なので、 と書ける。この係数 を求めたい ● 4 次多項式は 5 点での値が分かれば一意に定まる ● 適当に を取り、 を計算する h(z) h(z)=e0+e1 z+e2 z2 +e3 z3 +e4 z4 ki=h(zi)=f (zi) g(zi)(0≤i≤4) zi ei
  11. 11. 11 Toom-3 ● 連立方程式 を解く(ヴァンデルモンド行列なので解ける) ● あとは得られた  に を代入するだけ ( 1 z0 z0 2 z0 3 z0 4 1 z1 z1 2 z1 3 z1 4 1 z2 z2 2 z2 3 z2 4 1 z3 z3 2 z3 3 z3 4 1 z4 z4 2 z4 3 z4 4 )( e0 e1 e2 e3 e4 )= ( k0 k1 k2 k3 k4 ) h(z) C
  12. 12. 12 Toom-3 ● GMP ( GNU の多倍長整数ライブラリ)では が使われている – inf は      とするなど特別扱い ●  の桁数の積 5 回に帰着できる ● 計算量は zi=0,1,−1,2,inf h(inf )=c2 d2 1 3 O( N log 5 log 3 )⊂O( N 1.465 )
  13. 13. 13 Toom-4 ● 整数を の桁数に分けて多項式を作る ● 結果の多項式は 6 次なので 7 点あれば決定できる ●  の桁数の積 7 回に帰着できる ● 計算量は 1 4 1 4 O( N log 7 log 4 )⊂O( N 1.404 )
  14. 14. 14 さらなる高みへ ● もっと細かく分割すれば計算量減りそう ●  の桁数の乗算    回に帰着できそう ● 計算量は      になる…? –    なら   …? 1 K 2 K−1 O( N log(2 K −1) log K ) K →∞ O( N)
  15. 15. 15 さらなる高みへ ● もっと細かく分割すれば計算量減りそう ●  の桁数の乗算    回に帰着できそう ● 計算量は      になる…? –    なら   …? 1 K 2 K−1 O( N log(2 K −1) log K ) K →∞ O( N)これは嘘
  16. 16. 16 さらなる高みへ ●  が大きい場合、多項式の値の計算や連立方程式を解く 計算の計算量が無視できない ● その計算量はともに ● この計算量を小さくしたい K O(K 2 ( N K ))=O(KN)
  17. 17. 17 多項式の値の計算 ● 多項式の値の計算は行列とベクトルの積で書ける ● 行列を 、ベクトルを  とおけば ( 1 z0 z0 2 ⋯ z0 N 1 z1 z1 2 ⋯ z1 N 1 z2 z2 2 ⋯ z2 N ⋮ ⋮ ⋮ ⋱ ⋮ 1 zN zN 2 ⋯ zN N )( a0 a1 a2 ⋮ aN )= ( k0 k1 k2 ⋮ kN ) Z a , k Za=k
  18. 18. 18 連立方程式の求解 ● 連立方程式   の解は とかける ● これも行列とベクトルの積 ●  と  がともにベクトルに掛けるときの計算量が 小さければ良い – そうなるような が欲しい Ze=k e=Z−1 k Z Z−1 zi
  19. 19. 19 高速フーリエ変換 ● 実は        とおくと良い – それぞれ 1 の N 乗根 ●         とおくと ● このときの行列ベクトル積を高速に計算する アルゴリズムが高速フーリエ変換 ●    のとき、   とおくと zj=exp(2πi j N ) WN=exp(2πi 1 N ) zj=W N j N=4 Z= ( W0 W0 W0 W0 W0 W1 W2 W3 W0 W2 W4 W6 W0 W3 W6 W9)W=W4
  20. 20. 20 高速フーリエ変換 ●   をより簡単な演算に帰着することを考える ●  の添字の順番を入れ替えると Za Za= ( W0 W0 W0 W0 W0 W1 W2 W3 W0 W2 W4 W6 W0 W3 W6 W9)( a0 a1 a2 a3 ) ( W0 W0 W0 W0 W0 W2 W1 W3 W0 W4 W2 W6 W0 W6 W3 W9)( a0 a2 a1 a3 ) a
  21. 21. 21 高速フーリエ変換 ●    を利用すると、WN =1 ( W0 W0 W0 W0 W0 W0 W0 W2 W1 W0 W1 W2 W0 W0 W2 W0 W2 W0 W0 W2 W3 W0 W3 W2)( a0 a2 a1 a3 ) = ( 1 0 W0 0 0 1 0 W1 1 0 W2 0 0 1 0 W3)( W2 0 W2 0 0 0 W2 0 W2 1 0 0 0 0 W2 0 W2 0 0 0 W2 0 W2 1)( a0 a2 a1 a3 )
  22. 22. 22 高速フーリエ変換 ●    のとき    とすると、N=8 Za= ( W0 W0 W0 W0 W0 W0 W0 W0 W0 W1 W2 W3 W4 W5 W6 W7 W0 W2 W4 W6 W8 W10 W12 W14 W0 W3 W6 W9 W12 W15 W18 W21 W0 W4 W8 W12 W16 W20 W24 W28 W0 W5 W10 W15 W20 W25 W30 W35 W0 W6 W12 W18 W24 W30 W36 W42 W0 W7 W14 W21 W28 W35 W42 W49 )( a0 a1 a2 a3 a4 a5 a6 a7 ) W=W8
  23. 23. 23 高速フーリエ変換 ●  の添字の順番を入れ替えると ( W0 W0 W0 W0 W0 W0 W0 W0 W0 W4 W2 W6 W1 W5 W3 W7 W0 W8 W4 W12 W2 W10 W6 W14 W0 W12 W6 W18 W3 W15 W9 W21 W0 W16 W8 W24 W4 W20 W12 W28 W0 W20 W10 W30 W5 W25 W15 W35 W0 W24 W12 W36 W6 W30 W18 W42 W0 W28 W14 W42 W7 W35 W21 W49 )( a0 a4 a2 a6 a1 a5 a3 a7 ) a
  24. 24. 24 高速フーリエ変換 ●    を利用すると、 ( W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W4 W2 W6 W1 W0 W1 W4 W1 W2 W1 W6 W0 W8 W4 W12 W2 W0 W2 W8 W2 W4 W2 W12 W0 W12 W6 W18 W3 W0 W3 W12 W3 W6 W3 W18 W0 W0 W0 W0 W4 W0 W4 W0 W4 W0 W4 W0 W0 W4 W2 W6 W5 W0 W5 W4 W5 W2 W5 W6 W0 W8 W4 W12 W6 W0 W6 W8 W6 W4 W6 W12 W0 W12 W6 W18 W7 W0 W7 W12 W7 W6 W7 W18 )( a0 a4 a2 a6 a1 a5 a3 a7 ) W8 =1
  25. 25. 25 高速フーリエ変換 ●  は2つの行列   で  と表せるZ Z0, Z1 Z0= ( 1 0 0 0 W0 0 0 0 0 1 0 0 0 W1 0 0 0 0 1 0 0 0 W2 0 0 0 0 1 0 0 0 W3 1 0 0 0 W4 0 0 0 0 1 0 0 0 W5 0 0 0 0 1 0 0 0 W6 0 0 0 0 1 0 0 0 W7 ) Z0 Z1
  26. 26. 26 高速フーリエ変換 ●  は2つの行列   で  と表せるZ Z0, Z1 Z1= ( W4 0 W4 0 W4 0 W4 0 0 0 0 0 W4 0 W4 2 W4 1 W4 3 0 0 0 0 W4 0 W4 4 W4 2 W4 6 0 0 0 0 W4 0 W4 6 W4 3 W4 9 0 0 0 0 0 0 0 0 W4 0 W4 0 W4 0 W4 0 0 0 0 0 W4 0 W4 2 W4 1 W4 3 0 0 0 0 W4 0 W4 4 W4 2 W4 6 0 0 0 0 W4 0 W4 6 W4 3 W4 9 ) Z0 Z1
  27. 27. 27 高速フーリエ変換 ●  は   のときの変換を2回やっているだけ –    のときのようにさらに分解できる ● 同様にして   のときの計算は   のときの計算 2 回(と重み付きの足し算  )に帰着できる ● 最初に 個の 桁精度の 1 の 乗根を求めておく ●  桁の乗算の計算量を   とすると Z1 N=4 N=4 N=2 p N= p Z0 N ND h(D)D f (N , D)=2 f ( N 2, D)+O(Nh( D)) f (N , D)∈O( Nh(D)log N)
  28. 28. 28 高速逆フーリエ変換 ●    のときの  は と書ける ● 同様にして高速に計算可能 N=4 Z−1 Z−1 = 1 4 ( W0 W0 W0 W0 W0 W−1 W−2 W−3 W0 W−2 W−4 W−6 W0 W−3 W−6 W−9)
  29. 29. 29 高速フーリエ変換による多倍長乗算 ● 整数  を   次の多項式に変換する ● それぞれ 次の高速フーリエ変換する ● 同じ添字の要素同士をかけ合わせる ●  次の高速逆フーリエ変換する ● 繰り上がりの処理をして整数に直す N 2 −1a ,b N N
  30. 30. 30 高速フーリエ変換による多倍長乗算 ●  分割したときの計算量は、フーリエ変換時に       桁の精度が必要なので、 ●      として計算すると などが示せる(がんばればもう少し抑えられる) hK ( N)=O(Kh(log K + N K )log K + N log(2 K −1) log K ) K O(log K + N K ) K= N log N h( N)∈O( N log N log2 log N)
  31. 31. 31 まとめ ● 多項式を用いて多倍長乗算を高速化した ● その際に高速フーリエ変換を用いた
  32. 32. 32 おわり

×