【欧几里得定理】
定义:
-
gcd
(
a
,
b
)
=
gcd
(
b
,
a
m
o
d
  
b
)
\gcd(a,b)=\gcd(b,a\mod b)
gcd(a,b)=gcd(b,amodb)
应用:
故得到 求解gcd的辗转相除法
模板:
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b; //这样写防止溢出
}
【拓展欧几里得】
定义:
- 已知 a , b a, b a,b求解一组 x , y x,y x,y,使它们满足贝祖等式: a x + b y = gcd ( a , b ) = d ax+by =\gcd(a, b) =d ax+by=gcd(a,b)=d(解一定存在)
推导:
已知:
a
x
1
+
b
y
1
=
gcd
(
a
,
b
)
=
d
ax_1+by_1=\gcd(a,b)=d
ax1+by1=gcd(a,b)=d —— ①
b
x
2
+
(
a
m
o
d
  
b
)
y
2
=
gcd
(
b
,
a
m
o
d
  
b
)
=
d
bx_2+(a\mod b)y_2=\gcd(b,a\mod b)=d
bx2+(amodb)y2=gcd(b,amodb)=d —— ②
由欧几里得定理
gcd
(
a
,
b
)
=
gcd
(
b
,
a
m
o
d
  
b
)
\gcd(a,b)=\gcd(b,a\mod b)
gcd(a,b)=gcd(b,amodb),
可得:
a
x
1
+
b
y
1
=
b
x
2
+
(
a
m
o
d
  
b
)
y
2
ax_1+by_1=bx_2+(a\mod b)y_2
ax1+by1=bx2+(amodb)y2
  
⟹
  
a
x
1
+
b
y
1
=
b
x
2
+
(
a
−
[
a
b
]
b
)
y
2
\implies ax_1+by_1=bx_2+(a-[\frac{a}{b}]b)y_2
⟹ax1+by1=bx2+(a−[ba]b)y2
  
⟹
  
a
x
1
+
b
y
1
=
a
y
2
+
b
(
x
2
−
[
a
b
]
y
2
)
\implies ax_1+by_1=ay_2+b(x_2-[\frac{a}{b}]y_2)
⟹ax1+by1=ay2+b(x2−[ba]y2)
所以解得: x 1 = y 2        y 1 = x 2 − [ a b ] y 2 x_1=y_2\;\;\;y_1=x_2-[\frac{a}{b}]y_2 x1=y2y1=x2−[ba]y2
当我们已知 x 2 , y 2 x_2,y_2 x2,y2时,便可以往回推导得到 x 1 , y 1 x_1,y_1 x1,y1。可以发现,当 b = 0 b=0 b=0(即辗转相除结束)时,有 d = a , x = 1 d=a,x=1 d=a,x=1,所以可以得到一组 x , y x,y x,y: x = 1 , y = 0 x=1,y=0 x=1,y=0( y y y可以为任意值,通常取0),然后以此解回推,即可得到一组特解 x 0 , y 0 x_0,y_0 x0,y0。
模板:
void exgcd(int a,int b,int &d,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
d=a;
}
else
{
exgcd(b,a%b,d,y,x);
y-=x*(a/b)
}
}
从特解到通解:
已解得一组特解 x 0 , y 0 x_0,y_0 x0,y0,满足: a x 0 + b y 0 = gcd ( a , b ) = d ax_0+by_0 =\gcd(a, b) =d ax0+by0=gcd(a,b)=d
-
对于: a x + b y = gcd ( a , b ) = d ax+by =\gcd(a, b) =d ax+by=gcd(a,b)=d
其通解为: X = x 0 + k b d            Y = y 0 − k a d          ( k ∈ Z ) X=x_0+k\frac{b}{d}\;\;\;\;\;Y=y_0-k\frac{a}{d}\;\;\;\;(k\in Z) X=x0+kdbY=y0−kda(k∈Z)
-
对于: a x + b y = c ax+by =c ax+by=c
当且仅当 d ∣ c d|c d∣c( 即 gcd ( a , b ) \gcd(a,b) gcd(a,b)整除 c c c,或者说 c c c被 gcd ( a , b ) \gcd(a,b) gcd(a,b)整除 )时,有解,
其通解为: X = c d x 0 + k b d            Y = c d y 0 − k a d          ( k ∈ Z ) X=\frac{c}{d}x_0+k\frac{b}{d}\;\;\;\;\;Y=\frac{c}{d}y_0-k\frac{a}{d}\;\;\;\;(k\in Z) X=dcx0+kdbY=dcy0−kda(k∈Z)
应用:
①求解方程(形如 a x + b y = c ax+by =c ax+by=c)的特解/通解
例如要求求出平面内,直线 a x + b y = c ax+by=c ax+by=c上在某些范围内的整数点。
②※ 求解线性同余方程: a x = c ( m o d b ) ax=c\pmod b ax=c(modb)
③求单个逆元
求 a a a在 m o d    p \mod p modp下的逆元,设 a a a的逆元为 x x x
即求解线性同余方程: a x = 1 ( m o d p ) ax=1\pmod p ax=1(modp)