辗转相除法原理分析

1、辗转相除法求最大公约数

    int a, b, c;

    printf("请输入两个整数(逗号隔开):");

    scanf("%d,%d", &a, &b);

    c = a%b;

    while (c != 0)

    {

        a = b;

        b = c;

        c = a%b;

    }

 

 

互质是公约数只有1的两个整数,叫做互质整数(非负)。公约数只有1的两个自然数,叫做互质自然数(即指非负整数。)后者是前者的特殊情形。

 

【公约数和公倍数都是针对整数而言的!!】

辗转相除法证明叙述:

a和b两个正整数,如果a>b

a/b     .… …. 余数为R1

b/R1    .… …. 余数为R2

R1/R2   .… …. 余数为R3

R2/R3   ..… ….余数为R4

…. ….

R(n-2)/R(n-1)……余数为Rn

当Rn为零的时候,R(n-1)一定是最大公约数。

 

辗转相除法证明需要证明满足两个条件:

已知条件:a和b两个正整数,如果a>b,且a/b=0,则a和b的最大公约数一定为b。

第一个条件证明:

为什么Rn最后一定会等于0?

原因1:

任意两个数,可以是同奇同偶/以奇一偶,辗转相除法,主要是除数和余数的计算

同偶,在辗转相除过程中,余数必为偶数。最终余数会变为2,从而任意一个数都/可以被2整除

同奇,则辗转相除过程中,余数必为偶数。最终余数会变为1,从而任意一个数都可以被1整除

一奇一偶,辗转过程中,余数必为奇数,最终会变为1 ,从而任意一个数都可以被1整除

原因2:

因为余数都要小于除数,

随着辗转相除的进行,除数和余数越来越小,

为何辗转相除法到最后余数一定为0

而每一次的除数又分别等于上一次的余数,所以,总有那么一个时刻,余数会等于0。

第二个条件证明:

为什么a/b和b/R1和R2/R3和R(n-2)/R(n-1)的最大公约数相等?

 

设两数为a、b(a>b),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。

第一步:令c=gcd(a,b),则设a=mc,b=nc  //设c为最大公约数,则m和n一定互质

第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c   //r也有公约数c,如果r=(m-kn)c和b=nc两个表达式中,m-kn和n是互质,就可以证明c也是r和b的最大公约数

第三步:假设m-kn与n非互质,而有一个公约数d,则有m-kn=xd,n=yd (d>1),则有m=kn+xd=kyd+xd=(ky+x)d,从而有a=mc=(ky+x)cd,b=nc=ycd,此时就会出现a与b的一个公约数cd>c,之前我们的定义中c是a与b的最大公约数,此时与前面的假设矛盾,所以m-kn与n一定互质!因此c也是b与r的最大公约数。

 

从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。

证毕。

以上步骤的操作是建立在刚开始时r≠0的基础之上的。即m与n亦互质。

posted @ 2017-08-21 20:40  清风弥天  阅读(3715)  评论(1编辑  收藏  举报