扩展欧几里得算法
裴蜀定理(Bézout's Lemma):对整数 ,关于未知数 和 的线性不定方程(称作裴蜀等式) 有整数解当且仅当 为 最大公约数 的倍数。裴蜀等式有解时必然有无穷多个整数解。
推论:对于任意正整数 ,必存在非零整数 ,使得 。
扩展欧几里得算法简介
扩展欧几里得算法是辗转相除法的扩展。已知整数 ,扩展欧几里得算法可以在求得 的最大公约数的同时,找到整数 (其中一个可能是负数),使它们满足裴蜀等式 。如果 是负数,可以把问题转化成 ,然后令
例题:扩展欧几里得算法
求解方程 :
当 时, ,故 是一组解
当 时,因为 ,则 ,可知:
故 ,可以采用递归算法,先求出下一层的 和 ,再利用上述公式进行回代。
代码模板:
| // 求x, y,使得ax + by = gcd(a, b)
int ex_gcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1, y = 0;
return a;
}
int d = ex_gcd(b, a % b, y, x);
y -= (a / b) * x;
return d;
}
|
结论:设方程 (其中 为非零整数)有一组整数解 ,则方程的所有整数解(通解)可以表示为:
线性同余方程
线性同余方程:形如 的方程称为线性同余方程,其中 为给定整数, 为未知数。
例题:线性同余方程
上述原方程等价为 ,使得 ,也就是
令 ,则原问题变为 ;只要 ,则方程有解。
设 ,在有解时,先用欧几里得算法求出一组整数 ,满足 ,该等式只需扩大 倍,即可变为 。因此 就是原线性同余方程的一个解