gcd与exgcd(裴蜀定理)
gcd(欧几里得算法)与最大公因数
-
公式: g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a gcd(a,b)=gcd(b,a%b ) ) )
-
证明:
设 a > b a>b a>b,证明 a , b a,b a,b的公因数和 b , a − b b,a-b b,a−b的公因数是同样的一堆数
首先,有结论:若 x ∣ a , x ∣ b , 那么 x ∣ ( a − b ) x|a,x|b,那么x|(a-b) x∣a,x∣b,那么x∣(a−b).
设 a a a和 b b b的公因子集合为 S 1 S1 S1, b b b 和 ( a – b ) (a – b) (a–b)的公因子集合为 S 2 S2 S2。那么,
对于任意的 x ∈ S 1 x∈S1 x∈S1,有 x ∣ a x|a x∣a,且 x ∣ b x|b x∣b,所以 x ∣ ( a – b ) x|(a – b) x∣(a–b),则 x x x ∈ \in ∈ S2 ,于是 ,于是 ,于是S1$ ⊂ \subset ⊂ S 2 S2 S2;
对于任意的 x ∈ S 2 x∈S2 x∈S2,有 x ∣ b x|b x∣b,且 x ∣ ( a – b ) x|(a – b) x∣(a–b),所以 x ∣ a x|a x∣a,则 x ∈ S 1 x∈S1 x∈S1,于是 S 2 S2 S2 ⊂ \subset ⊂ S 1 S1 S1。
所以 S 1 = S 2 S1=S2 S1=S2, g c d ( a , b ) = m a x ( S 1 ) = m a x ( S 2 ) = g c d ( b , a – b ) gcd(a, b) = max(S1) = max(S2) = gcd(b, a – b) gcd(a,b)=max(S1)=max(S2)=gcd(b,a–b)。
证明了 g c d ( a , b ) = g c d ( b , a – b ) gcd(a, b) = gcd(b, a – b) gcd(a,b)=gcd(b,a–b),也就可以进一步证明 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a, b) = gcd(b, a mod b) gcd(a,b)=gcd(b,amodb)。 -
代码:
#define ll long long
ll gcd(ll a,ll b)
{
if(b==0)return a;
else rteutn gcd(b,a%b);
}
- 复杂度: O ( l o g 2 m a x ( a , b ) ) O(log_2max(a,b)) O(log2max(a,b))
exgcd(扩展欧几里得算法)
-
前置知识:裴蜀定理 q w q qwq qwq
(1) 对任何 a , b ∈ Z a,b∈Z a,b∈Z和它们的最大公约数 d d d,关于未知数 x x x和 y y y的线性不定方程(称为裴蜀等式): a x + b y = c ax+by=c ax+by=c有整数解 ( x , y ) (x,y) (x,y)当且仅当 d ∣ c d∣c d∣c,可知有无穷多解。特别地,一定存在整数 x x x, y y y,使 a x + b y = d ax+by=d ax+by=d成立。
( 2 )推论:
a a a, b b b互质的充要条件是存在整数 x x x, y y y使 a x + b y = 1 ax+by=1 ax+by=1
( 3 )证明:
A : A: A:对于 ( a , b ∈ Z ) (a,b∈Z) (a,b∈Z), a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)一定有整数解 x , y x,y x,y
设 d = g c d ( a , b ) d=gcd(a,b) d=gcd(a,b),可得 d ∣ a , d ∣ b , d ∣ ( a x + b y ) d|a,d|b,d|(ax+by) d∣a,d∣b,d∣(ax+by)
满足对于某个 x , y x,y x,y ∈ \in ∈ Z Z Z,有 n = a x + b y n=ax+by n=ax+by的 n n n的集合叫 a a a与 b b b的线性组合集,设 s s s是 a a a与 b b b的线性组合集中最小的元素。
设 q = q= q= ⌊ \lfloor ⌊ a s \frac {a}{s} sa ⌋ \rfloor ⌋ 则有 r = r= r= a a a m o d mod mod s s s = a − q s = a − q ( a x + b y ) = a ( 1 − q x ) + b ( − q y ) =a-qs=a-q(ax+by)=a(1-qx)+b(-qy) =a−qs=a−q(ax+by)=a(1−qx)+b(−qy)所以 r r r也是 a a a与 b b b的线性组合集中的元素。已知 s s s是这个线性组合集中的最小正整数, 0 0 0 ≤ \leq ≤ r r r ≤ \leq ≤ s s s,所以 r = 0 r=0 r=0。所以 s ∣ a s|a s∣a。同理 s ∣ b s|b s∣b。所以 s s s是 a 与 b a与b a与b的公因数。
因为 d d d是最大公约数,所以 d d d ≤ \leq ≤ s s s。
因为对于任意 x , y ∈ Z x,y∈Z x,y∈Z,有 d ∣ ( a x + b y ) d∣(ax+by) d∣(ax+by),而对于某个 x , y ∈ Z x,y∈Z x,y∈Z,有 s = a x + b y s=ax+by s=ax+by,所以有 d ∣ s d∣s d∣s,故 d d d ≥ \geq ≥ s s s。
显然, s = d s=d s=d 所以 s = g c d ( a , b ) s=gcd(a,b) s=gcd(a,b)
根据 s s s的定义, s s s是 a a a与 b b b的线性组合集中的最小正元素,故 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)一定有整数解 x , y x,y x,y,亦可知对于 a , b ∈ Z a,b∈Z a,b∈Z, g c d ( a , b ) gcd(a,b) gcd(a,b)是 a x + b y ( x , y ∈ Z ) ax+by(x,y∈Z) ax+by(x,y∈Z)的最小正元素
B : B: B:对于 ( a , b ∈ Z ) , a x + b y = c (a,b∈Z),ax+by=c (a,b∈Z),ax+by=c有整数解的条件是 g c d ( a , b ) ∣ c gcd(a,b)∣c gcd(a,b)∣c
充分性:设 d = g c d ( a , b ) d=gcd(a,b) d=gcd(a,b),已知 a x + b y = d ax+by=d ax+by=d一定有整数解,设其解为 ( x 0 , y 0 ) (x0,y0) (x0,y0)。 d ∣ c d∣c d∣c,则存在 k ∈ Z k∈Z k∈Z,使得 c = k d = k ( a x + b y ) = a ( k x ) + b ( k y ) c=kd=k(ax+by)=a(kx)+b(ky) c=kd=k(ax+by)=a(kx)+b(ky),即解为 ( k x 0 , k y 0 ) (kx0,ky0) (kx0,ky0)。
必要性:因 a x 1 + b y 1 = c , x 1 , y 1 ∈ Z ax1+by1=c,x1,y1∈Z ax1+by1=c,x1,y1∈Z,设 d = g c d ( a , b ) d=gcd(a,b) d=gcd(a,b),有 d ∣ a d∣a d∣a, d ∣ b d∣b d∣b, d ∣ ( a x 1 , b y 1 ) d∣(ax1,by1) d∣(ax1,by1),即 d ∣ c d∣c d∣c
是不是简单易懂!!!
是不是简单易懂!!!
是不是简单易懂!!! -
exgcd
exgcd可以用来判断并求解形如 a x + b y = c ax +by = c ax+by=c 的方程,当且仅当 g c d ( a , b ) ∣ c gcd(a, b) | c gcd(a,b)∣c时,存在整数解 x , y x, y x,y(证明:裴蜀定理)。
于是它也可以用来求逆元(链接在下面噻qwq) -
怎么求解?
a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)可以化成 a y + b ( x − ay+b(x- ay+b(x− ⌊ \lfloor ⌊ a b \frac{a}{b} ba ⌋ \rfloor ⌋ ) x = g c d ( a , b ) )x=gcd(a,b) )x=gcd(a,b)然后可以在gcd的循环过程中完成计算
可以背代码,但是如果理解的话,就可以当场现推了!!!
个人认为,还是重在理解,背代码没有灵魂 -
怎么现推呢 q w q qwq qwq
g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a gcd(a,b)=gcd(b,a m o d mod mod b ) b) b),在gcd递归中我们会使 a = b , b = a a=b,b=a a=b,b=a m o d mod mod b b b.
则有方程 b ∗ x 1 + ( a b *x_1 +(a b∗x1+(a m o d mod mod b ) ∗ y 1 = g c d ( b , a b) * y_1 = gcd(b, a b)∗y1=gcd(b,a m o d mod mod b ) = g c d ( a , b ) b)=gcd(a,b) b)=gcd(a,b)
把 a a a m o d mod mod b b b拆开写
可以得到 b ∗ x 1 + ( a − b ∗ ⌊ a / b ⌋ ) ∗ y 1 = g c d ( a , b ) b * x_1 + (a - b * ⌊a / b⌋) * y_1 =gcd(a, b) b∗x1+(a−b∗⌊a/b⌋)∗y1=gcd(a,b)
前置知识乘法分配律hhhh
即: a ∗ y 1 + b ∗ ( x 1 − ⌊ a / b ⌋ ∗ y 1 ) = g c d ( a , b ) a * y_1 +b * (x_1 - ⌊a / b⌋ *y_1) = gcd(a, b) a∗y1+b∗(x1−⌊a/b⌋∗y1)=gcd(a,b)
所以原方程中: x = y 1 , y = x 1 − ⌊ a / b ⌋ ∗ y 1 x = y_1, y = x_1 - ⌊a / b⌋ *y_1 x=y1,y=x1−⌊a/b⌋∗y1。 -
代码
ll exgcd(ll &x,ll &y,ll a,ll b)
{
if(b==0)
{
x=1;y=0;return a;
}
else
{
return exgcd(x,y,b,a%b);
}
ll t=y;y=x-(a/b)*y;x=t;
}
这段代码的返回值为
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)。
x
,
y
x,y
x,y是方程
a
x
+
b
y
=
g
c
d
(
a
,
b
)
ax +by = gcd(a,b)
ax+by=gcd(a,b)的一组解。
那么对于方程
a
x
+
b
y
=
c
(
g
c
d
(
a
,
b
)
∣
c
)
ax + by = c (gcd(a, b) | c)
ax+by=c(gcd(a,b)∣c)的一组解是
x
′
=
x
∗
c
/
g
c
d
(
a
,
b
)
,
y
′
=
y
∗
c
/
g
c
d
(
a
,
b
)
x' = x * c / gcd(a, b), y' = y * c / gcd(a, b)
x′=x∗c/gcd(a,b),y′=y∗c/gcd(a,b)
6. 求多组解
a
x
+
b
y
=
c
ax+by=c
ax+by=c
a
x
1
+
b
y
1
=
c
ax_1+by_1=c
ax1+by1=c
可得
a
(
x
−
x
0
)
+
b
(
y
−
y
0
)
=
0
a(x-x_0)+b(y-y_0)=0
a(x−x0)+b(y−y0)=0
两边同时除以gcd(a,b)得
a
(
x
−
x
0
)
g
c
d
(
a
,
b
)
+
b
(
y
−
y
0
)
g
c
d
(
a
,
b
)
=
0
\frac{a(x-x_0) }{gcd(a,b)}+\frac {b(y-y_0)}{gcd(a,b)}=0
gcd(a,b)a(x−x0)+gcd(a,b)b(y−y0)=0
因为
a
g
c
d
(
a
,
b
)
\frac{a}{gcd(a,b)}
gcd(a,b)a与
b
g
c
d
(
a
,
b
)
\frac{b}{gcd(a,b)}
gcd(a,b)b互质
所以
(
x
−
x
0
)
是
g
c
d
(
a
,
b
)
(x-x_0)是gcd(a,b)
(x−x0)是gcd(a,b)的倍数
所以
(
x
−
x
0
)
=
t
g
c
d
(
a
,
b
)
(x-x_0)=tgcd(a,b)
(x−x0)=tgcd(a,b)
x
=
t
(
g
c
d
(
a
,
b
)
)
+
x
0
x=t(gcd(a,b))+x_0
x=t(gcd(a,b))+x0
em。。。exgcd的性质使它可以被用来求逆元
关于逆元。。。
链接在这里啦关于逆元