模板:欧几里得 扩展欧几里得 乘法逆元
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;
}
相关文章推荐
- 扩展欧几里得、求乘法逆元及其应用、中国剩余定理(互质版和非互质版)、欧拉函数、快速判素数模板
- 求乘法逆元模板(扩展欧几里得)
- 扩展欧几里得模板
- 乘法逆元(扩展欧几里得)
- 扩展欧几里得 模板
- 乘法逆元 (扩展欧几里得或费马小定理)
- 扩展欧几里得(Extended Euclid)算法求最大公约数和乘法逆元
- hdu 2669 Romantic 扩展欧几里得求线性方程模板题
- 模板总结——扩展欧几里得
- 51nod 1256 乘法逆元 (扩展欧几里得求逆元)
- 扩展欧几里得模板题
- 扩展欧几里得模板
- 扩展欧几里得 与 乘法逆元
- 双六问题(扩展欧几里得模板)
- The Balance(扩展欧几里得模板题)
- 扩展欧几里得各类问题模板
- poj 1061 青蛙的约会 (扩展欧几里得模板)
- [NOIP 2011]计算系数 乘法逆元+扩展欧几里得
- gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)
- hdu 1576 A/B (求乘法逆元——扩展欧几里得)