欧几里得算法证明

#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< return 0;
}
temp=m;
while(m%n) //开始跑欧几里得算法
{
m=n;
n=temp%n;
temp=m;
}
cout<

return 0;
}

你可能感兴趣的:(欧几里得算法证明)