1、给出Bezout定理的完整证明
求证:a、b是非零整数,存在整数r、s使得gcd(a,b)=ar+bs
设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 x, int y)
{
if (x < y) {swap(x, y);}
int tep = 0;
while (y != 0)
{
tep = x % y;
x = y;
y = tep;
}
return x;
}
3、实现EGCD算法。输入:a、b两个整数,输出:r、s、d三个整数,满足ar + bs =d
int *egcd(int a,int b)
{
int r0=1;
int r1=0;
int s0=0;
int s1=1;
while(b!=0)
{
int q=a/b;
int r_tmp=r0;
int s_tmp=s0;
a=b;
b=a%b;
r0=r1;
r1=r_tmp-q*r1;
s0=s1;
s1=s_tmp-q*s1;
}
int *arr = new int[3];
arr[0] = a;
arr[1] = r0;
arr[2] = s0;
return arr;
}
4、实现一种批处理版本的GCD算法,即,给定一个整数数组,输出其中所有整数的最大公因子。输入:一个整数数组a;输出:一个整数d,是a数组中所有整数的最大公因子
int gcd(int x, int y)
{
if (x < y) {swap(x, y);}
int tep = 0;
while (y != 0)
{
tep = x % y;
x = y;
y = tep;
}
return x;
}
int bgcd(int num[], int n)
{
int tep = num[0];
for (int i = 0; i < n - 1; ++i)
{
tep = gcd(tem, num[i + 1]);
}
return tep;