Upgrade to Pro — share decks privately, control downloads, hide ads and more …

みんなでたのしむ math/big / i love math big

みんなでたのしむ math/big / i love math big

convto

May 10, 2024
Tweet

More Decks by convto

Other Decks in Technology

Transcript

  1. ぼくは math/big ! - math/big はいいぞ - あったら嬉しい処理を標準で準備してくれ てるのは助かる -

    実装も TAOCP で言及されてるやつばっ かり - どういう課題があるのか、どういう面白い ことしてるのか、ざっと触りを伝えたい
  2. 発表の目的 - 課題: math/big は面白いが, おもしろいと 言ってる人をあまり見かけない - 目的: どういう課題があるのか,

    どういう 面白いことしてるのか, ざっと触りを伝え たい - いきごみ: 前提知識が必要なところもある ので, そのへんは深入りせずみんなでた のしみましょう〜
  3. contents - math/big ってなに? - どういうところで使われてるの? - 多倍長演算って大変なの? - math/big

    はどういうアルゴリズムを実装 してるの? - まとめ: math/big はいいぞ
  4. word size を超えた多倍長演算をサポートする - 値を word size の値の slice として扱っ

    て、でかい整数や任意精度の浮動小数と かの演算をする - な、なにがうれしいんだってばよ...? big.Int の型はこれだけ (nat は word の slice)
  5. 使われかたいろいろ - math/big.Int だけみても, 暗号周りでよく 使う - 巨大な整数の冪乗とかたくさんする ため, RSA

    以外にもいろいろ - math/big.Float は ethereum/go-ethereum とかで使われて るのを見た std crypto で使われてる図
  6. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても 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 以下繰り返す...
  7. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても 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
  8. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても 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 … 減算も大体おなじ! 足りなかったら借りてきたりする とかちょっと違いはあるが、減 算も大体おなじ!
  9. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word

    slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる
  10. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word

    slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる x_1 x_2 x_3 y_1 y_2 y_3 x
  11. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても 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
  12. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても 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
  13. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても 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 つづく...
  14. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word

    slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる x_1 x_2 x_3 y_1 y_2 y_3 ÷
  15. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても 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に収まる最大の値を入 れていく...
  16. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word

    slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる - ぼくらは (bigint^bigint) mod bigint とか をやりたがるが, そんなことをすると号泣 してしまう
  17. 計算コストとか (多倍長整数) - 加算, 減算は雑にやっても O(N) とか. N は word

    slice の len - 乗算, 除算は結構きつい. ざつにやると O(N^2) になる - ぼくらは (bigint^bigint) mod bigint とか をやりたがるが, そんなことをすると号泣 してしまう - O(N^2) の掛け合わせだってばよ...
  18. karatsuba 法による多倍長整数乗算 - [x_1, x_2] * [y_1, y_2] の乗算は, 4回

    計算必要 - x1*y1, x1*y2, x2*y1, x2*y2 - (厳密にはこれらを足し合わせる必要 があるが省略)
  19. 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)
  20. 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)
  21. こいつをグッとにらむ x_2*y_1 x_1*y_2 ( + ) = x_2 + x_1

    y_1 + y_2 ( * ) - ( + ) x_1*y_1 x_2*y_2 すでに求めてるの でコストなし
  22. こいつをグッとにらむ 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回に!
  23. さっきのに入れるとこうなる 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) + +
  24. さっきのに入れるとこうなる 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回しか乗算してない!
  25. math/big はいいぞ - こいつがなかったら crypto package は ギャンこまり - 実質

    TAOCP 詰め合わせセット. コードに も TAOCP section x.y を参考にしたでみ たいなコメントいっぱいある. 本片手に読 むといい勉強になる - みんなもでかい値を扱おう!