#给出Bezout定理的完整证明
证明:
构造集合:
S={am-bn:m,n∈Z且am+bn>=0}
显然,S集合非空,根据良序原理,取其中最小值d=ar+bs,r、s∈Z
① 证d是a和b的公因子
令a=dq+r0,0<=r0<d,即r0=a-dq.将d=ar+bs代入,得:
r0=a-(ar+bs)q=a-arq-bsq=a(1-rq)+b(-sq)
易看出r0也在集合S中,如果r0>0,那么这和d是S中的最小值相矛盾,所以r0为0,即a=dq+0,得d整除a,同理可得d也整除b,所以d是a和b的公因数
② 证d是a和b的最大公因数
假设存在d0能够分别整除a和b,得a=qd0,b=kd0
则ar+bs=qd0r+kd0s=d0(qr+ks)=d
则d0整除d
∴得证
#实现GCD算法的迭代版本
#include<iostream>
#include<cmath>
using namespace std;
int gcd(int a, int b)
{
//大小排序
if (a < b)
{
int c;
c = a;
a = b;
b = c;
}
while(true)
{
//定义商d,余数c
int d;
int c = 0;
//求a mod b,得d
c = a / b;
d = a - b * c;
//有公因数,跳出
if (d == 0)
{
break;
}
//回到初始状态,准备下一个循环
a = b;
b = d;
}
return b;
}
int main()
{
int a = 24, b = 20;
cout << gcd(a, b);
}
#实现EGCD算法。输入:a、b两个整数,输出:r、s、d三个整数,满足ar+bs=d
#include<iostream>
using namespace std;
int egcd(int a, int b)//a>b
{
int r1,r2, s1, s2;
r1 = 1;r2 = 0;
s1 = 0;s2 = 1;
while(true)
{
//判断终止条件
int c, d;
c = a / b;
d = a - b * c;
if (d == 0)return b;
int t1, t2;
t1 = r1 - c * s1;
t2 = r2 - c * s2;
a = b;r1 = s1;r2 = s2;
b = d;s1 = t1;s2 = t2;
}
}
int main()
{
cout << egcd(36, 24);
}
#实现批处理版本的GCD算法
#include<iostream>
using namespace std;
int array_gcd(int* array, int n)
{
for (int i = 0;i < n-1;i++)
{
int a = array[i];int b = array[i + 1];
if (a < b)
{
int c;
c = a;
a = b;
b = c;
}
while (true)
{
int d;
int c = 0;
c = a / b;
d = a - b * c;
if (d == 0)
{
break;
}
a = b;
b = d;
}
array[i + 1] = b;
}
return array[n - 1];
}
int main()
{
int array[100];
int n = 0;
while (cin >> array[n])
{
n++;
}
cout<<"数组最大公因数:"<<array_gcd(array, n);
}
此算法由数组中的数两两用gcd算法得出