欧几里得算法(原始形式减法)证明
先看算法过程:
1、r=m-n (其中m>n)
2、循环直到 r=0
2.1 m=n
2.2 n=r
2.3 r=m-n
3、输出 n
我们按这个过程走一遍:
m n
n m-n
m-n 2n-m
2n-m 2m-3n
2m-3n 5n-3m
…
am+bn km+tn
km+tn (a-k)m+(b-t)n
按照算法,当(a-k)m+(b-t)n=0时,这时最大公约数为km+tn;
(a-k)m+(b-t)n=0得:m/n=-(b-t)/(a-k);那么km+tn=[(at-kb)/(a-k)]*n;
他应满足[(at-kb)/(a-k)]*n=[1/|a-k|]*n;得|at-kb|=1;我们观察上面的
的过程,验算发现这个等式恒成立;故得证。
共同学习!
求最大公约数两种方式:
#include <iostream>
using namespace std;
int gcd(int,int);
int gcd_2(int ,int);
int main()
{
cout<<gcd(21,9)<<endl;
cout<<gcd_2(21,9);
return 0;
}
//欧几里得算法求最大公约数
//gcd(m,n)=gcd(n,m%n)=....=gcd(最大公约数,0),也可以写成递归的形式
int gcd(int m,int n)
{
int temp;
while(n!=0)
{
temp = m;
m=n;
n=temp%n;
}
return m;
}
//递减算法
int gcd_2(int m,int n)
{
int t =n;
if(m<n)
t=m;
int i;
for(i=t;i>=1;i--)
{
if(m%i==0&&n%i==0)
break;
}
return i;
}