扩展欧几里得、同余方程、乘法逆元
1.欧几里得
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数 gcd(a,b)。基本算法:设 a = qb + r,其中a,b,q,r都是整数,则 gcd(a,b) = gcd(b,r),即 gcd(a,b) = gcd(b,a%b)。
证明:
a = qb + r
如果 r = 0,那么 a 是 b 的倍数,此时显然 b 是 a 和 b 的最大公约数。
如果 r ≠ 0,任何整除 a 和 b 的数必定整除 a - qb = r,而且任何同时整除 b 和 r 的数必定整除 qb + r = a,所以 a 和 b 的公约数集合与 b 和r 的公约数集合是相同的。特别的,a 和 b 的最大公约数是相同的。
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a%b);
}
2.扩展欧几里得
贝祖定理:ax+by=m 有整数解当且仅当m为gcd(a,b)的倍数
扩展欧几里得算法就是在求a,b最大公约数的同时,求出贝祖等式中x,y的一组整数解
公式推导
设
k
=
m
/
g
c
d
(
a
,
b
)
,
则
求
出
a
x
+
b
y
=
g
c
d
(
a
,
b
)
的
解
后
,
再
乘
以
k
就
得
到
原
来
的
解
已
知
a
x
1
+
b
y
1
=
g
c
d
(
a
,
b
)
,
且
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
%
b
)
则
b
x
2
+
(
a
−
a
/
b
∗
b
)
y
2
=
g
c
d
(
b
,
a
%
b
)
结
合
两
条
式
子
,
得
到
a
x
1
+
b
y
1
=
b
x
2
+
(
a
−
a
/
b
∗
b
)
y
2
整
理
,
即
a
x
1
+
b
y
1
=
a
y
2
+
b
(
x
2
−
a
/
b
/
∗
y
2
)
所
以
得
到
递
推
式
x
1
=
y
2
,
y
1
=
x
2
−
a
/
b
∗
y
2
设k=m/gcd(a,b),则求出ax+by=gcd(a,b)的解后,再乘以k就得到原来的解\\ 已知ax_1+by_1=gcd(a,b),且gcd(a,b)=gcd(b,a\%b)\\ 则bx_2+(a-a/b*b)y_2=gcd(b,a\%b)\\ 结合两条式子,得到ax_1+by_1=bx_2+(a-a/b*b)y_2\\ 整理,即ax_1+by_1=ay_2+b(x_2-a/b/*y_2)\\ 所以得到递推式x_1=y_2,y_1=x_2-a/b*y_2
设k=m/gcd(a,b),则求出ax+by=gcd(a,b)的解后,再乘以k就得到原来的解已知ax1+by1=gcd(a,b),且gcd(a,b)=gcd(b,a%b)则bx2+(a−a/b∗b)y2=gcd(b,a%b)结合两条式子,得到ax1+by1=bx2+(a−a/b∗b)y2整理,即ax1+by1=ay2+b(x2−a/b/∗y2)所以得到递推式x1=y2,y1=x2−a/b∗y2
递推到最后b=0,此时x=1,y=0就是一组整数解。
int exgcd(int a, int b, int &x, int &y)
{
if(b == 0)
{//推理1,终止条件
x = 1;
y = 0;
return a;
}
int r = exgcd(b, a%b, x, y);
//先得到更底层的x2,y2,再根据计算好的x2,y2计算x1,y1。
//推理2,递推关系
int t = y;
y = x - (a/b) * y;
x = t;
return r;
}
通解:
x = x 0 + ( b / g c d ) ∗ t y = y 0 − ( a / g c d ) ∗ t x=x_0+(b/gcd)*t\\ y=y_0-(a/gcd)*t x=x0+(b/gcd)∗ty=y0−(a/gcd)∗t
同余方程
形 如 a x ≡ c ( m o d b ) , 表 示 a x % b = c % b 形如ax\equiv c(mod\ b),表示ax\%b =c\%b\\ 形如ax≡c(mod b),表示ax%b=c%b
如何与上述贝祖定理联系呢?由上述关系可设:
a
x
=
k
1
b
+
r
c
=
k
2
b
+
r
即
a
x
=
k
1
b
+
(
c
−
k
2
b
)
a
x
+
b
(
k
2
−
k
1
)
=
c
ax=k_1b+r\\ c=k_2b+r\\ 即ax=k_1b+(c-k_2b)\\ ax+b(k_2-k_1)=c
ax=k1b+rc=k2b+r即ax=k1b+(c−k2b)ax+b(k2−k1)=c
所以在已知a,b,c的值情况下**(满足解题条件**),可以求出x的整数解,通解
乘法逆元
a x ≡ 1 ( m o d b ) ax\equiv 1(mod\ b) ax≡1(mod b)
同余方程的特殊情况,此时称x为a的乘法逆元,最小正整数解