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

ご清聴ありがとうございました