SlideShare a Scribd company logo
1 of 32
Download to read offline
多倍長整数の乗算と高速フーリエ変換
KMC6 回生 prime
2018/11/01
2
自己紹介
●
KMC-ID: prime
●
Twitter: @_primenumber
●
Mastodon: @prime@mstdn.poyo.me
●
KMC での活動
– 競技プログラミング
– 難解プログラミング言語
– 電子錠の管理 (root)
– 第 37 代会計
3
目次
●
コンピューターにおける整数の表現
●
多倍長整数とは
●
ナイーブな乗算アルゴリズム
●
Karatsuba 法
●
Toom-3/4 法
●
高速フーリエ変換
4
コンピューターにおける整数の表現
●
多くのコンピューターでは整数は二進数で表される
●
負の数は 2 の補数を使って表される
●
1 バイトなら -128 〜 127
●
2 バイトなら -32768 〜 32767
●
4 バイトなら -2147483648 〜 2147483647
●
8 バイトなら -9223372036854775808 〜
9223372036854775807
●
有限のバイト数では有限の大きさしか表せない
5
多倍長整数
●
8 バイトでも表せないような、大きな数値を扱いたい
ときがある
●
複数の小さな整数表現を組み合わせて大きな数値を扱う
●
非負整数 を 進数で書くと、
●
   とすれば   個の 4 バイトデータで表せる
x B
x=a0+a1 B+a2 B2
+⋯+aN BN
(0≤ai<B)
B≤232
N+1
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
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
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
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
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
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
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
Toom-4
●
整数を の桁数に分けて多項式を作る
●
結果の多項式は 6 次なので 7 点あれば決定できる
●
 の桁数の積 7 回に帰着できる
●
計算量は
1
4
1
4
O( N
log 7
log 4
)⊂O( N
1.404
)
14
さらなる高みへ
●
もっと細かく分割すれば計算量減りそう
●
 の桁数の乗算    回に帰着できそう
●
計算量は      になる…?
–    なら   …?
1
K 2 K−1
O( N
log(2 K −1)
log K
)
K →∞ O( N)
15
さらなる高みへ
●
もっと細かく分割すれば計算量減りそう
●
 の桁数の乗算    回に帰着できそう
●
計算量は      になる…?
–    なら   …?
1
K 2 K−1
O( N
log(2 K −1)
log K
)
K →∞ O( N)これは嘘
16
さらなる高みへ
●
 が大きい場合、多項式の値の計算や連立方程式を解く
計算の計算量が無視できない
●
その計算量はともに
●
この計算量を小さくしたい
K
O(K
2
(
N
K
))=O(KN)
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
連立方程式の求解
●
連立方程式   の解は
とかける
●
これも行列とベクトルの積
●
 と  がともにベクトルに掛けるときの計算量が
小さければ良い
– そうなるような が欲しい
Ze=k
e=Z−1
k
Z Z−1
zi
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
高速フーリエ変換
●
  をより簡単な演算に帰着することを考える
●
 の添字の順番を入れ替えると
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
高速フーリエ変換
●
   を利用すると、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
高速フーリエ変換
●
   のとき    とすると、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
高速フーリエ変換
●
 の添字の順番を入れ替えると
(
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
高速フーリエ変換
●
   を利用すると、
(
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
高速フーリエ変換
●
 は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
高速フーリエ変換
●
 は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
高速フーリエ変換
●
 は   のときの変換を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
高速逆フーリエ変換
●
   のときの  は
と書ける
●
同様にして高速に計算可能
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
高速フーリエ変換による多倍長乗算
●
整数  を   次の多項式に変換する
●
それぞれ 次の高速フーリエ変換する
●
同じ添字の要素同士をかけ合わせる
●
 次の高速逆フーリエ変換する
●
繰り上がりの処理をして整数に直す
N
2
−1a ,b
N
N
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
まとめ
●
多項式を用いて多倍長乗算を高速化した
●
その際に高速フーリエ変換を用いた
32
おわり

More Related Content

What's hot

プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba
 
統計的係り受け解析入門
統計的係り受け解析入門統計的係り受け解析入門
統計的係り受け解析入門
Yuya Unno
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
 

What's hot (20)

指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
Attentionの基礎からTransformerの入門まで
Attentionの基礎からTransformerの入門までAttentionの基礎からTransformerの入門まで
Attentionの基礎からTransformerの入門まで
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
 
統計的係り受け解析入門
統計的係り受け解析入門統計的係り受け解析入門
統計的係り受け解析入門
 
深層生成モデルと世界モデル
深層生成モデルと世界モデル深層生成モデルと世界モデル
深層生成モデルと世界モデル
 
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
 
coordinate descent 法について
coordinate descent 法についてcoordinate descent 法について
coordinate descent 法について
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
[DL輪読会]Learning Latent Dynamics for Planning from Pixels
[DL輪読会]Learning Latent Dynamics for Planning from Pixels[DL輪読会]Learning Latent Dynamics for Planning from Pixels
[DL輪読会]Learning Latent Dynamics for Planning from Pixels
 

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

GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案
Koji Kitano
 
Icml yomikai 07_16
Icml yomikai 07_16Icml yomikai 07_16
Icml yomikai 07_16
Yo Ehara
 
130323 slide all
130323 slide all130323 slide all
130323 slide all
ikea0064
 

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

GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案
 
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
 
Icml yomikai 07_16
Icml yomikai 07_16Icml yomikai 07_16
Icml yomikai 07_16
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programming
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
6 Info Theory
6 Info Theory6 Info Theory
6 Info Theory
 
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Deep learning実装の基礎と実践
Deep learning実装の基礎と実践
 
optimal Ate pairing
optimal Ate pairingoptimal Ate pairing
optimal Ate pairing
 
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
 
More modern gpu
More modern gpuMore modern gpu
More modern gpu
 
PRML_from5.1to5.3.1
PRML_from5.1to5.3.1PRML_from5.1to5.3.1
PRML_from5.1to5.3.1
 
PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5
 
K shapes zemiyomi
K shapes zemiyomiK shapes zemiyomi
K shapes zemiyomi
 
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
 
130323 slide all
130323 slide all130323 slide all
130323 slide all
 
T77 episteme
T77 epistemeT77 episteme
T77 episteme
 
複雑ネットワーク 第4章 古典的なグラフ
複雑ネットワーク 第4章 古典的なグラフ複雑ネットワーク 第4章 古典的なグラフ
複雑ネットワーク 第4章 古典的なグラフ
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 

More from 京大 マイコンクラブ

More from 京大 マイコンクラブ (20)

テキストファイルを読む💪 第1回
テキストファイルを読む💪  第1回テキストファイルを読む💪  第1回
テキストファイルを読む💪 第1回
 
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
 
Common Lisp入門
Common Lisp入門Common Lisp入門
Common Lisp入門
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
Geometry with Unity
Geometry with UnityGeometry with Unity
Geometry with Unity
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
 
エンジニアと健康
エンジニアと健康エンジニアと健康
エンジニアと健康
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
 
Pietで競プロしよう
Pietで競プロしようPietで競プロしよう
Pietで競プロしよう
 
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったらもし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
 
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
 
Altseed
AltseedAltseed
Altseed
 
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
 
C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回
 

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