首页 > 编程知识 正文

欧几里得算法使用了哪种算法策略,证明欧几里得算法的正确性

时间:2023-05-05 09:24:59 阅读:228035 作者:1265

一、干什么用?

算出最大两个非负整数的最大公约数。虽然小学知识,大家概念很清楚,但我们这里还是提下,能被两个数A,B整除的最大整数C,就称C是A和B的最大公约数。可以用GCD(A,B)表示。GCD是Greatest Common Divisor的缩写。

二、dldhmg算法的内容

dldhmg是快速找出两个数最大公约的一种算法。算法核心思想:
例如找A,B的最大公约数GCD(A,B),并且A>B

如果A=0,那么GCD(A,B)=GCD(0,B)=B;
如果B=0,那么DCD(A,B)=GCD(A,0)=A;
用余数表示A,A=B*Q+R,Q表示B的几倍,R是余数。
GCD(A,B)=GCD(B,R)
举例说明:

A=12,B=8;

由12 = 8*1+4;根据dldhmg算法得到GCD(12,8)=GCD(8,4);

然后A=8,B=4;

由8 = 4*2+0;根据dldhmg算法得到GCD(8,4)=GCD(4,0);

因为A!=0,B=0,所以GCD(4,0)=4;

以上我们可以得出:GCD(12,8)=GCD(8,4)=GCD(4,0)=4;

从上面的例子中我们可以看到dldhmg算法,他把一个复杂的问题逐渐简化成了简单问题。这种算法思想就是通常我们说的:分治思想(Divide and Conquer)。

三、dldhmg算法推导

1.证明GCD(A,0)=A

我们知道A的最大公约数是A;
A*0=0;即0除以任何整数都是0;因此我们可以说任何数都可以是0的约数。
因为A大于0,所以GCD(A,0)=A;
同理我们可以证明出:GCD(B,0)=B。

2.证明GCD(A,B)=GCD(B,R)

要想证明GCD(A,B)=GCD(B,R) ,首相我们需要证明GCD(A,B)=GCD(B,A-B);

先上图:

三个数,A,B,C,满足A-B=C;

图的左侧说明:

GCD(A,B)是A和B的最大公约数,同时就说明其能整除A和B;可以将其表示为:

XGCD(A,B)=A;YGCD(A,B)=B;

得到:A-B=XGCD(A,B)-YGCD(A,B)=(X-Y)*GCD(A,B)=C

==>GCD(A,B)也是C的一个约数;

图的中间说明:

GCD(B,C)是B和C的最大公约数,同时就说明其能整除B和C;可以将其表示为:

MGCD(B,C)=B;NGCD(B,C)=C;

得到:B+C=MGCD(B,C)+ NGCD(B,C)=(M+N)*GCD(B,C)=A

==>GCD(B,C)也是A的一个约数;

图的右侧说明:

GCD(A,B)是B的约数,同时也是C的约数,算是B和C的一个公共约数,但是肯定小于或等于B和C的最大公约数,
所以GCD(A,B)<=GCD(B,C);
GCD(B,C)是A的约数,同时也是B的约数,算是A和B的一个公共约数,但是肯定小于或等于A和B的最大公约数
所以GCD(B,C)<=GCD(A,B);
最终得出GCD(A,B)=GCD(B,C)=GCD(B,A-B)

我们证明了GCD(A,B)=GCD(B,A-B),接下来我们证明GCD(A,B)=GCD(B,R)。

GCD(A,B)=GCD(B,A-B)可以写成GCD(A,B)=GCD(A-B,B)

由GCD(A,B)=GCD(A-B,B)可以得出GCD(A-B,B)=GCD(A-2B,B)

以此类推:GCD(A,B)=GCD(A-B,B)=GCD(A-2B,B)==GCD(A-3B,B)=GCD(A-Q*B,B)

因为A可以表示成:A=QB+R;将其代入到GCD(A-QB,B)中得到:

GCD((QB+R)-QB,B)=GCD(R,B)=GCD(B,R);

进一步得到:GCD(A,B)=GCD(B,R)

代码:

int Gcd(int A, int B){ while (B) { int Rem = A % B; A = B; B = Rem; } return A;}

代码解释:

两个数的最大公约数是指能同时整除它们的最大正整数。 设两数为a、b(a≥b),求a和b最大公约数 的步骤如下:
(1)用a除以b(a≥b),得 a / b = q…r1 。 (2)若 r1 = 0 ,则 (a, b) = b; (3)若 r1 不等于
0 ,则再用b除以 r1 ,得b / r1 = q…r2(此处q不是上方的q). (4)若 r2=0 ,则(a,b)=r1 ;若
r2不等于0 ,则继续用r1除以 r2 ,……,如此下去,直到能整除为止。 其最后一个余数为0的除数即为 (a,b) 的最大公约数。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。