扩展欧几里得
扩展欧几里得
求解
时间复杂度
即
解
有
,递归即可
求
由归纳假设存在u',v',使得
即
于是就得到了a,b的解
int exgcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
/*
//1
int xx, yy;
int d = exgcd(b, a % b, xx, yy);
x = yy;
y = xx - (a / b) * yy;
return d;
*/
/*
//2
int d= exgcd(b, a % b, x, y);
int k = y;
y = x - (a / b) * y;
x = k;
return d;*/
//3
int d = exgcd(b, a % b, y, x);
y -= (a / b) * x;
return d;
}实际应用:
通解为
求一元二次线性方程ax+by=c的整数解
先求出的解,然后把解乘以就得到了原方程的解,如果不是整数,说明原方程没有整数解(贝祖定理)
在求出特解后,通解为
若要求x的最小非负整数解
,若要求此时的y,则可以通过来求
int ex_gcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = ex_gcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - a / b * y;
return d;
}
bool liEu(int a, int b, int c, int& x, int& y) {
int d = ex_gcd(a, b, x, y);
if (c % d != 0) return 0;
int k = c / d;
x *= k;
y *= k;
return 1;
}Last updated