2010年7月28日星期三

[转]欧几里德辗转相除法求最大公约数

辗转相除,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。它并不需要把二数作质因子分解。

欧几里德算法又称辗转相除法,用于计算两个整数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
  因此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)的公约数是一样的,其最大公约数也必然相等,得证。

递推求最大公约数

   1:   //递推求最大公约数
   2:   program yuefen;
   3:   var a,b,c:integer;
   4:   
   5:   begin
   6:     read(a,b);
   7:     repeat
   8:       c:=a mod b;
   9:      a:=b;
  10:      b:=c;
  11:    until c=0;
  12:    writeln(a);
  13:  end.

没有评论:

发表评论