辗转相除法

算法:辗转相除法(欧几里德算法)

首先需要清楚的是:

任意整数和0的公约数是该整数的所有约数,它们的最大公约数为该整数本身
因为0被所有非0整数整除,所以任意非零的整数都是0的约数。


看过许多证明,还是百度百科的最为简单易懂且思路明确。

以下的原理及证明摘自百度百科:

原理:

两个数的最大公约数是指能同时整除它们的最大正整数。
设两数为a、b(a≥b),求a和b最大公约数
的步骤如下:
(1)用a除以b(a≥b),得
(2)若
,则
(3)若
,则再用b除以
,得
.
(4)若
,则
;若
,则继续用
除以
,......,如此下去,直到能整除为止。
其最后一个余数为0的除数即为
的最大公约数。
 
证明:
设两数为a、b(a>b),用
表示a,b的最大公约数,r=a (mod b) 为a除以b的余数,k为a除以b的商,即
。辗转相除法即是要证明
第一步:令
,则设
第二步:根据前提可知
第三步:根据第二步结果可知,
也是
的因数
第四步:可以断定
互质(这里用反证法进行证明:设
,则
,则
,则a与b的一个公约数
,故c非a与b的最大公约数,与前面结论矛盾,因此c也是b与r的最大公约数)从而可知
,继而
证毕

注:以上步骤的操作是建立在刚开始时r不等于0的基础上的,即m与n互质。


代码:

1 int gcd(int a, int b)
2 {
3     if(b == 0) return a;
4     return gcd(b, a % b);
5 }
posted @ 2018-04-14 11:33  过客感  阅读(266)  评论(0)    收藏  举报