Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
みんなでたのしむ math/big 2024/05/10(金) Asakusa.go
Slide 2
Slide 2 text
自己紹介 @convto レイヤ低めの技術などに興味がありま す 読みはこんぶとです つくばエクスプレス沿線ユーザー、論理 浅草勢として参戦しました
Slide 3
Slide 3 text
突然ですが Go Conference 2024 参加しますか?
Slide 4
Slide 4 text
すきなパッケージなにを選びましたか?
Slide 5
Slide 5 text
ぼくは math/big ! - math/big はいいぞ - あったら嬉しい処理を標準で準備してくれ てるのは助かる - 実装も TAOCP で言及されてるやつばっ かり - どういう課題があるのか、どういう面白い ことしてるのか、ざっと触りを伝えたい
Slide 6
Slide 6 text
発表の目的 - 課題: math/big は面白いが, おもしろいと 言ってる人をあまり見かけない - 目的: どういう課題があるのか, どういう 面白いことしてるのか, ざっと触りを伝え たい - いきごみ: 前提知識が必要なところもある ので, そのへんは深入りせずみんなでた のしみましょう〜
Slide 7
Slide 7 text
今日話すこと
Slide 8
Slide 8 text
contents - math/big ってなに? - どういうところで使われてるの? - 多倍長演算って大変なの? - math/big はどういうアルゴリズムを実装 してるの? - まとめ: math/big はいいぞ
Slide 9
Slide 9 text
math/big ってなに?
Slide 10
Slide 10 text
ようは限界を超えて舞えるやつ
Slide 11
Slide 11 text
word size を超えた多倍長演算をサポートする - 値を word size の値の slice として扱っ て、でかい整数や任意精度の浮動小数と かの演算をする - な、なにがうれしいんだってばよ...? big.Int の型はこれだけ (nat は word の slice)
Slide 12
Slide 12 text
どういうところで使われてるの?
Slide 13
Slide 13 text
使われかたいろいろ - math/big.Int だけみても, 暗号周りでよく 使う - 巨大な整数の冪乗とかたくさんする ため, RSA 以外にもいろいろ - math/big.Float は ethereum/go-ethereum とかで使われて るのを見た std crypto で使われてる図
Slide 14
Slide 14 text
多倍長演算って大変なの?
Slide 15
Slide 15 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len
Slide 16
Slide 16 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len x_1 x_2 x_3 x_4 y_1 y_2 y_3 y_4 +
Slide 17
Slide 17 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len x_1 x_2 x_3 x_4 y_1 y_2 y_3 y_4 + r_4 carry_4
Slide 18
Slide 18 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len x_1 x_2 x_3 x_4 y_1 y_2 y_3 y_4 + r_4 r_3 carry_3
Slide 19
Slide 19 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len x_1 x_2 x_3 x_4 y_1 y_2 y_3 y_4 + z_4 z_3 carry_3 以下繰り返す...
Slide 20
Slide 20 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len x_1 x_2 x_3 x_4 y_1 y_2 y_3 y_4 + z_4 z_3 z_2 z_1 carry_1
Slide 21
Slide 21 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len x_1 x_2 x_3 x_4 y_1 y_2 y_3 y_4 - z_4 z_3 z_2 z_1 borrow_4 … 減算も大体おなじ! 足りなかったら借りてきたりする とかちょっと違いはあるが、減 算も大体おなじ!
Slide 22
Slide 22 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる
Slide 23
Slide 23 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる x_1 x_2 x_3 y_1 y_2 y_3 x
Slide 24
Slide 24 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる x_1 x_2 x_3 y_1 y_2 y_3 x z_3:3 z_2:3 z_1:3 c_3:3 c_2:3 c_1:3
Slide 25
Slide 25 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる x_1 x_2 x_3 y_1 y_2 y_3 x z_3:3 z_2:3 z_1:3 c_3:3 c_2:3 c_1:3 z_3:2 z_2:2 z_1:2 c_2:2 c_3:2 c_1:2
Slide 26
Slide 26 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる x_1 x_2 x_3 y_1 y_2 y_3 x z_3:3 z_2:3 z_1:3 c_3:3 c_2:3 c_1:3 z_3:2 z_2:2 z_1:2 c_2:2 c_3:2 c_1:2 つづく...
Slide 27
Slide 27 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる x_1 x_2 x_3 y_1 y_2 y_3 ÷
Slide 28
Slide 28 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる x_1 x_2 x_3 y_1 y_2 y_3 ÷ z_1 z_2 z_3 上の桁から for 1..9 mul(y, i) して、xに収まる最大の値を入 れていく...
Slide 29
Slide 29 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる - ぼくらは (bigint^bigint) mod bigint とか をやりたがるが, そんなことをすると号泣 してしまう
Slide 30
Slide 30 text
計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる - ぼくらは (bigint^bigint) mod bigint とか をやりたがるが, そんなことをすると号泣 してしまう - O(N^2) の掛け合わせだってばよ...
Slide 31
Slide 31 text
それ以外に求められる機能とか - 算術演算だけじゃなくて、ほかにも求めら れるものがある - bit shift 的な操作もほしーよーとか - 任意サイズのでけー素数を生成して〜と か - 泣いちゃいますね
Slide 32
Slide 32 text
大変です - 演算するだけでも計算量低いアルゴリズ ムを使わんとあかん, 素朴にやってはい けません - それだけじゃなくて, いくつかの要求もあ るためそれにも答えないとあかん
Slide 33
Slide 33 text
math/big はどういう アルゴリズムを実装してるの?
Slide 34
Slide 34 text
てきとうにpickして説明
Slide 35
Slide 35 text
karatsuba 法による多倍長整数乗算 - [x_1, x_2] * [y_1, y_2] の乗算は, 4回 計算必要 - x1*y1, x1*y2, x2*y1, x2*y2 - (厳密にはこれらを足し合わせる必要 があるが省略)
Slide 36
Slide 36 text
x_1 x_2 y_1 y_2 x_2*y_2 x karatsuba 法による多倍長整数乗算 - [x_1, x_2] * [y_1, y_2] の乗算は, 4回 計算必要 - x1*y1, x1*y2, x2*y1, x2*y2 - (厳密にはこれらを足し合わせる必要 があるが省略) x_2*y_1 x_1*y_2 x_1*y_1 * word * word * (word ^ 2)
Slide 37
Slide 37 text
x_1 x_2 y_1 y_2 x_2*y_2 x karatsuba 法による多倍長整数乗算 - [x_1, x_2] * [y_1, y_2] の乗算は, 4回 計算必要 - x1*y1, x1*y2, x2*y1, x2*y2 - (厳密にはこれらを足し合わせる必要 があるが省略) - これを3回にできるテクがある x_2*y_1 x_1*y_2 x_1*y_1 * word * word * (word ^ 2)
Slide 38
Slide 38 text
ふつうにやるとこう x_2*y_1 x_1*y_2 ( + ) + << word x_2*y_2 x_1*y_1 << (word * 2) + + 乗算4回
Slide 39
Slide 39 text
こいつをグッとにらむ x_2*y_1 x_1*y_2 ( + )
Slide 40
Slide 40 text
こいつをグッとにらむ x_2*y_1 x_1*y_2 ( + ) = x_2 + x_1 y_1 + y_2 ( * ) - ( + ) x_1*y_1 x_2*y_2
Slide 41
Slide 41 text
こいつをグッとにらむ x_2*y_1 x_1*y_2 ( + ) = x_2 + x_1 y_1 + y_2 ( * ) - ( + ) x_1*y_1 x_2*y_2 すでに求めてるの でコストなし
Slide 42
Slide 42 text
こいつをグッとにらむ x_2*y_1 x_1*y_2 ( + ) = x_2 + x_1 y_1 + y_2 ( * ) - ( + ) x_1*y_1 x_2*y_2 すでに求めてるの でコストなし コストの高い乗算が 2回 -> 1回に!
Slide 43
Slide 43 text
さっきのに入れるとこうなる x_2 + x_1 y_1 + y_2 ( * ) - ( + ) x_1*y_1 x_2*y_2 ( ) << word x_2*y_2 x_1*y_1 << (word * 2) + +
Slide 44
Slide 44 text
さっきのに入れるとこうなる x_2 + x_1 y_1 + y_2 ( * ) - ( + ) x_1*y_1 x_2*y_2 ( ) << word x_2*y_2 x_1*y_1 << (word * 2) + + 3回しか乗算してない!
Slide 45
Slide 45 text
ほかにもいろいろ! - GCD(最大公約数)だすやつ - 冪乗のmodとるやつ - 剰余環の逆元とるやつ - and more!
Slide 46
Slide 46 text
うれしい! - これほしいな〜と思うものは大体ある - かつ妥当なアルゴリズムを使ってる - 前提知識を求めるものも標準で作られて る! - 実質 TAOCP 本であり、本読みながら実 装みるとたのしい
Slide 47
Slide 47 text
まとめ: math/big はいいぞ
Slide 48
Slide 48 text
math/big はいいぞ - こいつがなかったら crypto package は ギャンこまり - 実質 TAOCP 詰め合わせセット. コードに も TAOCP section x.y を参考にしたでみ たいなコメントいっぱいある. 本片手に読 むといい勉強になる - みんなもでかい値を扱おう!
Slide 49
Slide 49 text
今週のスローガン - 夢は大きく値もでかく, みんなでやろう math/big
Slide 50
Slide 50 text
宣伝
Slide 51
Slide 51 text
https://layerx.connpass.com/event/317228/
Slide 52
Slide 52 text
ご清聴ありがとうございました