最近经常会遇到RSA的题目,都会用到扩展欧几里得算法来求逆元,所以去系统的学习了一下这个算法的原理。
先奉上dalao的博客 https://blog.sengxian.com/algorithms/gcd-extgcd
前置说明
a | b 表示:a可以整除b
用途
扩展欧几里得算法是用来求解方程 a x + b y = c ( a , b , c ∈ Z ) ax + by = c (a,b,c \in Z) ax+by=c(a,b,c∈Z)的
可解条件
g c d ( a , b ) ∣ c gcd(a, b) | c gcd(a,b)∣c
实现
记 exgcd(a, b, x, y) 为求解方程 a x + b y = g c d ( a , b ) ax + by = gcd(a,b) ax+by=gcd(a,b) 的函数
先考虑边界情况:
当b = 0时,有 ax = gcd(a, 0) 解得 { x = 1 y = 0 \left\{\begin{aligned}x&=1\\y&=0\end{aligned}\right. {
xy=1=0
对于一般情况,设 a ′ = a a^{'} = a a′=a, b ′ = a % b b^{'} = a \% b b′=a%b
则有:
a ′ x ′ + b ′ y ′ = g c d ( a ′ , b ′ ) = g c d ( b , a % b ) a^{'} x^{'} + b^{'} y^{'}=gcd(a^{'}, b^{'}) =gcd(b, a\%b) a′