欧几里德算法(辗转相处算法:最大公约数算法)
2010-10-12 22:05
841 查看
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b)
欧几里得
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
a % d == 0 , b % d == 0,而r = a - kb,因此 r % d == 0
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
b % d == 0 , r % d == 0 ,但是a = kb +r 所以 a % d == 0
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
欧几里德算法就是根据这个原理来做的.
欧几里得
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
a % d == 0 , b % d == 0,而r = a - kb,因此 r % d == 0
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
b % d == 0 , r % d == 0 ,但是a = kb +r 所以 a % d == 0
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
欧几里德算法就是根据这个原理来做的.
} /*==================================================*\ | 快速 GCD \*==================================================*/ int kgcd(int a, int b) { if (a == 0) return b; if (b == 0) return a; if (!(a & 1) && !(b & 1)) return kgcd(a>>1, b>>1) << 1; else if (!(b & 1)) return kgcd(a, b>>1); else if (!(a & 1)) return kgcd(a>>1, b); else return kgcd(abs(a - b), min(a, b)); } /*==================================================*\ | 扩展 GCD | 求x, y使得gcd(a, b) = a * x + b * y; \*==================================================*/ int extgcd(int a, int b, int & x, int & y) { if (b == 0) { x=1; y=0; return a; } int d = extgcd(b, a % b, x, y); int t = x; x = y; y = t - a / b * y; return d; }
相关文章推荐
- C#实现用欧几里德算法、连续整数检测算法、公因数算法求两个非负整数的最大公约数
- 最大公约数算法——欧几里德算法
- 欧几里德算法(最大公约数算法)
- 辗转相处法-求最大公约数
- java基础算法之通过辗转相除求 最大公约数
- C语言 求两个数的最大公约数 (算法)--辗转相减法、辗转相除法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- C语言之linux内核实现最大公约数算法
- 算法提高 ADV-92 求最大公约数
- 世界上最早的算法:辗转相除法(求两个自然数最大公约数)
- 最大公约数和最小公倍数的算法
- (2013.03.08)求最大公约数_3种算法
- [算法设计与分析]3.4.2最大公约数的应用(循环移动数组元素)
- 面试算法题:最大公约数和最小公倍数
- 最大公约数算法
- 蓝桥杯 ADV-92 算法提高 求最大公约数
- 最大公约数算法
- 算法交作业之最大公约数
- java语言求最小公倍数和最大公约数的三种算法
- 求最小公倍数和最大公约数的算法