CINTA作业二: GCD与EGCD
1、给出Bezout定理的完整证明。
2、实现GCD算法的迭代版本。
3、实现EGCD算法。输入:a、b两个整数,输出:r、s、d三个整数,满足ar + bs =d。
4、实现一种批处理版本的GCD算法,即,给定一个整数数组,输出其中所有整数的最大公因子。输入:一个整数数组a;输出:一个整数d,是a数组中所有整数的最大公因子。
-
证明:
构造集合S={am+bn:m,n ∈ Z且am+bn>=0}
取最小值:d=ax+by
根据除法定理:a=qd+r,0<=r<d,q∈Z,所以r=a-qd=a-q(ax+by)=(1-qx)a+(-qy)b∈S,又因为d为S的最小值,所以r=0,则a|d,同理可得b|d.即d为a和b的公因子;
设d‘为a和b的公因子,则有d=ax+by=d’(a’x+b’y).所以d’|d.
所以d为a和b的最大公因子,即d=gcd(a,b)
int gcd(int a,int b)
{
int temp;
while(b!=0){
temp=a%b;
a=b;
b=temp;
}
return a;
}
int egcd(int a,int b)
{
int c[3];
int r1 = 1, r2 = 0;
int s1 = 0, s2 = 1;
int temp1,temp2,temp3;
while (a % b != 0)
{
int c = a % b;
int d = a / b;
temp1 = a;
a = b;
b = temp1 % a;
temp2 = s1;
s1 = s2;
s2 = temp2 - d*s1;
temp3 = r1;
r1 = r2;
r2 = temp3 - d*r1;
}
c[0]=r2;c[2]=s2;c[2]=b;
return c;
}
void temp_gcd(int a[],int n)//n为数组长度
{
int d = gcd(a[0], a[1]);
for (int i = 2; i < n-1; i++)
{
d = gcd(d, a[i]);
}
return d;
}