扩展欧几里得算法(exgcd)
前置知识(不涉及证明)
欧几里得算法
欧几里得算法又称为辗转相除法,用于计算两个非负整数的最大公约数。对于非负整数a,b,当b不为0时,其最大公约数与非负整数b,a%b的最大公约数相同;当b为0时,a与b的最大公约数为a
1 | long long gcd(ll a,ll b){ |
裴蜀定理/贝祖定理
对于任意整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y而言ax+by都一定是d的倍数,特别地一定存在整数x,y使得ax+by=d成立
重要推论:a,b互质的充分必要条件是存在整数x,y使得ax+by=1
扩展欧几里得算法(exgcd)
扩展欧几里德算法是用来在已知a,b 求解一组x,y ,使它们满足裴蜀(贝祖)等式:ax + by = gcd (a , b) = d
证明过程:
- 当b = 0时,ax + by = a因此x = 1,y = 0
- 当b != 0时,经过以下推导
因此可以利用递归算法每次先求出下一层的x’和y’然后利用上述公式回代
- 递归方式模板
1 | ll exgcd(ll a, ll b, ll &x, ll &y) { |
应用
用于求解ax + by = gcd(a , b)的解(即上述情况)
用于求解ax + by = c的解
当c % gcd(a , b) != 0时,无解(依据裴蜀定理)
当c % gcd(a , b) = 0时,先利用exgcd求出ax + by = gcd(a , b)的解x0、y0,则可得到特解x’ = x0 * c / gcd(a , b),y’ = y0 * c / gcd(a , b),而通解 = 特解 + 齐次解(ax + by = 0的解),故通解为x = x’ + k * b / gcd(a , b),y = y’ + k * a / gcd(a,b) (k为整数)
求解一次同余方程:
上述方程价于
再利用应用2中的方法求解即可
求解ax + by = c的最小正整数解x模板
1 | LL exgcd(LL a,LL b,LL &x,LL &y) |
参考文章
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 煎bingo子 の 博客!
评论