目录
  1. 1. 扩展欧几里得算法
  2. 2. ax + by = c 求解
  3. 3. 同余式 ax ≡​ c (mod m) 的求解
扩展欧几里得算法

扩展欧几里得算法

扩展欧几里得算法 (Extended Euclidean algorithm) 是欧几里得算法(辗转相除法)的扩展。

给定两个 非零整数 a 与 b,必存在有 整数 x 与 y,使得 ax+by=gcd(a,b)ax + by = gcd(a, b)

1
2
3
4
5
6
7
8
9
10
11
12
int exGcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int g = exGcd(b, a%b, x, y);
int temp = x;
x = y;
y = temp - a / b * y;
return g;
}

x 与 y 的所有解

x=x+bgcdKy=yagcdKKx' = x + \frac{b}{gcd}*K\\ y' = y - \frac{a}{gcd}*K\\ K 为任意整数

x 的最小非负整数解(x%bgcd+bgcd)%bgcd(x \% \frac{b}{gcd} + \frac{b}{gcd}) \% \frac{b}{gcd}(使其必然为正数)

ax + by = c 求解

可以根据上面求解的扩展欧几里来进一步的求解 ax+by=cax + by = c(c 为任意整数)

假设 ax+by=gcd(a,b)ax + by = gcd(a, b) 有一组解 (x0,y0)(x_0, y_0)

ax+by=gcd(a,b)cgcdacx0gcd+bcy0gcd=cax + by = gcd(a, b)\\ 两边同乘\frac{c}{gcd}\\ a\frac{cx_0}{gcd} + b\frac{cy_0}{gcd}=c

ax+by=cax + by = c 存在解的 充要条件c%gcd==0c \% gcd == 0,且有一组解为 (cx0gcd,cy0gcd)(\frac{cx_0}{gcd}, \frac{cy_0}{gcd})

ax+by=cax + by = c 的全部解:

x=cx0gcd+bgcdKy=cy0gcdagcdKKx' = \frac{cx_0}{gcd} + \frac{b}{gcd}*K\\ y' = \frac{cy_0}{gcd} - \frac{a}{gcd}*K\\ K 为任意整数

同余式 ax ≡​ c (mod m) 的求解

同余式:设m是给定的一个正整数,a、b是整数,若满足 mm% (a-b) == 0,则称 a 与 b 对模 m 同余,记为 ab(mod m)a \equiv b (mod \ m)

  • 每一整数都各自与 [0, m)[0,\ m) 的唯一整数同余

可以将 axc(mod m)ax \equiv c (mod\ m) 化成 ax+by=cax + by = c

  • 根据同余式定义:(axc)%m=0(ax - c) \% m = 0,因此存在 y 使得 axc=myax - c = my 成立,移项后令 y = -y 即可得到 ax+by=cax + by = c

因此可以得到以下结论:

acmm11. cequation%gcd(a,m)0axc(mod m)2. c%gcd(a,m)=0axc(mod m)gcd(a,m)mx=x+mgcd(a,m)KK=01gcd(a,m)1xax+my=c设 a,c,m 是整数,其中 m \ge 1,则\\ 1.\ 若 cequation \% gcd(a, m) \neq 0,则同余式 ax \equiv c (mod\ m) 无解\\ 2.\ 若 c \% gcd(a, m) = 0,则同余式 ax \equiv c (mod\ m) 恰好有 gcd(a, m) 个模m意义下不同的解,且解的形式为:\\ x'=x+\frac{m}{gcd(a, m)} * K\\ 其中K = 0,1,……,gcd(a, m) - 1,x 是 ax + my = c 的一个解

文章作者: EasonZzZz
文章链接: http://yoursite.com/2021/04/19/算法之旅/扩展欧几里得算法/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Nice To Meet U