欧几里得算法证明

#include
#include
using namespace std;
// 欧几里得算法证明
/*
设 gcd(a,b)=c a和b 的最大公约数 是c
k是一个整数集
求证:gcd(a,b)=gcd(b,a%b)
(1) 设 r=a%b a=mc b=nc (m和n 为互质的整数 )

    因为 r=a%b =a-k1*b  (k1,k2,k3,k4都是整数) 
  所以 r=a%b=m*c-k1*n*c=(m-k1*n)c
    由上式可知
	b=n*c
	r=(m-k1*n)*c
	若  n  和   (m-k1*n) 互质 则 gcd(b,r)=c
	
	
以下使用反证法 证明	   n  和   (m-k1*n) 互质: 
(2)设 n  和   (m-k1*n)不互质 则存在一个大于1的公约数d
则   n =k2*d   m-k1*n=k3*d
  整理上式 得: n=k2*d    m=k3*d+k1*k2*d
  
  根据(1)式  a=m*c b=n*c
    则  a=(k3*d+k1*k2*d)*c
         =(k3+k1*k2)*d*c
        b=k2*d*c
        则显然 a 和 b 存在一 个大于c 的约数 d*c 
        与前提 矛盾  假设(2)成立
		 所以 n  和   (m-k1*n)互质
		    所以 b 和 r 有共同的 最大公约数 c
			
			所以gcd(a,b)=c=gcd(b,r)=gcd(b,a%b) 
			设 a>b 
			a b a%b

/
int main ()
{
int m,n,temp;
cin>>m>>n;
if(m
n==0) // 如果保证 m n 非0的话 这一部分就不需要加上了
{
cout<<m+n;
return 0;
}
temp=m;
while(m%n) //开始跑欧几里得算法
{
m=n;
n=temp%n;
temp=m;
}
cout<<n;

return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值