欧几里得算法的原理

欧几里得算法求解两个正整数的最大公约数。

设两个正整数a,b使得a≥b,则(a,b)的最大公约数gcd(a,b)为:

①a÷b = q1......r1 当r1=0时则gcd(a,b)为b;

若r1≠0则继续

②b÷r1=q2.....r2 当r2=0时 则gcd(a,b)为r1

若r2≠0则继续

③r1÷r2=q3......r3 当r3=0时 则gcd(a,b)为r2

若r3≠0则继续

................

................

直到第n次没有余数 则gcd(a,b)为这个除数

例如求解600,315的最大公约数

①600÷315 = 1......285

②315÷285 = 1.....30

③285÷30 = 9......15

④30÷15  = 2.....0

即600与315的最大公约数是15

 

算法正确性的证明:

设两个正整数a,b使得a≥b

设gcd(a,b)为p;

不妨令a = mp,b = np,即p为gcd(a,b)的最大公约数

设mp ÷ np = q2 ...... r;

设 u ÷ mp = q1 ...... np;

则 u = mp*q1 + np = (m*q1 + n)*p;

显然 p也是u的一个约数;

那p是否是 u与mp的最大公约数呢?

假设 u与mp的最大公约数不是p为d,即d>p;

不妨令 u = dx ,mp = dy,即假设u与mp的最大公约数为d;

则有dx ÷ dy = q1 ...... np;

则有np = dx - dy*q1 = (x - y*q1)*d ,显然有d也是np的一个约数;

则有 np/d <n,mp/d <m,显然n,m也不是最小的;

则有 这与 m,n是最小的两个互质数产生矛盾;

因而 假设不成立;

所以 p也是u与mp的最大公约数;

从而推导出 gcd(a,b) = gcd(b,mod(a,b))  ;这里mod(a,b)为a÷b的余数;

从而可以辗转继续循环此步骤 直到某次余数为0则最大公约数是这时的除数。

 

C++编写计算机程序实现

#include <iostream>    //基本输入输出流
using namespace std;   //使用std域
int gcd(int,int);      //求解最大公约数函数声明
int main(int argc,char** argv)
{

   cout<<gcd(600,315)<<endl;
   return 0;
}
int gcd(int a,int b)  //函数定义
{
	if(!(a%b))        //递归终止条件两个数能够整除
		return b;
	else
		return gcd(b,a%b);   //递归
}

 程序输出结果15。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值