【扩展欧几里得算法简介】
● 扩展欧几里得算法(Extended Euclidean Algorithm)是欧几里得算法的扩展版本,不仅能计算两个整数的最大公约数(GCD),还能找到满足贝祖等式(Bézout's Identity)ax+by=gcd(a,b) 的整数解 x 和 y。它在数论、密码学等领域有重要应用,例如求解模的逆元、求解线性同余方程等。
● 扩展欧几里得算法求 ax+by=gcd(a,b) 特解的方法如下。
(1)当 b=0 时,由 ax+by=gcd(a,b) 可得 x=1,y=0。
(2)当 b≠0 时,由裴蜀定理知 ax+by=gcd(a,b),bx'+(a%b)y'=gcd(b,a%b) 。因为 gcd(a,b)=gcd(b,a%b),所以 ax+by=bx'+(a%b)y',即 ax+by=bx'+(a-(a/b)*b)y'=ay'+b(x'-(a/b)*y')。根据恒等定理,知对应项相等,即 x=y',y=x'-(a/b)*y'。可见 (x,y) 的值基于 (x',y'),所以可以通过递归求解。
● 扩展欧几里得算法求 ax+by=gcd(a,b) 特解的代码
代码一:递归调用时交换 x 与 y 的位置
#include
using namespace std;
int exgcd(int a,int b,int &x,int &y) {
if(b==0) {
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main() {
int a,b,x,y;
cin>>a>>b;
int gcd=exgcd(a,b,x,y);
cout<<"x="<
代码二:递归调用时保持 x 与 y 的位置不变
#include
using namespace std;
int exgcd(int a,int b,int &x,int &y) {
if(b==0) {
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int t=y;
y=x-(a/b)*y;
x=t;
return d;
}
int main() {
int a,b,x,y;
cin>>a>>b;
int gcd=exgcd(a,b,x,y);
cout<<"x="<
● 扩展欧几里得算法求 ax+by=gcd(a,b) 的最小非负解
扩展欧几里得算法求解的是方程 ax+ by=gcd(a,b) 的一组特解 (x0,y0),该解通常不是最小非负解,而是一个满足等式的任意整数解。通过模运算可将特解调整为最小非负解 xmin=(x0 mod T+T) mod T,其中 T=b/gcd(a,b) 为解的周期。相应地,若 ax+by=c 有整数解,则其最小非负解 xmin=(x0*c/gcd(a,b) mod T+T) mod T。
● 扩展欧几里得算法求 ax+by=c 特解 (x',y')
方程 ax+by=c 有整数解的充要条件为 gcd(a,b) |c。
若 gcd(a,b) |c,即 ax+by=c 有解,先用扩展欧几里得算法求出 ax+by=gcd(a,b) 的特解 (x0,y0),再乘以 c/gcd(a,b) 得到 ax+by=c 的特解:x'=x0*c/gcd(a,b),y'=y0*c/gcd(a,b)。
● 扩展欧几里得算法求 ax+by=c 通解
定理:设二元一次不定方程 ax+by=c 有特解 (x',y'),则其通解为: x=x' + kb/gcd(a,b),y=y' - ka/gcd(c,b),其中,k∈Z,a, b 是都不为0的整数。
证明:求证过程如下所示。
• 方程ax+by=c有整数解当且仅当gcd(a,b) |c
• 设 x',y' 是 ax+by=c 的一个特解,即:ax'+by'=c。两式相减,得: a(x-x')+b(y-y')=0
因为 a,b 都是非 0 整数,所以上式等价于: (x-x')a/gcd(a,b)+(y-y')b/gcd(a,b)=0
移项得,(y-y')b/gcd(a,b) = -(x-x')a/gcd(a,b)
又因为,gcd(b/gcd(a,b), a/gcd(a,b))=1,所以,可得 b/gcd(a,b) |(x-x')
故可得,x=x'+kb/gcd(a,b),k∈Z
将 x 代入 a(x-x')+b(y-y')=0,可得 y=y'-ka/gcd(a,b),k∈Z
● 扩展欧几里得算法与线性同余方程 ax≡c(mod b)
求解线性同余方程 ax≡c(mod b) ⇔求解不定方程 ax+by=c。原因在于,由 ax≡c(mod b) 等价于 ax-c=by,可得 ax-by=c。又由于 y 可以是负数,所以方程ax-by=c 可以改写为 ax+by=c。即 ax≡c(mod b) ⇔ ax+by=c。
(1)方程转化:将线性同余方程 ax≡c(mod b) 转化为不定方程 ax+by=c。
(2)判定解的存在性:若 gcd(a,b)|c,则不定方程 ax+by=c 有解。
(3)求特解:若 ax+by=c 有解,先用扩展欧几里得算法求出 ax+by=gcd(a,b) 的特解 (x0,y0),再乘以 c/gcd(a,b) 得到 ax+by=c 的特解:x'=x0*c/gcd(a,b),y'=y0*c/gcd(a,b)。
(4)求通解:同余方程 ax≡c(mod b) 通解形式为 x=x'+kb/gcd(a,b),k∈Z。当 k=0, 1, …, gcd(a,b)−1 时,有 gcd(a,b) 个模 b 不同余的解。
【参考文献】
https://www.acwing.com/solution/content/278305/
https://blog.csdn.net/hnjzsyjyj/article/details/129271860
https://www.acwing.com/solution/content/3930/