扩展欧几里得算法

扩展欧几里得算法

前置条件:需要掌握裴蜀定理和欧几里得算法

裴蜀定理:
对于不全为0的整数a, b,一定有整数x, y,使得ax + by = gcd(a, b)


欧几里得算法:
gcd(a, b) == gcd(b, a % b)

假设有组特解x0, y0,使得ax0 + by0 = gcd(a, b)
则必有bx1 + (a % b)y1 = gcd(b, a % b) = gcd(a, b)
其中(a % b) = a - a / b * b
整理得:b(x1 - a / b * y1) + ay1 = ax0 + by0
即:y0 = x1 - a / b * y1, x0 = y1
所以x0 是由 y1转化而来, y0 是由 x1 - a / b * y1转化而来,因此递归时使用exgcd(b, a % b, y, x), y -= a / b * x

若要使ax + by = n(n为ax + by可以取到的数)
设d = gcd(a, b), 那么n % d == 0,n一定是d的倍数
他的特解是x0, y0,而通解则是:
x = n / d * x0 + k * b / d(k为任意整数)
y = n / d * y0 + k * a / d
(若要使通解有整数解,则必有n % d == 0)

#include <iostream>

using namespace std;

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;
}

int main() {
    int n;
    cin >> n;
    while (n --) {
        int a, b, x, y;
        cin >> a >> b;
        exgcd(a, b, x, y);
        cout << x << ' ' << y << endl;
    }
    
    return 0;
}
posted @ 2023-05-07 20:45  nobodyL  阅读(27)  评论(0)    收藏  举报