最大公约数与欧几里德算法
2012-01-17 16:24
232 查看
记a、b的最大公约数为gcd(a,b)。
这里对于最大公约数的讨论仅限于非负整数,因为显然有gcd(a,b)=gcd(|a|,|b|)。
计算最大公约数的Euclid算法基于下面定理:
【GCD递归定理】对于任意非负整数a和任意正整数b,gcd(a,b)=gcd(b,a%b)。
Euclid算法最简单的递归版本(C语言版)如下:
【引理】如果a>b≥1且Euclid(a,b)执行了k≥1次递归调用,则a≥Fk+2,b≥Fk+1。(其中Fk为Fabonacci的第k项)
【Lamé定理】对于任意k≥1,若a>b≥1且b<Fk+1则Euclid(a,b)的递归调用次数少于k次。
O(log b)是该算法一个粗略的界,事实上当b确定后,Euclid(a,b)的平均迭代次数近似为(12ln2/π2)×lnb。
除了上述的Euclid算法外还有一种不用求余数运算的的二进制最大公约数算法。
这里对于最大公约数的讨论仅限于非负整数,因为显然有gcd(a,b)=gcd(|a|,|b|)。
计算最大公约数的Euclid算法基于下面定理:
【GCD递归定理】对于任意非负整数a和任意正整数b,gcd(a,b)=gcd(b,a%b)。
Euclid算法最简单的递归版本(C语言版)如下:
int Euclid(int a,int b) { if(b)return Euclid(b,b%a);else return a; }迭代版本(C语言版)如下:
int Euclid(int a,int b) { while(a=a%b)a^=b^=a^=b; return b; }Euclid算法运行时间分析
【引理】如果a>b≥1且Euclid(a,b)执行了k≥1次递归调用,则a≥Fk+2,b≥Fk+1。(其中Fk为Fabonacci的第k项)
【Lamé定理】对于任意k≥1,若a>b≥1且b<Fk+1则Euclid(a,b)的递归调用次数少于k次。
O(log b)是该算法一个粗略的界,事实上当b确定后,Euclid(a,b)的平均迭代次数近似为(12ln2/π2)×lnb。
除了上述的Euclid算法外还有一种不用求余数运算的的二进制最大公约数算法。
相关文章推荐
- 欧几里德算法(最大公约数算法)
- 最大公约数与欧几里德算法
- 求最大公约数-辗转相除法-欧几里德算法
- C语言辗转相除法(欧几里德算法)求最大公约数
- 欧几里德算法求最大公约数 - Ruby
- 欧几里德算法求最大公约数
- 欧几里德算法 -- 求最大公约数
- 欧几里德算法求最大公约数
- 欧几里德算法(辗转相除法):求两个整数最大公约数
- 求最大公约数--欧几里德算法 及 最小公倍数
- 求最大公约数:欧几里德算法(即 辗转相除法 )
- 欧几里德算法-求最大公约数
- 欧几里德算法求解最大公约数
- 欧几里德算法(最大公约数)
- 欧几里德算法(最大公约数)
- 欧几里德算法(辗转相除法)计算两个整数的最大公约数
- 欧几里德算法(辗转相除法) 求最大公约数
- 编程求取两个整数的最大公约数.欧几里德算法
- 两个数的最大公约数------欧几里德算法(辗转相除法)
- 欧几里德算法求最大公约数