专栏文章

学习笔记:扩展欧几里得

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio5fb0b
此快照首次捕获于
2025/12/02 13:39
3 个月前
此快照最后确认于
2025/12/02 13:39
3 个月前
查看原文

前置知识1:欧几里得算法(辗转相除法)

gcd(a,b)=gcd(b,amodb)\gcd(a,b) = \gcd(b,a \bmod b)

前置知识2:裴蜀定理

如果有 d=gcd(a,b)d = \gcd(a,b),则有整数组 (x,y)(x,y) 使得 ax+by=gcd(a,b)ax + by = \gcd(a,b)

什么是扩展欧几里得?

根据裴蜀定理,方程ax+by=gcd(a,b)ax + by = \gcd(a,b) 一定有一组整数解 (x,y)(x,y)
现在我们需要求出符合条件的 (x,y)(x,y)

求解

根据已知式子,构造可得:
bx1+(amodb)y1=gcd(b,amodb)bx_1 + (a \bmod b)y_1 = \gcd(b,a \bmod b)
根据欧几里得算法,可得:
gcd(a,b)=gcd(b,amodb)\gcd(a,b) = \gcd(b,a \bmod b)
等量代换得:
ax+by=bx1+(amodb)y1ax + by = bx_1 + (a \bmod b)y_1
我们知道 amodb=ab×a÷ba \bmod b = a - b \times \lfloor a \div b \rfloor,那么代入式子得:
ax+by=bx1+(ab×a÷b)ax + by = bx_1 + (a - b \times \lfloor a \div b \rfloor)
将含有 a,ba,b 的项放到一起得:
a(xy1)b(x1ya÷by1)=0a(x - y_1) - b(x_1 - y - \lfloor a \div b \rfloor y_1) = 0
我们知道 a,ba,b 任意,那么想让两式相减得 00,只能让两括号内的值都为 00。也就是:
xy1=0x1ya÷by1=0x - y_1 = 0 \\ x_1 - y - \lfloor a \div b \rfloor y_1 = 0
化简,得:
x=y1y=x1a÷by1x = y_1 \\ y = x_1 - \lfloor a \div b \rfloor y_1
注意到我们可以通过求解 x1,y1x_1,y_1 来推导出 x,yx,y
那么我们不妨再次通过欧几里得算法,让原来的 (x,y)(x,y) 等于现在的 (x1,y1)(x_1,y_1),以此推出 (x2,y2)(x_2,y_2) 来求解 (x1,y1)(x_1,y_1)。以此类推,不断分解,最终依次向上推得出 x,yx,y 的值。
这样的分解不是无止境的,当某一组 (xn,yn)(x_n,y_n)yny_n 的系数为 00xnx_n 就可以被求出来。而 yny_n 一般将它看作 00
如此,就可以求出 ax+by=gcd(a,b)ax + by = \gcd(a,b) 的解了。

评论

0 条评论,欢迎与作者交流。

正在加载评论...