exgcd证明和最基础应用

如何求解这个方程:\(ax + by = gcd (a, b)\)

\(∵gcd(a, b) = gcd (b, a \% b)\)
\(∴\)易证 $ gcd(a, b)$ 总是可以化为 \(gcd (a',0)\)的形式
对于原方程\(a'*x + 0*y = gcd (a',0)\) (根据定义\(gcd(a',0) = a'\)
存在解为\({x=1,y=0}\)
设$gcd(a_1,b_1) \(为当前的\)gcd\(,\)gcd(a_2,b_2)\(为向下迭代后的\)gcd$
\({x1,y1}\)是当前解,\({x2,y2}\)是下一次\(gcd\)的解
\[a_1*x_1 + b_1*y_1 = gcd(a_1,b_1)\]
\[=gcd (a_2,b_2)\]
\[= gcd(b_1,a_1\%b_1)\]
\[ = b_1*x2 + a_1 \% b_1 *y2\]
由于\(a\%x = a-x*(a/x)\)
原式可以化简为:
\[a_1*x_1 +b_1*y_1 = b_1*x_2+(a_1-(a_1/b_1)*b_1)*y_2\]
\[a_1*x_1 +b_1*y_1 = a_1*y_2+b_1*x_2-(a_1/b_1)*b_1*y_2\]
\[a_1*x_1 +b_1*y_1 = a_1*y_2+b_1*(x_2-(a_1/b_1)*y_2)\]
我们已知下一次迭代得到的解\(x_2,y_2\)\(a_1,b_1\)(边界为最终解\({x=1,y=0 }\)
那么就可以据此,系数对应,求出当前解:
\[x_1=y_2,y_1=x_2-(a_1/b_1)*y_2\]
经过层层迭代,就可以得到最终解。

代码:

int exgcd (int a1, int b1, int &x2, int &y2) {
    //传址引用修改x2, y2 
    if (b1 == 0) {
        x2 = 1, y2 = 0;
        return a1;//边界情况 
    }
    int div = exgcd (b1, a1 % b1, x2, y2);//向下递归 
    int x1 = y2, y1 = x2 - y2 * (a1 / b1);
    return div;//返回约数 (可能没啥用QwQ关键求的是方程解)
}
用处:作为\(gcd\)的扩展版,它着力求的并不是\(gcd\),而是利用其性质求解形如\(ax + by = gcd (a, b)\)的方程,通常可以把逆元化为这种方程形式用\(exgcd\)快速求解。
(可能还有更多用处)
\(A*X\) \(mod\) \(B=1\)
\(A*X-B*Y=1\)
\(B\)是质数,则二者\(gcd\)显然为\(1\)
\(B\)不是质数逆元就不存在啦\(QwQ\)
代入\(exgcd\),求出来\(X\)的值就是\(A\)关于\(mod\) \(B\)的逆元

转载于:https://www.cnblogs.com/maomao9173/p/10322960.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值