1.Bezout定理的证明:
设 a 和 b 为非零整数,存在整数 r 和 s 使得:
gcd(a, b) = ar + bs
而且,a 与 b 的最大公因子是惟一的。称 r 和 s 为 Bézout 系数
证明:
设集合S = {am + bn : m, n ∈ Z 且 am + bn ≥ 0},显然集合非空,那么可取其中最小值d=ar+bs,r,s
∈
\in
∈Z
1).
假设存在整数r’与m,使得a=dm+r’,0
≤
\leq
≤r’<d,
则r’ = a-dm = a-(ar+bs)m = a(1-rm)-bms,显然这样r’
∈
\in
∈S,又因为r’<d与最小值d矛盾,所以r’只能为0,因而a=dm。同理:b=dn,n
∈
\in
∈Z,所以d为a与b的公因子
2).
设d’为a与b的公因子,则存在p,q
∈
\in
∈Z,使得a=pd’,b=qd’
可得d = ar+bs = rpd’+sqd’ = (rp+sq)d’,显然rp+sq为整数,因此d’|d
综上可知d=ar+bs=gcd(a,b)
2.GCD算法的迭代版本
int my_gcd(int a, int b)
{
for (int temp; a%b!=0; )
{
temp = b;
b = a % b;
a = temp;
}
return b;
}
3.EGCD算法
int *my_egcd(int a, int b)
{
int r1 = 1, r2 = 0, s1 = 0, s2 = 1;
int a[3];//存放r,s,d
for ( int p=0,temp=0; a % b != 0; )
{
p = a / b;
temp = r2;
r2 = r1 - p * r2;
r1 = temp;
temp = s2;
s2 = s1 - p * s2;
s1 = temp;
temp = a;
a = b;
b = temp % b;
}
c[0]=r2;
c[1]=s2;
c[2]=b;
return c;
}
4.批处理GCD算法
int my_gcd(int a, int b)//求两数最大公因子的迭代算法
{
for (int temp; a % b != 0; )
{
temp = b;
b = a % b;
a = temp;
}
return b;
}
int gcd_array(int *a,int len)
{
int d = a[0];
for (int i = 0; i < len - 1; a++)
{
d = my_gcd(d, *a);//求两数最大公因子的迭代算法,每次与前一次得到的最大公因子求解,保证得到的最大公因子结果满足数组中的所有整数
}
return d;
}