1、Bezout定理的完整证明
求证:a、b是非零整数,存在整数r、s使得gcd(a,b)=ar+bs
证明:
令
S
=
{
a
m
+
b
n
:
m
,
n
∈
Z
,
且
a
m
+
b
n
≥
0
}
令S=\{am + bn : m, n \in Z,且am + bn ≥ 0\}
令S={am+bn:m,n∈Z,且am+bn≥0}
因为am+bn是a,b的线性组合,所以存在m,n∈Z,使得am+bn≥0.
即集合S非空,根据良序原则,取其中最小值 d = ar + bs.
令
q
=
⌊
a
/
d
⌋
,
令
t
=
a
m
o
d
d
=
a
−
q
(
a
m
+
b
n
)
=
a
(
1
−
q
m
)
+
b
(
−
q
n
)
令q=\lfloor a/d\rfloor ,令t=a\ mod\ d=a-q(am+bn)=a(1-qm)+b(-qn)
令q=⌊a/d⌋,令t=a mod d=a−q(am+bn)=a(1−qm)+b(−qn)
可见t是a,b的线性组合
由于t=a mod d,所以0≤t<d
由于d为a,b的线性组合满足S的最小值,所以t=0,即d|a,同理可得d|b.
设a,b的最大公因数为d’,则d’≥d
又因为d’|a,d’|b,且d是a与b的线性组合,由整除性可知d’|d,即d’≤d
故d’=d,即gcd(a,b)=d=ar+bs
2、实现GCD算法的迭代版本
#include<iostream>
#include"math.h"
using namespace std;
int gcd(int x, int y)
{
if (x < y)swap(x, y);
int tem = 0;
while (y != 0)
{
tem = x % y;
x = y;
y = tem;
}
return x;
}
int main()
{
int a = 105;
int b = 12;
cout << gcd(a, b);
return 0;
}
3、实现EGCD算法。输入:a、b两个整数,输出:r、s、d三个整数,满足ar + bs =d。
#include<iostream>
#include"math.h"
using namespace std;
void egcd(int x, int y,int m[3])
{
if (x < y)swap(x, y);
int row1[3] = { 1,0,x };
int row2[3] = { 0,1,y };
while (row2[2] != 0)
{
int quot = row1[2] / row2[2];
int tem[3];
for (int i = 0; i < 3; i++)
{
tem[i]=row1[i] - quot * row2[i];
row1[i] = row2[i];
row2[i] = tem[i];
}
}
for (int i = 0; i < 3; i++)
{
m[i] = row1[i];
}
}
int main()
{
int a = 13;
int b = 9;
int getr_s_d[3];
egcd(a, b,getr_s_d);
cout << "r=" << getr_s_d[0] << " s=" << getr_s_d[1] << " d=" << getr_s_d[2] << endl;
return 0;
}
4、实现一种批处理版本的GCD算法,即,给定一个整数数组,输出其中所有整数的最大公因子。输入:一个整数数组a;输出:一个整数d,是a数组中所有整数的最大公因子。
#include<iostream>
#include"math.h"
using namespace std;
int gcd(int x, int y)
{
if (x < y)swap(x, y);
int tem = 0;
while (y != 0)
{
tem = x % y;
x = y;
y = tem;
}
return x;
}
int bgcd(int num[], int n)
{
int tem = num[0];
for (int i = 0; i < n - 1; i++)
{
tem = gcd(tem, num[i + 1]);
}
return tem;
}
int main()
{
int n = 6;
int num[6] = { 3,9,21,18,54,27 };
int gnum = bgcd(num,n);
cout << gnum;
return 0;
}