欧几里得算法 辗转相除法 《数据结构与算法分析——Java语言描述》Mark Allen Weiss 第二章
来源:互联网 发布:r语言分类数据计数 编辑:程序博客网 时间:2024/05/15 23:53
欧几里得算法
Euclidean Algorithm
注:《数据结构与算法分析——Java语言描述》Mark Allen Weiss 第二章 提到欧几里得算法及其复杂度。
1. 证明
a)首先证明 gcd(a,b) = gcd(b,a mod b)
充分性:
a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数
必要性: 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公约数 综上,(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
b)补充说明:当gcd(a,b) = gcd(b, a mod b) = ... = gcd(x, 0) = x (x!=0)
由于0和其他非零整数的最大公约数就是该非零整数,由gcd(a,b)推演gcd(x,0)的过程就是计算最大公约数的过程。
2. 递归实现
int gcd(int a, int b) {
if(b == 0) return a;
return gcd(b, a % b);
}
3. 非递归实现
int gcd(int a, int b) {
int r;
while(b != 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
4. 算法复杂度分析
对于任意两个数a,b满足a > b;
• 如果 b ≤ a/2 ,则 amod b ≤ b ≤ a/2
• 如果 b > a/2 ,则 a mod b ≤ a – b ≤ a – a/2 ≤a/2
可以看出每次这个操作都会将a减半,所以最后复杂度是O(log n)。
5. 改进算法 Stein算法
Stein算法由J. Stein 1961年提出,这个方法也是计算两个数的最大公约数。
和欧几里德算法不同的是,Stein算法只有整数的移位和加减法,这对于程序设计者是一个福音。
参考网址:
http://blog.csdn.net/pinganzi/article/details/8031289
http://www.cnblogs.com/Cmpl/archive/2011/05/28/2060582.html
- 欧几里得算法 辗转相除法 《数据结构与算法分析——Java语言描述》Mark Allen Weiss 第二章
- 数据结构与算法分析,Java语言描述,第2版 Mark Allen Weiss 笔记
- 《数据结构与算法分析C++描述》Mark.Allen.Weiss.pdf
- 数据结构与算法分析-c语言描述版 mark allen weiss
- 数据结构与算法分析:C++描述(Mark Allen Weiss) 和 数据结构(刘大有)笔记
- Data Structures and Algorithm Analysis in C, Second Edition(《数据结构与算法分析》C语言版 第二版)——Mark Allen Weiss
- 数据结构与算法分析java语言描述(Weiss)练习3.1( 表)
- 辗转相除法---欧几里得算法
- 求公约—辗转相除法—欧几里得算法
- 算法-欧几里得算法(辗转相除法)
- C语言辗转相除法求最大公约数(欧几里得算法)
- JAVA实现辗转相除法 欧几里得算法求逆
- 辗转相除法(欧几里得算法)java实现
- 辗转相除法(欧几里得算法)示意图
- 欧几里得算法之辗转相除法
- 欧几里得算法 --- 辗转相除法求最大公约数
- 欧几里得算法(辗转相除法)
- 辗转相除法和扩展欧几里得算法
- 再见青春
- 检查java程序假死的脚本
- MFC表格控件的简单使用
- 营销人员的10个禁忌
- Velocity浅析及与Jsp、Freemarker对比
- 欧几里得算法 辗转相除法 《数据结构与算法分析——Java语言描述》Mark Allen Weiss 第二章
- 动态链接库(dll) 使用
- struts2中s:select标签的使用
- 每日雕蟲一技[2013-01-07][国际化规范习惯]
- UITextField的隐藏
- Fibonacci数列(效率较高)
- Hibernate的搜罗的小细节(一)
- moosefs-1.6.10 安装手记
- 一步一步实现MFC扩展DLL中导出类和对话框