1 迭代版本的gcd算法
int gcd(int a, int b){
while(b){
int temp = a;
a = b;
b = temp % b;
}
return a;
}
2 二进制的gcd算法
int bgcd(int x,int y){
int i,j;
for(i=0;(x&1)==0;++i)
x>>=1;
for(j=0;(y&1)==0;++j)
y>>=1;
if(j<i)
i=j;
while(true){
if(x<y){
x^=y;
y^=x;
x^=y;
}
x-=y;
if(0==x){
return y<<i;
}
}
}
3 递归版本的egcd算法
def egcd(a,b,r0=1,r1=0,s0=0,s1=1):
if(b==0):
return a,r0,s0;
else:
q, a, b = a//b, b, a%b
r0, r1 = r1, (r0-q*r1)
s0, s1 = s1, (s0-q*s1)
return egcd(a,b,r0,r1,s0,s1)
2.2 Bézout定理的证明
-
由定理,令 k = g c d ( a , b ) k=gcd(a,b) k=gcd(a,b),易知道有 a = g 1 ∗ k , b = g 2 ∗ k a=g_1*k,\ b=g_2*k a=g1∗k, b=g2∗k, g 1 , g 2 ∈ Z g_1,g_2 \in \mathbb{Z} g1,g2∈Z 且 g 1 , g 2 g_1,g_2 g1,g2 互质,原等式变为 k = ( g 1 ∗ r + g 2 ∗ s ) ∗ k k=(g_{1}*r+g_{2}*s)*k k=(g1∗r+g2∗s)∗k 化简得 g 1 ∗ r + g 2 ∗ s = 1 g_1*r+g_2*s=1 g1∗r+g2∗s=1.
转换为证明若整数 g 1 , g 2 g_1,g_2 g1,g2互质,则存在整数解r,s满足 g 1 ∗ r + g 2 ∗ s = 1 g_1*r+g_2*s=1 g1∗r+g2∗s=1
-
因为 g 1 , g 2 g_1,g_2 g1,g2互质,设r,s,分别是使得 g 1 ∗ r + g 2 ∗ s > 0 g_1*r+g_2*s>0 g1∗r+g2∗s>0 的一个整数集合,由良序原则,令 x = m i n { g 1 ∗ r + g 2 ∗ s } > 0 x=min\{g_1*r+g_2*s\}>0 x=min{g1∗r+g2∗s}>0,假设此时 r = r 1 , s = s 1 r=r_1,s=s_1 r=r1,s=s1,有 g 1 ∗ r 1 + g 2 ∗ s 1 = x g_1*r_1+g_2*s_1=x g1∗r1+g2∗s1=x。
假设 g 1 g_1 g1除以x的商为j,余数为r,则有
r = g 1 − j ∗ x = g 1 − j ∗ ( g 1 ∗ r 1 + g 2 ∗ s 1 ) = g 1 ∗ ( 1 − j ∗ r 1 ) + g 2 ∗ ( − j ∗ s 1 ) r=g_1-j*x=g_1-j*(g_1*r_1+g_2*s_1) = g_1*(1-j*r_1)+g_2*(-j*s_1) r=g1−j∗x=g1−j∗(g1∗r1+g2∗s1)=g1∗(1−j∗r1)+g2∗(−j∗s1)
且 ( 1 − j ∗ r 1 ) (1-j*r_1) (1−j∗r1)和 ( − j ∗ s 1 ) (-j*s_1) (−j∗s1) 为整数,所以 r=0,否则违背良序原则, 所以 x ∣ g 1 x|g_1 x∣g1,同理可得 x ∣ g 2 x|g_2 x∣g2,x既为 g 1 g_1 g1, g 2 g_2 g2的公因数,又 g 1 g_1 g1, g 2 g_2 g2互质,得 x = 1 x=1 x=1,证明得存在这样的r,s。