一、欧几里得定理
1. 同余定理
\((a+b)\ \%\ mod=(a\ \%\ mod+b\ \%\ mod)\ \%\ mod\)
\((a-b)\ \%\ mod=(a\ \%\ mod-b\ \%\ mod)\ \%\ mod\)
\((a*b)\ \%\ mod=(a\ \%\ mod*b\ \%\ mod)\ \%\ mod\)
注意:除法没有同余的性质,需要求逆元。
2. 欧几里得定理
\(gcd(a,b)=gcd(b,a\%b)\)
3. 欧几里得定理用法
(1) 求最大公约数
//最大公约数,辗转相除法
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
(2) 求最小公倍数
//最小公倍数
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
二、扩展欧几里得定理
1. 定义
\(ax+by=gcd(a,b)\),在已知\(a,b\)的情况下求解出一组\(x_0,y_0\)(特解)。
2. 推导过程
\(ax+by=gcd(a,b)\) \(①\)
根据欧几里得定理,有:
\(gcd(a,b)=gcd(b,a\%b)\) \(②\)
用\(b\)代替\(a\)的位置,用\(a\%b\)代替\(b\)的位置,得到:
\(bx_1+(a\%b)y_1=gcd(a,b)\) \(③\)
因为\(a\%b=a-\lfloor \frac{a}{b} \rfloor * b\) ,代入方程\(③\),得到:
\(bx_1+(a-a/b *b)y_1=gcd(a,b)\)
变形
\(ay_1+b(x_1-a/b)y_1=gcd(a,b)\) \(④\)
与方程\(①\)对比系数,得到
\(x=y_1,y=x_1-a/b*y_1\)
这就是扩展欧几里得算法中关键代码的由来。
int exgcd(int a, int b, int &x, int &y) {//返回gcd(a,b) 并求出解(引用带回)
if (b == 0) {
x = 1, y = 0;
return a;
}
int x1, y1, gcd;
gcd = exgcd(b, a % b, x1, y1);
x = y1, y = x1 - a / b * y1;
return gcd;
}
简化一下:
//yxc写法
int exgcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
3.性质
-
若通过扩展欧几里得求出一组特解(\(x_0\),\(y_0\)),那么有\(ax_0+by_0=d\)。
则方程的通解为: 其中\(k\)为任意整数,\(d=gcd(a,b)\)\(x=x_0+k*(b/d)\)
\(y=y_0-k*(a/d)\)
-
已知\(ax+by=d\)的解,对于\(ax+by=c\)的解,\(c\)为任意正整数,只有当\(d|c\)时才有解,
则方程的通解为: 其中\(k\)为任意整数,\(d=gcd(a,b)\)\(x=(c/d)x_0+k(b/d)\)
\(y=(c/d)y_0-k(a/d)\)
4.常见用法
(1)求形如\(ax+by=c\)的通解,或从中选取某些特解。
(2)求乘法逆元
(3)求解线性同余方程(组)
5.解题思路
-
先将问题转化成不定方程\(ax+by=c\)
-
\(a,b\)参数取正数,判断\(a,b\)是否为负数,为负数就\(a,b,c\)都乘上\(-1\),另外注意若\(a,b\)中只有一个是负数,那另一个不需要乘\(-1\),因为\(a,b\)本身是含未知数参数的。
-
\(d=exgcd(a,b,x_0,y_0)\),然后判断是否有解采用\(if(c\%d==0)\)
-
求特解:\(x_1=x_0*c/d\), \(y_1=y_0*c/d\);
-
求通解:\(x=x_1 + b/d*t\) , \(y=y_1-a/d*t\) (其中 \(t\) 为整数)
-
求最小解:\(int\ s=b/d\); \(x_{min}= (x_1\%s+s)\%s\);
6.例题实例
问题描述:对于 \(ax+by=c\) 的不定方程求通解或特解?
设 \(d=gcd(a,b)\),
若 \(c\%d!=0\) 此方程无整数解
若 \(c\%d==0\),
特解:
\(x_1=x_0*c/d\) , \(y_1=y_0*c/d\)
通解:
\(x=x_1+b/d*t\) , \(y=y_1-a/d*t\) (其中 \(t\) 为整数)
最小解:
\(d=exgcd(a,b,x_0,y_0);\)
\(x_1=x_0*c/d;\)
\(int\ s=b/d;\)
\(x_{min}= (x_1\%s+s)\%s;\)
https://www.cnblogs.com/yaochen/p/10894280.html?share_token=23191250-107c-4b7f-a6c4-f4139ee37033