老师给的课件(虽然并不能确定是谁写的)
这篇博文是调整了一下格式和字体,应该能带来更好的阅读体验QAQ
如果您发现文章内容有误,请在评论区提出,另外就不要嘲讽我这种菜鸡啦
欧几里德算法又称辗转相除法,用于计算两个整数 a , b a,b a,b 的最大公约数。
设 a = k b + r a=kb+r a=kb+r,其中 a , b , k , r a,b,k,r a,b,k,r 都是整数,则 gcd ( a , b ) = gcd ( b , r ) \gcd(a,b)=\gcd(b,r) gcd(a,b)=gcd(b,r) ,即 gcd ( a , b ) = gcd ( b , a   m o d   b ) \gcd(a,b)=\gcd(b,a\bmod b) gcd(a,b)=gcd(b,amodb)。
a a a 可以表示成 a = k b + r a = kb + r a=kb+r ,则 r = a   m o d   b r = a\bmod b r=amodb 。
所以 ( a , b ) (a,b) (a,b) 和 ( b , a   m o d   b ) (b,a\bmod b) (b,amodb) 的公约数是一样的,其最大公约数也必然相等,得证。
设 r = a   m o d   b r=a\bmod b r=amodb, c c c 是 a , b a,b a,b 的最大公约数,即 c = gcd ( a , b ) c=\gcd(a,b) c=gcd(a,b) ,
则有 a = m c , b = n c a=mc,b=nc a=mc,b=nc ,其中 m , n m,n m,n 为正整数,且 m , n m,n m,n 互质。
由 r = a   m o d   b r=a\bmod b r=amodb 可知, r = a − k b r = a - kb r=a−kb ,其中 k k k 是正整数,
则 r = a − k b = m c − k n c = ( m − k n ) c r = a - kb = mc -knc =(m - kn)c r=a−kb=mc−knc=(m−kn)c 。
假设 n , m − k n n,m-kn n,m−kn 不互质,则 n = x d , m − k n = y d n = xd, m - kn = yd n=xd,m−kn=yd ,其中 x , y , d x ,y ,d x,y,d 都是正整数,且 d > 1 d > 1 d>1 ,
则 a = m c = ( k x + y ) d c , b = x d c a = mc =(kx+y)dc , b = xdc a=mc=(kx+y)dc,b=xdc,这时 a , b a , b a,b 的最大公约数变成 d c dc dc,与前提矛盾。
所以 n , m − k n n,m-kn n,m−kn 互质,则 gcd ( b , r ) = c = gcd ( a , b ) \text{gcd}(b , r)= c = \text{gcd}(a , b) gcd(b,r)=c=gcd(a,b) ,得证。
最简单的方法就是应用递归算法。
代码如下:
int gcd(int a,int b) {
if(b==0) return a;
return gcd(b,a%b);
}
用三目运算符改写后(这样会比 i f \sf if if 快一些):
int gcd(int a,int b) { return b?gcd(b,a%b):a; }
也可以用循环写:
int Gcd(int a, int b) {
int r=a%b;
while (r) { a=b; b=r; r=a%b; }
return b;
}
下一篇:拓展欧几里得算法