Submit Search
Upload
多倍長整数の乗算と高速フーリエ変換
•
1 like
•
3,329 views
京大 マイコンクラブ
Follow
多倍長整数の乗算を高速に行うアルゴリズムを、カラツバ法から始めて、最終的に高速フーリエ変換を用いた乗算に至るまでを解説しました。
Read less
Read more
Software
Slideshow view
Report
Share
Slideshow view
Report
Share
1 of 32
Download now
Download to read offline
Recommended
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
双対性
双対性
Yoichi Iwata
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
直交領域探索
直交領域探索
okuraofvegetable
色々なダイクストラ高速化
色々なダイクストラ高速化
yosupo
最適化超入門
最適化超入門
Takami Sato
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで
Shunji Umetani
Recommended
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
双対性
双対性
Yoichi Iwata
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
直交領域探索
直交領域探索
okuraofvegetable
色々なダイクストラ高速化
色々なダイクストラ高速化
yosupo
最適化超入門
最適化超入門
Takami Sato
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで
Shunji Umetani
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
Chokudai search
Chokudai search
AtCoder Inc.
最適化計算の概要まとめ
最適化計算の概要まとめ
Yuichiro MInato
ドロネー三角形分割
ドロネー三角形分割
Yusuke Matsushita
Union find(素集合データ構造)
Union find(素集合データ構造)
AtCoder Inc.
スペクトラルグラフ理論入門
スペクトラルグラフ理論入門
irrrrr
数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013
Shuyo Nakatani
自動定理証明の紹介
自動定理証明の紹介
Masahiro Sakai
基礎線形代数講座
基礎線形代数講座
SEGADevTech
文字列検索のいろいろ
文字列検索のいろいろ
Kazuma Mikami
3次元の凸包を求める
3次元の凸包を求める
abc3141
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情
Yuta Kikuchi
動的計画法を極める!
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
Rの高速化
Rの高速化
弘毅 露崎
Rolling hash
Rolling hash
HCPC: 北海道大学競技プログラミングサークル
線形計画法入門
線形計画法入門
Shunji Umetani
coordinate descent 法について
coordinate descent 法について
京都大学大学院情報学研究科数理工学専攻
GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案
Koji Kitano
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
satanic
More Related Content
What's hot
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
Chokudai search
Chokudai search
AtCoder Inc.
最適化計算の概要まとめ
最適化計算の概要まとめ
Yuichiro MInato
ドロネー三角形分割
ドロネー三角形分割
Yusuke Matsushita
Union find(素集合データ構造)
Union find(素集合データ構造)
AtCoder Inc.
スペクトラルグラフ理論入門
スペクトラルグラフ理論入門
irrrrr
数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013
Shuyo Nakatani
自動定理証明の紹介
自動定理証明の紹介
Masahiro Sakai
基礎線形代数講座
基礎線形代数講座
SEGADevTech
文字列検索のいろいろ
文字列検索のいろいろ
Kazuma Mikami
3次元の凸包を求める
3次元の凸包を求める
abc3141
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情
Yuta Kikuchi
動的計画法を極める!
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
Rの高速化
Rの高速化
弘毅 露崎
Rolling hash
Rolling hash
HCPC: 北海道大学競技プログラミングサークル
線形計画法入門
線形計画法入門
Shunji Umetani
coordinate descent 法について
coordinate descent 法について
京都大学大学院情報学研究科数理工学専攻
What's hot
(20)
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
指数時間アルゴリズム入門
指数時間アルゴリズム入門
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Chokudai search
Chokudai search
最適化計算の概要まとめ
最適化計算の概要まとめ
ドロネー三角形分割
ドロネー三角形分割
Union find(素集合データ構造)
Union find(素集合データ構造)
スペクトラルグラフ理論入門
スペクトラルグラフ理論入門
数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013
自動定理証明の紹介
自動定理証明の紹介
基礎線形代数講座
基礎線形代数講座
文字列検索のいろいろ
文字列検索のいろいろ
3次元の凸包を求める
3次元の凸包を求める
プログラムを高速化する話
プログラムを高速化する話
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情
動的計画法を極める!
動的計画法を極める!
Rの高速化
Rの高速化
Rolling hash
Rolling hash
線形計画法入門
線形計画法入門
coordinate descent 法について
coordinate descent 法について
Similar to 多倍長整数の乗算と高速フーリエ変換
GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案
Koji Kitano
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
satanic
Icml yomikai 07_16
Icml yomikai 07_16
Yo Ehara
Sec15 dynamic programming
Sec15 dynamic programming
Keisuke OTAKI
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
AtCoder Inc.
6 Info Theory
6 Info Theory
melvincabatuan
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践
Seiya Tokui
optimal Ate pairing
optimal Ate pairing
MITSUNARI Shigeo
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
RCCSRENKEI
More modern gpu
More modern gpu
Preferred Networks
PRML_from5.1to5.3.1
PRML_from5.1to5.3.1
禎晃 山崎
PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5
sleepy_yoshi
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
K shapes zemiyomi
K shapes zemiyomi
kenyanonaka
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
Kazkuki Oakamoto
130323 slide all
130323 slide all
ikea0064
T77 episteme
T77 episteme
えぴ 福田
充足可能性問題のいろいろ
充足可能性問題のいろいろ
Hiroshi Yamashita
複雑ネットワーク 第4章 古典的なグラフ
複雑ネットワーク 第4章 古典的なグラフ
Shintaro Takemura
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
Toru Tamaki
Similar to 多倍長整数の乗算と高速フーリエ変換
(20)
GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
Icml yomikai 07_16
Icml yomikai 07_16
Sec15 dynamic programming
Sec15 dynamic programming
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
6 Info Theory
6 Info Theory
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践
optimal Ate pairing
optimal Ate pairing
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
More modern gpu
More modern gpu
PRML_from5.1to5.3.1
PRML_from5.1to5.3.1
PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
K shapes zemiyomi
K shapes zemiyomi
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
130323 slide all
130323 slide all
T77 episteme
T77 episteme
充足可能性問題のいろいろ
充足可能性問題のいろいろ
複雑ネットワーク 第4章 古典的なグラフ
複雑ネットワーク 第4章 古典的なグラフ
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
More from 京大 マイコンクラブ
テキストファイルを読む💪 第1回
テキストファイルを読む💪 第1回
京大 マイコンクラブ
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
京大 マイコンクラブ
Common Lisp入門
Common Lisp入門
京大 マイコンクラブ
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
Geometry with Unity
Geometry with Unity
京大 マイコンクラブ
セミコロンレスc++
セミコロンレスc++
京大 マイコンクラブ
エンジニアと健康
エンジニアと健康
京大 マイコンクラブ
女の子になれなかった人のために
女の子になれなかった人のために
京大 マイコンクラブ
Pietで競プロしよう
Pietで競プロしよう
京大 マイコンクラブ
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
京大 マイコンクラブ
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
京大 マイコンクラブ
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
京大 マイコンクラブ
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
京大 マイコンクラブ
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
京大 マイコンクラブ
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
Altseed
Altseed
京大 マイコンクラブ
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
京大 マイコンクラブ
C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回
京大 マイコンクラブ
More from 京大 マイコンクラブ
(20)
テキストファイルを読む💪 第1回
テキストファイルを読む💪 第1回
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
Common Lisp入門
Common Lisp入門
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
Geometry with Unity
Geometry with Unity
セミコロンレスc++
セミコロンレスc++
エンジニアと健康
エンジニアと健康
女の子になれなかった人のために
女の子になれなかった人のために
Pietで競プロしよう
Pietで競プロしよう
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
Altseed
Altseed
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回
多倍長整数の乗算と高速フーリエ変換
1.
多倍長整数の乗算と高速フーリエ変換 KMC6 回生 prime 2018/11/01
2.
2 自己紹介 ● KMC-ID: prime ● Twitter: @_primenumber ● Mastodon:
@prime@mstdn.poyo.me ● KMC での活動 – 競技プログラミング – 難解プログラミング言語 – 電子錠の管理 (root) – 第 37 代会計
3.
3 目次 ● コンピューターにおける整数の表現 ● 多倍長整数とは ● ナイーブな乗算アルゴリズム ● Karatsuba 法 ● Toom-3/4 法 ● 高速フーリエ変換
4.
4 コンピューターにおける整数の表現 ● 多くのコンピューターでは整数は二進数で表される ● 負の数は 2 の補数を使って表される ● 1
バイトなら -128 〜 127 ● 2 バイトなら -32768 〜 32767 ● 4 バイトなら -2147483648 〜 2147483647 ● 8 バイトなら -9223372036854775808 〜 9223372036854775807 ● 有限のバイト数では有限の大きさしか表せない
5.
5 多倍長整数 ● 8 バイトでも表せないような、大きな数値を扱いたい ときがある ● 複数の小さな整数表現を組み合わせて大きな数値を扱う ● 非負整数 を 進数で書くと、 ● とすれば 個の 4
バイトデータで表せる x B x=a0+a1 B+a2 B2 +⋯+aN BN (0≤ai<B) B≤232 N+1
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 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 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 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 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 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 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 Toom-4 ● 整数を の桁数に分けて多項式を作る ● 結果の多項式は 6 次なので
7 点あれば決定できる ● の桁数の積 7 回に帰着できる ● 計算量は 1 4 1 4 O( N log 7 log 4 )⊂O( N 1.404 )
14.
14 さらなる高みへ ● もっと細かく分割すれば計算量減りそう ● の桁数の乗算 回に帰着できそう ● 計算量は になる…? – なら …? 1 K
2 K−1 O( N log(2 K −1) log K ) K →∞ O( N)
15.
15 さらなる高みへ ● もっと細かく分割すれば計算量減りそう ● の桁数の乗算 回に帰着できそう ● 計算量は になる…? – なら …? 1 K
2 K−1 O( N log(2 K −1) log K ) K →∞ O( N)これは嘘
16.
16 さらなる高みへ ● が大きい場合、多項式の値の計算や連立方程式を解く 計算の計算量が無視できない ● その計算量はともに ● この計算量を小さくしたい K O(K 2 ( N K ))=O(KN)
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 連立方程式の求解 ● 連立方程式 の解は とかける ● これも行列とベクトルの積 ● と がともにベクトルに掛けるときの計算量が 小さければ良い – そうなるような が欲しい Ze=k e=Z−1 k Z Z−1 zi
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 高速フーリエ変換 ● をより簡単な演算に帰着することを考える ● の添字の順番を入れ替えると 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 高速フーリエ変換 ● を利用すると、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 高速フーリエ変換 ● のとき とすると、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 高速フーリエ変換 ● の添字の順番を入れ替えると ( 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 高速フーリエ変換 ● を利用すると、 ( 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 高速フーリエ変換 ● は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 高速フーリエ変換 ● は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 高速フーリエ変換 ● は のときの変換を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 高速逆フーリエ変換 ● のときの は と書ける ● 同様にして高速に計算可能 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 高速フーリエ変換による多倍長乗算 ● 整数 を 次の多項式に変換する ● それぞれ 次の高速フーリエ変換する ● 同じ添字の要素同士をかけ合わせる ● 次の高速逆フーリエ変換する ● 繰り上がりの処理をして整数に直す N 2 −1a ,b N N
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 まとめ ● 多項式を用いて多倍長乗算を高速化した ● その際に高速フーリエ変換を用いた
32.
32 おわり
Download now