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

AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Inc.
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
Code Formula 2014 予選A 解説
Code Formula 2014 予選A 解説Code Formula 2014 予選A 解説
Code Formula 2014 予選A 解説AtCoder Inc.
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説AtCoder Inc.
 
AtCoder Regular Contest 038 解説
AtCoder Regular Contest 038 解説AtCoder Regular Contest 038 解説
AtCoder Regular Contest 038 解説AtCoder Inc.
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 
3次元の凸包を求める
3次元の凸包を求める3次元の凸包を求める
3次元の凸包を求めるabc3141
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Inc.
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法nitoyon
 
はじめてのKrylov部分空間法
はじめてのKrylov部分空間法はじめてのKrylov部分空間法
はじめてのKrylov部分空間法tmaehara
 
AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Inc.
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Inc.
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解くshindannin
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Inc.
 

What's hot (20)

AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
Code Formula 2014 予選A 解説
Code Formula 2014 予選A 解説Code Formula 2014 予選A 解説
Code Formula 2014 予選A 解説
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
 
AtCoder Regular Contest 038 解説
AtCoder Regular Contest 038 解説AtCoder Regular Contest 038 解説
AtCoder Regular Contest 038 解説
 
RMQ クエリ処理
RMQ クエリ処理RMQ クエリ処理
RMQ クエリ処理
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
3次元の凸包を求める
3次元の凸包を求める3次元の凸包を求める
3次元の凸包を求める
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法
 
はじめてのKrylov部分空間法
はじめてのKrylov部分空間法はじめてのKrylov部分空間法
はじめてのKrylov部分空間法
 
AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
双対性
双対性双対性
双対性
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 

Similar to Schönhage Strassen Algorithm (8)

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
 
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
 

Recently uploaded

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Recently uploaded (9)

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

Schönhage Strassen Algorithm