您的位置:首页 > 其它

模板:欧几里得 扩展欧几里得 乘法逆元

2018-03-26 15:29 363 查看

一、欧几里得算法

        求a,b的最小公约数。int GCD(int a, int b) {
int r;
while (b) {
r = a % b;
a = b;
b = r;
}
return a;
}

二、扩展欧几里得

        求解方程ax + by = gcd(a, b),并返回gcd(a,b)。
        简单证明:



//求解ax + by = gcd(a,b)的整数解 返回gcd(a,b)
int exGCD(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int xx, yy;
int gcd = exGCD(b, a%b, xx, yy);
x = yy;
y = xx - a / b * yy;
return gcd;
}

三、扩展欧几里得的一般情况

        求解ax + by = c的最小非负整数解x,其中c被gcd(a, b)整除,否则方程无解(裴蜀定理?)//求解ax + by = c的最小非负整数解x 其中c被gcd(a,b)整除
//令d = gcd(a,b), k = c/d, x1和y1为ax + by = d的解
//则有解集(t为任意整数)
//x = k * x1 + t * (b / d)
//y = k * y1 + t * (a / d)
int exGCD(int a, int b, int c, int &x, int &y) {
int d = exGCD(a, b, x, y);//调用一般的exGCD
int k = c / d;
int s = b / d;
x = ((k * x) % s + s) % s;
y = (c - a * x) / b;
return d;
}

四、使用扩展欧几里得求乘法逆元

        简单证明:



//求a对于m的乘法逆元 要求a和m互质
int modInv(int a, int m) {
int x, y;
exGCD(a, m, x, y);
return (x % m + m) % m;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: