“天意终究难参,假若登顶成憾,与君同添青|

zsdqwq

园龄:3年6个月粉丝:9关注:17

拓展欧几里得

在了解拓展欧几里得时,建议大家先去看一眼欧几里得算法(也叫辗转相除法

过程大概如下图所示:
qwq~
那么,我们因此也可以给出一段代码:

int gcd(int a,int b)
{
    return b ? gcd(b,a%b) : a;
}

为什么成立这一块以后会来填坑的/qq


那么,什么是拓展欧几里得呢?

拓展欧几里得是一种算法,在不断的辗转相除中得到不定方程

ax+by=c 的一组解;

我们借着上面的那个图来说明一下:

我们看最后一个式子:21=6×3+3 这里,我们也可以写成:3=6×(3)+21

也就是说,3 可以被表示为 621线性组合

那么我们接着看,6 也可以成 2127线性组合,因此,有:

3=6×(3)+21=(2721)×(3)+21=27×(3)+21×4

那么一直往下推,我们就可以推出来:3 就是 7548 的线性组合;

那么,如果 c 是其他的数,能不能找到解呢?

其实 c 必须要是 gcd(a,b) 的倍数,因此,尝试等式两边同时初以 gcd(a,b);

agcd(a,b)x+bgcd(a,b)y=cgcd(a,b)

因为等式的左侧肯定是一个整数,为了使等式成立,等式的右侧也必然是一个整数

那么我们同样也来看一看这个的具体过程

这里呢,通过求 bx0+(amodb)y0=c 的解,就可以得出来 ax+by=c 的解;

对比 x 的系数和 y 的系数,就是

{x=y0y=x0[a/b]y0

这玩意其实就跟辗转相除差不多一回事,当 b=0 的时候结束递归,

最后令 x=1,y=0

int gcd(int a, int b,int &x,int &y) {
      if (b == 0) {
      x = 1, y = 0;
      return a;
      }
      int ans = gcd(b, a % b, x, y);
      int temp = x;
      x = y;
      y = temp - a / b * y;
      return ans;
}

后续的证明正在施工中。

本文作者:zsdqwq

本文链接:https://www.cnblogs.com/wo-de-bo-ke-wo-zuo-zhu/p/exgcd.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   zsdqwq  阅读(82)  评论(1编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示