Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Strassenのアルゴリズムによる行列積の計算 /strassen-algorithm
Search
Miyakawa Taku
December 27, 2017
Programming
3.8k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Strassenのアルゴリズムによる 行列積の計算 /strassen-algorithm
このスライドの著者は宮川拓です。
CC BY 3.0 Licenseの元に利用を許諾します。
Miyakawa Taku
December 27, 2017
More Decks by Miyakawa Taku
See All by Miyakawa Taku
入門: 末尾呼び出し最適化 /tail-call-elimination-intro
miyakawataku
2
2.6k
JVM言語の動き方・動かし方 /make-jvm-lang
miyakawataku
6
2.4k
Java SE 8から11で何が起きた?一気におさらいしてみよう! /java-se-8-to-11
miyakawataku
14
5.7k
ミニバッチサイズと学習率の関係 /small-batch-learning
miyakawataku
0
2.3k
機械学習プロジェクトの進め方 /howtoproceedwithmlproject
miyakawataku
0
400
グラフアルゴリズムその2: 単一始点最短路問題 /graphShortestPaths
miyakawataku
0
230
Viterbiのアルゴリズム /viterbi-algorithm
miyakawataku
0
360
Other Decks in Programming
See All in Programming
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
260
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
680
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
350
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
160
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
360
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
470
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
130
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
34
16k
sbt 2.0: takeoff
eed3si9n
0
110
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
160
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
21
21k
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
210
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
The Pragmatic Product Professional
lauravandoore
37
7.5k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
930
Test your architecture with Archunit
thirion
2
2.4k
Scaling GitHub
holman
464
140k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Technical Leadership for Architectural Decision Making
baasie
3
600
A designer walks into a library…
pauljervisheath
211
25k
Building an army of robots
kneath
307
47k
Tell your own story through comics
letsgokoyo
1
1.1k
Transcript
Strassenのアルゴリズムによる 行列積の計算 2017-12-27 ビール&LT大会 ハッシュタグ: #jjug 宮川 拓
@miyakawa_taku JJUG幹事です SI屋で賃労働してます オレオレJVM言語Kinkを作っています https://bitbucket.org/kink/kink
尾上部屋の里山さんのファンです 自己紹介 #jjug 2/19
あらまし 本物のプログラマになりたい! ということで、 『アルゴリズムイントロダクション』 を読み進めています n次正方行列の積が、Θ(3)よりも小さい計 算量で計算できるらしい(§4.2)
びっくり! #jjug 3/19
背景 機械学習の計算は行列計算のかたまり 行列計算が速いと嬉しい #jjug 4/19
まずはふつうに計算 #jjug 5/19
三重ループ = ( ), = ( )をn次の正方行列とする =
∙ の要素は = σ=1 ∙ すなおに三重ループで実装: for i in 1~n: for j in 1~n: c[i, j] = 0 for k in 1~n: c[i, j] += a[i, k] * b[k, j] 3 回繰り返す → 計算量は() #jjug 6/19
準備: 分割統治 #jjug 7/19
分割統治 A, B, Cを縦横半分に分割すると、 = ∙ は次のように書き直せる 11 12 21
22 = 11 12 21 22 ∙ 11 12 21 22 = 11 ∙ 11 + 12 ∙ 21 11 ∙ 12 + 12 ∙ 22 21 ∙ 11 + 22 ∙ 21 21 ∙ 12 + 22 ∙ 22 #jjug 8/19
分割統治 def prod(a, b): if a.order == b.order == 1:
return matrix_1x1(a[0, 0] * b[0, 0]) a11, a12, a21, a22 = partition(a) b11, b12, b21, b22 = partition(b) c11 = prod(a11, b11) + prod(a12, b21) c12 = prod(a11, b12) + prod(a12, b22) c21 = prod(a21, b11) + prod(a22, b21) c22 = prod(a21, b12) + prod(a22, b22) return concat(c11, c12, c21, c22) 計算量はスカラ値の掛け算の回数に比例 n次行列の乗算は 2 次行列の乗算を8回再帰呼び出し #jjug 9/19
分割統治 n: 行列の次数 スカラ値の 掛け算の回数 1 1 2 8 4
64 8 512 16 4,096 2倍 8 = 23 倍 2倍 8 = 23 倍 2倍 8 = 23 倍 計算量はやっぱり() #jjug 10/19
Strassenのアルゴリズム #jjug 11/19
Strassenのアルゴリズム A, Bを分割した上で1 ~7 を次のように置く 1 = 11 (12
− 22 ) 2 = (11 + 12 )22 3 = (21 + 22 )11 4 = 22 21 − 11 5 = (11 + 22 )(11 + 22 ) 6 = 12 − 22 21 + 22 7 = 11 − 21 11 + 12 2 次行列を 計7回乗算 #jjug 12/19
Strassenのアルゴリズム ここで、次が成り立つ 11 = 11 11 + 12 21
= 5 + 4 − 2 + 6 12 = 11 12 + 12 22 = 1 + 2 21 = 21 11 + 22 21 = 3 + 4 22 = 21 12 + 22 22 = 5 + 1 − 3 − 7 Cは1 ~7 の和で表せる 2 次行列の乗算を7回再帰呼び出しすれば良い! #jjug 13/19
Strassenのアルゴリズム Strassen 計算量 n 三重ループ 計算量 1 1 1 7
2 8 49 4 64 343 8 512 2,401 16 4,096 8倍 8倍 8倍 7倍 7倍 7倍 Θ 27 = .… Θ 28 = Θ 3 < #jjug 14/19
実装&計測 #jjug 15/19
実装 https://bitbucket.org/miyakawataku/matrix- multiplication/src/default/matrix.go #jjug 16/19
計測 0.000010 0.000100 0.001000 0.010000 0.100000 1.000000 10.000000 100.000000 1,000.000000
10,000.000000 16 64 256 1,024 4,096 実行時間(秒) n (行列の次数) 三重ループ Strassen #jjug 17/19
総括 #jjug 18/19
総括 素敵なアルゴリズムは、nが小さい時には遅い。 そして大抵の場合、nは小さい。 素敵なアルゴリズムの計算量の式には、大きな 定数項が掛かっている。 nが大きくなることが分かっていない限り、素敵 にしてはならない。 ― Rob Pike
“Notes on Programming in C” #jjug 19/19