SlideShare a Scribd company logo
1 of 26
SSA
こおしいず
テーマ
•Schönhage–Strassen algorithm
•巨大整数同士の乗算アルゴリズム
•計算量𝑂 𝑛 log 𝑛 log log 𝑛
•以下、SSA
アルゴリズムの流れ
0.入力
• N bitの非負整数2つを入力として受け取るものとする。
• 当然、出力は2N bitとなる。
• Sampleとして、
• 0x1252 × 0x2223 = 0x02716536を考える。
1.分割
• 入力をそれぞれ適当な要素数𝑘の数列に分割する
• このとき、上位半分は0にする。
2 5 2 1 0 0 0 0
3 2 2 2 0 0 0 0
今回はk=8とした。
8bitの入力を4要素に振り分ける。
𝑓 𝑥 = 2𝑥0
+ 5𝑥1
+ 2𝑥2
+ 1𝑥3
𝑔 𝑥 = 3𝑥0 + 2𝑥1 + 2𝑥2 + 2𝑥3
2.フーリエ変換
• 数列全体に対し、フーリエ変換を行う。
• 多項式の値を求めることに相当する。
• 法は適当に大きくしなければならない。
𝑓(20
) 𝑓(22
) 𝑓(24
) 𝑓(26) 𝑓(28
) 𝑓(210
) 𝑓(212
) 𝑓(214)
𝑔(20) 𝑔(22) 𝑔(24) 𝑔(26
) 𝑔(28) 𝑔(210) 𝑔(212) 𝑔(214
)
mod 28 + 1
mod 28
+ 1
𝑓 𝑥 = 2𝑥0
+ 5𝑥1
+ 2𝑥2
+ 1𝑥3
𝑔 𝑥 = 3𝑥0
+ 2𝑥1
+ 2𝑥2
+ 2𝑥3
2.フーリエ変換
• 数列全体に対し、フーリエ変換を行う。
• 多項式の値を求めることに相当する。
• 法は適当に大きくしなければならない。
0a 76 40 25 ff cf c1 a0
09 ab 01 7b 01 9c 01 5c
mod 28 + 1
mod 28
+ 1
𝑓 𝑥 = 2𝑥0
+ 5𝑥1
+ 2𝑥2
+ 1𝑥3
𝑔 𝑥 = 3𝑥0
+ 2𝑥1
+ 2𝑥2
+ 2𝑥3
3.畳み込み
• 数列の各要素の積を取る。
• この例では8bit同士の積だが、一般にはここも大きな整数になるた
め、再帰的にSSAをすることになる。
𝑔(20) 𝑔(22) 𝑔(24) 𝑔(26
) 𝑔(28) 𝑔(210) 𝑔(212) 𝑔(214
)
mod 28 + 1
mod 28
+ 1
𝑓 𝑥 = 2𝑥0
+ 5𝑥1
+ 2𝑥2
+ 1𝑥3
𝑔 𝑥 = 3𝑥0
+ 2𝑥1
+ 2𝑥2
+ 2𝑥3
𝑓(20
) 𝑓(22
) 𝑓(24
) 𝑓(26) 𝑓(28
) 𝑓(210
) 𝑓(212
) 𝑓(214)
3.畳み込み
• 数列の各要素の積を取る。
• この例では8bit同士の積だが、一般にはここも大きな整数になるた
め、再帰的にSSAをすることになる。
𝑓𝑔(20
) 𝑓𝑔(22
) 𝑓𝑔(24
) 𝑓𝑔(26
) 𝑓𝑔(28
) 𝑓𝑔(210
) 𝑓𝑔(212
) 𝑓𝑔(214
)
𝑔(20) 𝑔(22) 𝑔(24) 𝑔(26
) 𝑔(28) 𝑔(210) 𝑔(212) 𝑔(214
)
mod 28 + 1
mod 28
+ 1
𝑓 𝑥 = 2𝑥0
+ 5𝑥1
+ 2𝑥2
+ 1𝑥3
𝑔 𝑥 = 3𝑥0
+ 2𝑥1
+ 2𝑥2
+ 2𝑥3
3.畳み込み
• 数列の各要素の積を取る。
• この例では8bit同士の積だが、一般にはここも大きな整数になるた
め、再帰的にSSAをすることになる。
5a 84 40 68 ff a7 c1 47 mod 28 + 1
09 ab 01 7b 01 9c 01 5c mod 28
+ 1
4.逆フーリエ変換
• 逆フーリエ変換を行う
• 多項式補間に相当する
ℎ 𝑥 = 06𝑥0 + 13𝑥1 + 14𝑥2 + 15𝑥3 + 10𝑥4 + 06𝑥5 + 02𝑥7
5a 84 40 68 ff a7 c1 47 mod 28 + 1
06 13 14 15 10 06 02 00 mod 28
+ 1
5.繰り上げ
• 分割のときの基数を使って整数に戻す。
ℎ 𝑥 = 06𝑥0 + 13𝑥1 + 14𝑥2 + 15𝑥3 + 10𝑥4 + 06𝑥5 + 02𝑥7
6 3 5 6 1 7 2 0
06 13 14 15 10 06 02 00 mod 28
+ 1
ℎ 24
= 02716536
実装
値の表現
• 最小の単位はもちろん1byte=8bit
• mod 28𝑘 + 1をしたいときには、kを覚えておき、k byte単位でみなす
ことで表現
• 28𝑘と0の区別がつかなくなる問題については、これを検知して続行不可能
なエラーを返すことで対処
• 多項式は、前節の例でみたように、添字iに𝑥 𝑖の係数が入っているよ
うな表現
プリミティブ
• 剰余つき加算
• 繰り上げを考えつつひたすら加算を行い、全体で繰り上げ(高々1)が発生し
た際には、1の2の補数(0xFF…F)を加算、その結果繰り上げが発生することを
確認
• 0xFF…Fを加算したのに繰り上げが発生しないということは、ちょうど28𝑘が出
現したということ→続行不可能
• 剰余付き減算
• 28𝑘 + 1 − 𝑥 > 0を足すことと同値なので、2の補数的に考えて、2+~xを加
算するようなコードを書く。
プリミティブ
• 剰余つきシフト演算⇔ 2 𝑚の乗算
• シフト幅をmとする。
• 22∗8𝑘
mod 28𝑘
= 1であることに注意して、mを2*8kで割った余りにしてよい。
• 剰余を考えないシフト結果が
であるとき、剰余を考えた結果は、少し考えると右下の図のようになる。
もちろん、シフト演算の時は、図の縦に揃う位置で
同時に値がでてくることはないので、
実質数回のmemmoveとNOT、繰り上げだけで済む。
[0] … [k-1] [k] … [2k] … [3k-1][2k-1]
[0] … [k-1]
[k] …
[2k] … [3k-1]
[2k-1]
+
ー
高速フーリエ変換
• 前に書いたプリミティブを揃えれば、複素浮動小数点数FFTを少し修
正するだけ。
• 法28𝑘 + 1においては、 2が位数2𝑘をもつ。
• (2𝑙)−1= 22∗8𝑘−𝑙
• 原始𝑙乗根は22∗8𝑘/𝑙
• これらがでてくるのも掛け算ばかりなので、指数部を覚えてシフト演
算をするだけでよい。
パラメタ
• 今回の実装では、決定しなければならない重要なパラメタが2つある。
1. 分割数…多倍長整数があるとき、何要素からなる数列に分割するか(例:8)
• ほとんど制約はなく、自由に決めるパラメタ。
• 高速フーリエ変換をする要素数に一致し、その法にも関係する
• アルゴリズム全体の速度をかなり左右する
• “入力サイズとアーキテクチャに基づいて経験的に設定され、典型的には 4 から 16の
値が用いられる。”(Wikipedia)
• 今回は全体の実装が終了後、各入力幅で様々な値を試して一番良いものを表に保存。
2. 基数…分割した各要素には、何bit∝何byte幅をもたせるか(例:8bit)
• とうぜん少ないほうがいいので、分割数を定めるとだいたい機械的に決まる
• FFT、畳込み、IFFTをした時点で、この幅をはみ出すとアルゴリズムが破綻するので、そ
うならないように定める。
SSA
• 入力幅が小さければKaratsuba法
• そうでなければ、パラメタを定め、それに基づいて「アルゴリズムの
流れ」のとおりに処理を進める
1. 分割
2. FFT
3. 畳み込み(再帰)
4. IFFT
5. 繰り上げ
結果
• 比較対象およびSSAの再帰のベースとしてKaratsuba法を別途実装し
た
• Karatsuba法の再帰のベース・verifierとして筆算法も実装した
• テストは、乱数を入力とし、小さい入力で筆算法とKaratsuba法の一
致を確認、それ以上はKaratsuba法とSSAでの一致を確認した。
結果 速度比較
SSA vs Karatsuba vs Classical vs GMP
SSA
Karatsuba
Classical
2526sec 2650sec
182sec
268435456 bit x
268435456 bit =
161614249桁くらい
My SSA
GMP 6.1.2-1
mpz_mul
182sec
8.73sec
268435456 bit x
268435456 bit =
161614249桁くらい
結果 optimal k
参考文書 今回の実験結果
0
2
4
6
8
10
12
14
16
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Optimal factor k
factor k
Theo Kortekaas:
Multiplying large numbers and the Schönhage-Strassen Algorithm
参考文書
• Theo Kortekaas: Multiplying large numbers and the Schönhage-
Strassen Algorithm
• Wikipedia英語版 Schönhage–Strassen_algorithm
• Wikipedia日本語版 ショーンハーゲ・ストラッセン法

More Related Content

What's hot

Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenMITSUNARI Shigeo
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Inc.
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
セミパラメトリック推論の基礎
セミパラメトリック推論の基礎セミパラメトリック推論の基礎
セミパラメトリック推論の基礎Daisuke Yoneoka
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題tmaehara
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Inc.
 
パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成Prunus 1350
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端Yoichi Iwata
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドMasaki Hara
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 

What's hot (20)

Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
 
Rolling hash
Rolling hashRolling hash
Rolling hash
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
セミパラメトリック推論の基礎
セミパラメトリック推論の基礎セミパラメトリック推論の基礎
セミパラメトリック推論の基礎
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
線形計画法入門
線形計画法入門線形計画法入門
線形計画法入門
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
楕円曲線と暗号
楕円曲線と暗号楕円曲線と暗号
楕円曲線と暗号
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 

Similar to Schönhage Strassen Algorithm (10)

Aizu-2017: B
Aizu-2017: BAizu-2017: B
Aizu-2017: B
 
AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説
 
計算機理論入門03
計算機理論入門03計算機理論入門03
計算機理論入門03
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
CRC-32
CRC-32CRC-32
CRC-32
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programming
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
Za atsu-20170328
Za atsu-20170328Za atsu-20170328
Za atsu-20170328
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説
 

Recently uploaded

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 

Recently uploaded (10)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 

Schönhage Strassen Algorithm