同余定理
定理: gcd(a, b) = gcd(b, a%b)
证明:
设
a
=
k
b
+
r
,
a = kb+r,
a=kb+r,则r=a%b
假设d是(a,b)的一个公约数,则有d|a,d|b
而
r
=
a
−
k
b
,
r=a-kb,
r=a−kb,因此
d
∣
r
,
d|r,
d∣r,因此
d
d
d是(b,a%b)的公约数
假设d是(b,a%b)的公约数,则有
d
∣
b
,
d
∣
r
d|b,d|r
d∣b,d∣r
而
a
=
k
b
+
r
,
a=kb+r,
a=kb+r,因此
d
∣
a
,
d|a,
d∣a,因此
d
d
d是
(
a
,
b
)
(a,b)
(a,b)的公约数
因此(a,b)和(b,a%b)的公约数是相同的,其最大公约数也必然相同
int gcd(a,b){return !b?a:gcd(b,a%b);}
更相减损术
若
a
<
b
,
a<b,
a<b,
s
w
a
p
(
a
,
b
)
swap(a,b)
swap(a,b)
若
a
a
a为奇数,
b
b
b为偶数,
G
C
D
(
a
,
b
)
=
G
C
D
(
a
,
b
/
2
)
GCD(a,b)=GCD(a,b/2)
GCD(a,b)=GCD(a,b/2)
若
a
a
a为偶数,
b
b
b为奇数,
G
C
D
(
a
,
b
)
=
G
C
D
(
a
/
2
,
b
)
GCD(a,b)=GCD(a/2,b)
GCD(a,b)=GCD(a/2,b)
若
a
a
a为偶数,
b
b
b为偶数,
G
C
D
(
a
,
b
)
=
G
C
D
(
a
/
2
,
b
/
2
)
GCD(a,b)=GCD(a/2,b/2)
GCD(a,b)=GCD(a/2,b/2)
若
a
a
a为奇数,
b
b
b为奇数,
G
C
D
(
a
,
b
)
=
G
C
D
(
a
−
b
,
b
)
GCD(a,b)=GCD(a-b,b)
GCD(a,b)=GCD(a−b,b)
丢番图方程
裴蜀定理:丢番图方程
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
扩展gcd算法:求丢番图方程
a
x
+
b
y
=
c
ax+by=c
ax+by=c的整数解
推导:
a
x
1
ax_{1}
ax1 +
b
y
1
by_{1}
by1 =
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)
b
x
2
bx_{2}
bx2 +
(
a
(a
(a%b)
y
2
y_{2}
y2 =
g
c
d
gcd
gcd(b,a%b)
由
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b) =
g
c
d
gcd
gcd(b, a%b)得到:
a
x
1
ax_{1}
ax1 +
b
y
1
by_{1}
by1 =
b
x
2
bx_{2}
bx2 +
(
a
(a
(a%b)
y
2
y_{2}
y2 =
a
y
2
ay_{2}
ay2 +
b
(
x
2
−
(
a
/
b
)
y
2
b(x2-(a/b)y_{2}
b(x2−(a/b)y2)
所以
x
1
x_{1}
x1 =
y
2
y_{2}
y2
y
1
y_{1}
y1 =
x
2
x_{2}
x2 -
(
a
/
b
)
y
2
(a/b)y_{2}
(a/b)y2
递归实现方程解
void exgcd(int a, int b, int &x, int &y) {
if(b == 0) {x = 1; y = 0; return;}
exgcd(b, a%b, x, y);
int t = x; x = y; y = t - a/b*y;
}
上面求得其中一组解
(
x
1
x_{1}
x1+
k
b
g
c
d
(
a
,
b
)
\frac{kb}{gcd(a,b)}
gcd(a,b)kb,
y
1
y_{1}
y1+
k
a
g
c
d
(
a
,
b
)
\frac{ka}{gcd(a,b)}
gcd(a,b)ka)
是该方程的通解
证明:代入易证
相关题目
SDOI2009 最大公约数