扩展欧几里得算法 - exgcd

学exgcd的时候没好好听课,几乎每次遇到都忘记。
于是打算写篇博客。

扩展欧几里得算法,就是欧几里得算法的扩展。

欧几里得算法,就是 gcd,共产党 ,用来求最大公约数的。

还是一样,首先搞明白他是干啥的。

我们有一个等式, a , b a, b a,b 为常数:

a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)

求这个等式的一组可行整数解。

由于我们知道, gcd ⁡ ( a , 0 ) = a \gcd(a, 0) = a gcd(a,0)=a(不要问我为什么,因为 gcd ⁡ ( a , 0 ) \gcd(a, 0) gcd(a,0) 就等于 a a a

所以当 b = 0 b = 0 b=0 时,有 a x = a ax=a ax=a,显然 x = 1 x = 1 x=1

由于可以随便取一组可行解,为了让之后的计算简便,我们让 y = 0 y = 0 y=0

我们知道 gcd ⁡ ( a , b ) = gcd ⁡ ( b , a   m o d   b ) \gcd(a, b) = \gcd(b,a\bmod b) gcd(a,b)=gcd(b,amodb)

所以
a x + b y = gcd ⁡ ( a , b ) = gcd ⁡ ( b , a   m o d   b ) = b x 0 + ( a   m o d   b ) y 0 = b x 0 + ( a − ⌊ a b ⌋ × b ) y 0 = b x 0 + a y 0 − ⌊ a b ⌋ × b y 0 = a y 0 + b ( x 0 − ⌊ a b ⌋ × y 0 ) \begin{aligned}ax+by & =\gcd(a, b) \\ & = \gcd(b, a\bmod b)\\& = bx_0+(a\bmod b)y_0\\ & =bx_0+(a -\left\lfloor\frac{a}{b}\right\rfloor\times b)y_0\\ &=bx_0 + ay_0 -\left\lfloor\frac{a}{b}\right\rfloor\times by_0\\&=ay_0+b(x_0-\left\lfloor\frac{a}{b}\right\rfloor\times y_0)\end{aligned} ax+by=gcd(a,b)=gcd(b,amodb)=bx0+(amodb)y0=bx0+(aba×b)y0=bx0+ay0ba×by0=ay0+b(x0ba×y0)
这样我们可以得到:
x = y 0 , y   = x 0 − ⌊ a b ⌋ × y 0 x=y_0,y~=x_0-\left\lfloor\frac{a}{b}\right\rfloor\times y_0 x=y0,y =x0ba×y0

根据这个,我们可以从 b = 0 b = 0 b=0 的时候的解反过来推出任意 a x + b y = gcd ⁡ ( x , y ) ax + by = \gcd(x,y) ax+by=gcd(x,y) 的解

具体操作可以用普通 gcd ⁡ \gcd gcd 的函数,通过回溯的方法求解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值