拓展欧几里得

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

过程大概如下图所示:
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\) 可以被表示为 \(6\)\(21\)线性组合

那么我们接着看,\(6\) 也可以成 \(21\)\(27\)线性组合,因此,有:

\[3=6×(-3)+21=(27-21)×(-3)+21=27×(-3)+21×4 \]

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

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

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

\[\frac{a}{\gcd(a,b)}x+\frac{b}{\gcd(a,b)}y=\frac{c}{\gcd(a,b)} \]

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

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

这里呢,通过求 \(bx_0+(a \mod b)y_0=c\) 的解,就可以得出来 \(ax+by=c\) 的解;

对比 \(x\) 的系数和 \(y\) 的系数,就是

\(\begin{cases}x=y0\\y=x0-\left [ a /b \right ]y0 \end{cases}\)

这玩意其实就跟辗转相除差不多一回事,当 \(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;
}

后续的证明正在施工中。

posted @ 2022-05-16 09:06  zsdqwq  阅读(73)  评论(1编辑  收藏  举报