证明:
假设gcd(a,b)为一个集合,有良序定理可知,存在最小的元素n,对于集合中任意其他元素n1,使得n1=n×x+y,此时y<n,与良序定理相矛盾,故y=0,集合中任意元素都可以整除n,所以n是a,b的公因子。假设a与b的任意一个公因数为c,则有a=ck1,b=ck2,n=ck1r1+ck2r2,证明n可以整除a和b的任意一个公因数,因此n为最大公因子。
GCD算法迭代版本:
#include<iostream>
using namespace std;
int gcd(int a, int b)
{
while (b != 0)
{
a = b;
b = a % b;
}
return a;
}
int main() {
int a, b;
int c;
cout << "请输入两个数(大数在前,小数在后):" << endl;
cin >> a >> b;
c = gcd(a, b);
cout << "gcd(a,b)=" << c << endl;
system("pause");
return 0;
}
实现EGCD算法。输入:a、b两个整数,输出:r、s、d三个整数,满足ar+bs=d。
#include<iostream>
using namespace std;
int egcd(int a, int b, int s0, int s1, int r0, int r1, int q)
{
if (b == 0)
{
cout << a << ' ' << r0 << ' ' << s0;
}
else
{
egcd(b, a % b, r1, r0 - q * r1, s1, s0 - q * s1, a / b);
}
}
int main()
{
int a, b, r0, r1, s0, s1, q;
r0 = 1;
r1 = 0;
s0 = 0;
s1 = 1;
q = 0;
cin >> a >> b;
egcd(a, b, r0, r1, s0, s1, q);
return 0;
}
批处理版本的GCD
int arr_gcd(int* arr,int arr_len)
{
if (arr_len == 0) return 0;
else if (arr_len == 1) return *arr;
else if (arr_len == 2) return gcd(arr[0],arr[1]);
else
{
int arr_temp = gcd(arr[0], arr[1]);
for (int i = 2; i < arr_len; i++)
arr_temp = gcd(arr_temp, arr[i]);
return arr_temp;
}
}