欧几里德算法

老师给的课件(虽然并不能确定是谁写的)

这篇博文是调整了一下格式和字体,应该能带来更好的阅读体验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

  • 假设 d d d a , b a,b a,b 的一个公约数,则有 d ∣ a , d ∣ b d\mid a,d\mid b da,db
    r = a − k b r = a - kb r=akb ,因此 d ∣ r d\mid r dr ,故 d d d ( b , a   m o d   b ) (b,a\bmod b) (b,amodb) 的公约数;
  • 假设 d d d ( b , a   m o d   b ) (b,a\bmod b) (b,amodb) 的公约数,则 d ∣ b d\mid b db , d ∣ r d\mid r dr
    a = k b + r a = kb +r a=kb+r ,因此 d d d 也是 ( a , b ) (a,b) (a,b) 的公约数。

所以 ( 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=akb ,其中 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=akb=mcknc=(mkn)c

假设 n , m − k n n,m-kn n,mkn 不互质,则 n = x d , m − k n = y d n = xd, m - kn = yd n=xd,mkn=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,mkn 互质,则 gcd ( b , r ) = c = gcd ( a , b ) \text{gcd}(b , r)= c = \text{gcd}(a , b) gcd(b,r)=c=gcd(a,b) ,得证。

算法的实现:

  1. 最简单的方法就是应用递归算法。
    代码如下:

    int gcd(int a,int b) {
    	if(b==0) return a;
    	return gcd(b,a%b);
    }
    
  2. 用三目运算符改写后(这样会比 i f \sf if if 快一些):

    int gcd(int a,int b) { return b?gcd(b,a%b):a; }
    
  3. 也可以用循环写:

    int Gcd(int a, int b) {
    	int r=a%b;
    	while (r) { a=b; b=r; r=a%b; }	
    	return b;
    }
    

下一篇:拓展欧几里得算法

你可能感兴趣的:(算法讲解,学习笔记)