什么是欧几里得算法?
简单点说,
(
a
,
b
)
=
(
b
,
a
(a,b)=(b,a
(a,b)=(b,a
m
o
d
mod
mod
b
)
b)
b)
- 什么是扩展欧几里得算法?
扩展欧几里得算法是欧几里得算法(又叫辗转相除法)的扩展。除了计算 a a a和 b b b两个整数的最大公约数,此算法还能找到整数 x x x y y y(其中一个很可能是负数)。通常谈到最大公因子时, 我们都会提到一个非常基本的事实: 给予二整数 a a a与 b b b, 必存在有整数 x x x 与 y y y 使得 a x + b y = ( a , b ) ax + by = (a,b) ax+by=(a,b)。有两个数 a , b a,b a,b,对它们进行辗转相除法,可得它们的最大公约数——这是众所周知的。然后,收集辗转相除法中产生的式子,倒回去,可以得到 a x + b y = ( a , b ) ax+by=(a,b) ax+by=(a,b)的整数解。
——————————————————————摘自百度百科
- 如何正确使用欧几里得算法(exgcd)
好的, 进入正题了。
题意:求方程 a x + b y = ( a , b ) ax+by=(a,b) ax+by=(a,b) x , y x,y x,y的整数解。
不妨设 a = b q + r a=bq+r a=bq+r,根据小学的说法, q q q是商 , r r r是余数,所以对于确定的 a a a和 b b b, q q q和 r r r的值是唯一的。
我们把问题通过欧几里得算法转化,即从 ( a , b ) (a,b) (a,b)转化到了 ( b , r ) (b,r) (b,r)( r r r为 a a a m o d mod mod b b b),设求出方程 b x + r y = ( a , b ) bx+ry=(a,b) bx+ry=(a,b)的解为 x = x 0 , y = y 0 x=x_0,y=y_0 x=x0,y=y0,考虑将它变形到原式。
怎么变形呢?
将刚才的 a = b q + r a=bq+r a=bq+r代入 a x + b y = ( a , b ) ax+by=(a,b) ax+by=(a,b),即为
x ( b q + r ) + b y = ( a , b ) x(bq+r)+by=(a,b) x(bq+r)+by=(a,b)
去括号,得 x b q + x r + b y = ( a , b ) xbq+xr+by=(a,b) xbq+xr+by=(a,b)
把 b b b提出来,得 b ( x q + y ) + x r = ( a , b ) b(xq+y)+xr=(a,b) b(xq+y)+xr=(a,b)
你发现了什么?
还没发现?拿上面的式子对比一下:
因为
b x 0 + r y 0 = ( a , b ) , bx_0+ry_0=(a,b), bx0+ry0=(a,b),
b ( x q + y ) + x r = ( a , b ) b(xq+y)+xr=(a,b) b(xq+y)+xr=(a,b)
所以
b x 0 + r y 0 = b ( x q + y ) + x r bx_0+ry_0=b(xq+y)+xr bx0+ry0=b(xq+y)+xr
x = y 0 , y = x 0 − y 0 q x=y_0,y=x_0-y_0q x=y0,y=x0−y0q
递归即珂,边界条件 ( b , 0 ) (b,0) (b,0)的解为 x = 1 , y = 0 x=1,y=0 x=1,y=0.
额,上面只是基础做法,下面还有
题意:给出
a
,
b
,
c
a,b,c
a,b,c,求方程
a
x
+
b
y
=
c
ax+by=c
ax+by=c的所有整数解。
我们知道,只有在
(
a
,
b
)
∣
c
(a,b)|c
(a,b)∣c时,这个方程才会有整数解。
因为
(
a
,
b
)
∣
c
(a,b)|c
(a,b)∣c,所以不妨设
k
=
c
(
a
,
b
)
k=\frac{c}{(a,b)}
k=(a,b)c,根据等式性质,得
a
x
′
k
+
b
y
′
k
=
(
a
,
b
)
×
k
ax'k+by'k=(a,b)\times k
ax′k+by′k=(a,b)×k
得出一组解为
x
1
=
x
′
k
,
y
1
=
y
′
k
x_1=x'k,y_1=y'k
x1=x′k,y1=y′k
那么解集就出来拉!
{
(
x
,
y
)
∣
x
=
x
1
+
l
×
b
(
a
,
b
)
,
y
=
y
1
−
l
×
a
(
a
,
b
)
,
l
∈
Z
(x, y) | x=x_1+ l \times \frac{b}{(a,b)},y=y_1-l\times \frac{a}{(a,b)},l \in{\mathbb{Z}}
(x,y)∣x=x1+l×(a,b)b,y=y1−l×(a,b)a,l∈Z}
参照了几篇blog,在此感谢QwQ
好像一点也不易懂