1、给出Bezout定理的完整证明。
设 x = gcd(a,b)
则x|a且x|b
因为
r
、
s
∈
Z
r、s∈\Z
r、s∈Z
则x|ar、x|bs
则x为a和b的公约数的倍数
2、实现GCD算法的迭代版本。
int gcd(int a, int b)
{
while (b)
{
int temp = b;
b = a % b;
a = temp;
}
return a;
}
3、实现EGCD算法。输入:a、b两个整数,输出:r、s、d三个整数,满足ar + bs =d。
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 mod1 = a % b;
int div1 = a / b;
a = b;
b = mod1;
int temp_r1 = r1;
int temp_s1 = s1;
r1 = r2;
s1 = s2;
r2 = temp_r1 - r1 * div1;
s2 = temp_s1 - s1 * div1;
}
arr[0] = r1;
arr[1] = s1;
arr[2] = a;
return arr;
}
4、实现一种批处理版本的GCD算法,即,给定一个整数数组,输出其中所有整数的最大公因子。输入:一个整数数组a;输出:一个整数d,是a数组中所有整数的最大公因子。
int arrgcd(int* arr, int size)
{
int result = arr[0];
for (int i = 1; i < size; i++)
{
result = gcd(result, arr[i]);
}
return result;
}