最大公约数的算法

  • 格式:txt
  • 大小:1.08 KB
  • 文档页数:1
return gcd(a,b/2);
return gcd((a+b)/2,(a-b)/2);
}
欧几里德算法:
int gcd(int a,int b)
{
int temp = a;
a = Байду номын сангаас(temp+b) + abs(temp-b))/2;
b = ((temp+b) - abs(temp - b)) /2;
if(a%b = 0)
return b;
else
return (b,a%b);
}
原理:
定理: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
Stein算法:
利用递归 解释为偶数和一个质素之间的积。
int gcd(int a,int b) /* C++/c程序测试通过 用例:gcd(481 221) == 13 */
{
int temp = a;
a = ((temp+b) + abs(temp-b))/2;
b = ((temp+b) - abs(temp - b)) /2;
因此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)的公约数是一样的,其最大公约数也必然相等,得证
这里还有一种可以计算较小的两个数的公约数的方法,没有通过递归完成,效率较高,但理解比较困难。�
if(a == 0)
return b;
if(b == 0)
return a;
if(a%2 == 0&&b%2==0)
return 2*gcd(a/2,b/2);
if(a%2 == 0)
return gcd(a/2,b);
if(b%2 == 0)

下载文档原格式

  / 1