はじめに
これは RSA完全理解 Advent Calendar の6日目の記事です
RSAの話は一旦お休みして、今回からは剰余環の逆元をもとめるための前提知識をまとめていきたいと思います
おおまかな流れとしては、
みたいな流れを想定してます。
今回はその一発目でユークリッド互除法の紹介です!
ユークリッド互除法とは
以下の性質を利用した、 の最大公約数 を効率良く求めるアルゴリズムです。
となる
具体的な手順は
- を で割って を得る
- を で割って を得る
- を で割って を得る
- 以下割り切れるまで繰り返し、最初に割り切れたときの数が である
ほんまか?
, としてやってみる
となり であることがわかる
手計算に自身がないのでmath/bigを使ってサクッとコードを書くとやっぱり72であることがわかる
func main() { a := big.NewInt(1152) b := big.NewInt(504) fmt.Println(new(big.Int).GCD(new(big.Int), new(big.Int), a, b)) }
72
なんかうまくいきそうだ
となる証明
方針としては、 についての関係 をうまく利用しながら
のどちらも同時に満たされることを確認すれば となりそうなのでその方向で頑張る
について
はどちらも の倍数でありそれぞれ
とかける。したがって を変形した についても
とかけるので も の倍数
は をともに割り切れるので の公倍数でもある は の公約数の中では最大なはずなので、すくなくとも
が成り立つ
について
はどちらも の倍数でありそれぞれ
とかける。したがって
と書けるので も の倍数
は をともに割り切れるので の公約数でもある
は の公約数の中で最大なはずなので、すくなくとも
が成り立つ
これで と がどちらも示せたので
が成り立つ。証明終了
余談
証明みればわかるけど はべつに割り算の商じゃなくてもよくて
が成り立つ範囲において好きな正の整数をとっていいです
無駄にステップ数増やしても特に意味がないから商でやるのが効率良いよねというだけの話