CINTA 作业二:GCD与EGCD
1、Bezout定理的证明
设s=gcd(a,b),显然s|a且s|b
又因为r、s∈Z∗
因此s|ar、s|bs
显然要让前面的式子成立,则必然有d为a和b的公约数的倍数
又因为r、s∈Z+
因此d必定为a和b最大公约数的倍数
因此该定理成立
2、实现GCD算法的迭代版本
int gcd(int a, int b)
{
while (b)
{
int temp = b;
b = a % b;
a = temp;
}
return a;
}
3、实现EGCD算法
用了数组储存返回的三个值
int* egcd(int a, int b)
{
int arr[3] = { 0,0,0 };
int r1 = 1;
int r2 = 0;
int s1 = 0;
int s2 = 1;
while (b)
{
int gcd = a % b;
int q = a / b;
int temp_a = a;
a = b;
b = temp_a % b;
int temp_r1 = r1;
r1 = r2;
r2 = temp_r1-r2 * q;
int temp_s1 = s1;
s1 = s2;
s2 = temp_s1 - s2 * q;
}
arr[0] = a;
arr[1] = r1;
arr[2] = s1;
return arr;
}
4、实现GCD的批处理版本
版本一:数组实现(需要传入长度)
int arr_gcd(int *arr,int arrSize)
{
if (arrSize == 0) return 0;//没有公因数
if (arrSize == 1) return *arr;//公因数是自己
if (arrSize == 2) return gcd(*arr, *(arr + 1));//两个就直接返回公因数
int temp_gcd = gcd(*arr, *(arr + 1));
for (int i = 2; i < arrSize; i++)
temp_gcd = gcd(temp_gcd, arr[i]);
return temp_gcd;
}
版本二:使用STL容器
int arr_gcd(vector<int> arr)
{
int len = arr.size();
if (len == 0) return 0;//没有公因数
if (len== 1) return arr.front();//公因数是自己
if (len == 2) return gcd(arr.front(),arr.back());//两个就直接返回公因数
int temp_gcd = gcd(arr.front(), *(arr.begin() + 1));
for (int i = 2; i < len; i++)
temp_gcd = gcd(temp_gcd, arr[i]);
return temp_gcd;
}