导语
这是一个有关数论的知识,涉及最大公约数
正文
讲解
设
a
a
a ,
b
b
b 是两个正整数,求
x
x
x ,
y
y
y 满足
~~~~~~~~
~~~~~~~~
gcd
(
a
,
b
)
=
a
x
+
b
y
(
1
)
\gcd(a ,b) = ax + by~~~~~~~~(1)
gcd(a,b)=ax+by (1)
由
b
≠
0
⇒
gcd
(
a
,
b
)
=
gcd
(
b
,
a
m
o
d
b
)
b \ne 0 \xRightarrow{} \gcd(a ,b) = \gcd(b ,a\mod b)
b=0gcd(a,b)=gcd(b,amodb) (辗转相除法)
设此时
x
′
x'
x′ ,
y
′
y'
y′ 使得
~~~~~~~~~~~~~~~~
b
x
′
+
(
a
m
o
d
b
)
y
′
=
gcd
(
b
,
a
m
o
d
b
)
(
2
)
bx' + (a \mod b) y' = \gcd (b ,a \mod b)~~~~~~~~(2)
bx′+(amodb)y′=gcd(b,amodb) (2) (跟第二行差不多)
由
(
1
)
(1)
(1) 和
(
2
)
(2)
(2) 可得
~~~~~~~~~~~~~~~~
b
x
′
+
(
a
m
o
d
b
)
y
′
=
a
x
+
b
y
bx' + (a \mod b) y' = ax + by
bx′+(amodb)y′=ax+by
注意到
a
m
o
d
b
=
a
−
⌊
a
b
⌋
b
a \mod b = a - \left\lfloor\dfrac{a}{b}\right\rfloor b
amodb=a−⌊ba⌋b (此处的括号为向下取整,
⌊
a
b
⌋
\left\lfloor\dfrac{a}{b}\right\rfloor
⌊ba⌋为
a
÷
b
a \div b
a÷b 的商)
所以
a
x
+
b
y
=
b
x
′
+
(
a
−
⌊
a
b
⌋
b
)
y
′
ax + by = bx' + ( a - \left\lfloor\dfrac{a}{b}\right\rfloor b) y'
ax+by=bx′+(a−⌊ba⌋b)y′
注:我们注意到这个方程里面有个未知数却只有个方程,那么根据线性代数相关知识我们可以知道这东西是有无数组解的。注意到这个等式每一项只与a或b有关,所以我们只需要按照a和b分类一下这个东西就可以获得一组特解
—结尾dalao的博客
变形得
~~~~~~~~~~~~~~~~
a
x
+
b
y
=
a
y
′
+
b
(
x
′
−
⌊
a
b
⌋
y
′
)
ax + by = ay' + b(x' - \left\lfloor\dfrac{a}{b}\right\rfloor y')
ax+by=ay′+b(x′−⌊ba⌋y′)
得一组解 x = y ′ , y = x ′ − ⌊ a b ⌋ y ′ x = y',y = x' - \left\lfloor\dfrac{a}{b}\right\rfloor y' x=y′,y=x′−⌊ba⌋y′
可以发现这是一个递归的式子,当 b = 0 b = 0 b=0 时是边界
因此,当 b = 0 b = 0 b=0 时,显然 x = 1 , y = 0 x = 1,y = 0 x=1,y=0 时满足 gcd ( a , b ) = a x + b y \gcd(a ,b) = ax + by gcd(a,b)=ax+by
代码
#define pa pair <int ,int >
pa exgcd (int r1 ,int r2) {
if (r2 == 0) return make_pair (1 ,0);
pa tmp = exgcd (r2 ,r1 % r2);
pa ans = make_pair (tmp.second ,tmp.first - (r1 / r2) * tmp.second);
return ans;
}
结语
谢谢大家
——2020.9.30