扩展欧几里得算法的由来和C++实现

1、简述因子的概念

假设存在两个整数 m、n,若 n 除以 m 的结果是整数,即没有余数,则表示 mn 的因子,记作 m | n


2、欧几里得辗转相除法的证明


证:假设存在 a > b > 0,且 a , b∈Z,有   a = q ⋅ b + r \bm{\ a=q\cdot b+r}  a=qb+r,即   q = [ a / b ] \bm{\ q = [ a/b ]}  q=[a/b] 0 ≤ r < b \bm{0≤r<b} 0r<b

  令   g c d ( x , y ) \bm{\ gcd(x , y)}  gcd(x,y) 表示 xy 的最大公约数

  ① 当 r = 0 时, a = q ⋅ b \bm{a=q\cdot b} a=qb,即   g c d ( a , b ) = b \bm{\ gcd(a , b)=b}  gcd(a,b)=b

  ② 当 r ≠ 0 时,假设存在一个数 d 使得 d|bd|b,即有:

     d ∣ a ∧ d ∣ b ⟶ d ∣ b ∧ d ∣ ( a − q ⋅ b ) ⟶ d ∣ b ∧ d ∣ r \bm{d|a \land d|b \longrightarrow d|b \land d|(a-q\cdot b) \longrightarrow d|b\land d|r} dadbdbd(aqb)dbdr
     d ∣ b ∧ d ∣ r ⟶ d ∣ ( q ⋅ b + r ) ∧ d ∣ b ⟶ d ∣ a ∧ d ∣ b \bm{d|b \land d|r \longrightarrow d|(q\cdot b+r) \land d|b \longrightarrow d|a\land d|b} dbdrd(qb+r)dbdadb

  于是得到: d ∣ a ∧ d ∣ b ⟷ d ∣ b ∧ d ∣ r \bm{d|a\land d|b \longleftrightarrow d|b\land d|r} dadbdbdr
  令   d 1 = {   d   ∣   d ∣ a ∧ d ∣ b   } 、 d 2 = {   d   ∣   d ∣ b ∧ d ∣ r   } \ \bm{d_1=\{\ d\ \bigg| \ d|a\land d|b \ \}}、 \bm{d_2=\{\ d\ \bigg| \ d|b\land d|r \ \}}  d1={ d  dadb }d2={ d  dbdr }
  即   d ∣ a ∧ d ∣ b ⟷ d ∣ b ∧ d ∣ r   ⟹   d 1 = d 2   ⟹   d 1 m a x = d 2 m a x \ \bm{d|a\land d|b \longleftrightarrow d|b\land d|r \ \Longrightarrow\ d_1=d_2\ \Longrightarrow\ d_{1max}=d_{2max}}  dadbdbdr  d1=d2  d1max=d2max

  其中   d 1 、 d 2   \ \bm{d_1、d_2\ }  d1d2 是集合,   d 1 m a x 、 d 2 m a x   \ \bm{d_{1max}、d_{2max}\ }  d1maxd2max 是具体的值

   ∴   g c d ( a , b )   =   g c d ( b , r )   =   g c d ( b   ,   a   m o d   b ) \bm{\therefore \ gcd(a,b)\ =\ gcd(b,r)\ =\ gcd(b\ ,\ a\ mod \ b)}  gcd(a,b) = gcd(b,r) = gcd(b , a mod b)

3、最小公倍数和最大公约数的关系

两个数的乘积等于其最大公约数和最小公倍数的乘积

证:假设存在 a > b > 0 ,且 a , b∈Z

  令   g c d ( x , y )   \bm{\ gcd(x , y)\ }  gcd(x,y)  表示 xy 的最大公约数, l c m ( x , y ) \bm{lcm(x, y)} lcm(x,y) 表示 xy 的最小公倍数

  又假设 t = g c d ( a , b ) \bm{t=gcd(a,b)} t=gcd(a,b),所以 a 0 = a / t \bm{a_0=a/t} a0=a/t   b 0 = b / t   \ \bm{b_0=b/t\ }  b0=b/t 互质

   ∴   g c d ( a 0 , b 0 ) = 1 \bm{\therefore\ gcd(a_0,b_0)=1}  gcd(a0,b0)=1   l c m ( a 0 , b 0 ) = a 0 ⋅ b 0 \bm{\ lcm(a_0,b_0)=a_0\cdot b_0}  lcm(a0,b0)=a0b0

   ∵   l c m ( a , b ) = l c m ( a 0 ⋅ t , b 0 ⋅ t ) = t ⋅ l c m ( a 0 , b 0 ) = t ⋅ a 0 ⋅ b 0 \bm{\because\ lcm(a,b)=lcm(a_0\cdot t,b_0\cdot t)=t\cdot lcm(a_0,b_0)=t\cdot a_0 \cdot b_0}  lcm(a,b)=lcm(a0t,b0t)=tlcm(a0,b0)=ta0b0

   ∴   g c d ( a , b ) ⋅ l c m ( a , b ) = t 2 ⋅ a ⋅ b = ( t ⋅ a ) ( t ⋅ b ) = a 0 ⋅ b 0 \bm{\therefore \ gcd(a,b)\cdot lcm(a,b)=t^2\cdot a\cdot b=(t\cdot a)(t\cdot b)=a_0\cdot b_0}  gcd(a,b)lcm(a,b)=t2ab=(ta)(tb)=a0b0

  故两个数的乘积等于其最大公约数和最小公倍数的乘积得证

4、贝祖定理

关于 x , y(x,y 都是整数)的不定方程,一定存在一组解 (x , y) 使得 a x + b y = g c d ( a , b ) \bm{ax+by=gcd(a,b)} ax+by=gcd(a,b) 成立,其中 a , b 都是整数, g c d ( a , b )   \bm{gcd(a,b)\ } gcd(a,b) 表示 ab 的最大公约数。

证:假设存在 a > b > 0 ,且 a , b∈Z,令   d = g c d ( a , b )   \bm{\ d=gcd(a , b)\ }  d=gcd(a,b) 

   ∵   a = b ⋅ q + r    ( 0 ≤ r < b ) \bm{\because \ a=b\cdot q+r \ \ (0\leq r<b )}  a=bq+r  (0r<b),且   g c d ( a , b ) = g c d ( b , r ) \bm{\ gcd(a,b)=gcd(b,r)}  gcd(a,b)=gcd(b,r)

   ∴   b = r ⋅ q 1 + r 1    ( 0 ≤ r 1 < r ) \bm{\therefore\ b=r\cdot q_1+r_1 \ \ (0\leq r_1<r )}  b=rq1+r1  (0r1<r)

  又 ∵   g c d ( b , r ) = g c d ( r , r 1 ) \bm{\because\ gcd(b,r)=gcd(r,r_1)}  gcd(b,r)=gcd(r,r1)

   ∴   r = r 1 ⋅ q 2 + r 2    ( 0 ≤ r 2 < r 1 ) \bm{\therefore\ r=r_1\cdot q_2+r_2 \ \ (0\leq r_2<r_1 )}  r=r1q2+r2  (0r2<r1)

  以此类推: … … \bm{\dots \dots }

     r n − 3 = r n − 2 ⋅ q n − 1 + r n − 1    ( 0 ≤ r n − 1 < r n − 2 ) \bm{\ r_{n-3}=r_{n-2}\cdot q_{n-1}+r_{n-1} \ \ (0\leq r_{n-1}<r_{n-2} )}  rn3=rn2qn1+rn1  (0rn1<rn2)

     r n − 2 = r n − 1 ⋅ q n + r n    ( 0 ≤ r n < r n − 1 ) \bm{\ r_{n-2}=r_{n-1}\cdot q_n+r_n \ \ (0\leq r_n<r_{n-1} )}  rn2=rn1qn+rn  (0rn<rn1)

     r n − 1 = r n ⋅ q n + 1    ( r n + 1 = 0 ) \bm{\ r_{n-1}=r_{n}\cdot q_{n+1}\ \ (r_{n+1}=0 )}  rn1=rnqn+1  (rn+1=0) , 即   d = r n \bm{\ d=r_n}  d=rn

  此时   b > r > r 1 > r 2 > ⋅ ⋅ ⋅ > r n − 1 > r n > r n + 1 = 0   \bm{\ b>r>r_1>r_2>\cdot \cdot \cdot >r_{n-1}>r_n>r_{n+1}=0 \ }  b>r>r1>r2>>rn1>rn>rn+1=0 

   ∴   d = r n = r n − 2 − q n ⋅ r n − 1   \bm{\therefore \ d=r_n=r_{n-2}-q_n\cdot r_{n-1}\ }  d=rn=rn2qnrn1 
      = r n − 2 − q n ⋅ ( r n − 3 − q n − 1 ⋅ r n − 2 )   \bm{=r_{n-2}-q_n\cdot (r_{n-3}-q_{n-1}\cdot r_{n-2}) \ } =rn2qn(rn3qn1rn2) 
      = − q n ⋅ r n − 3 + ( 1 + q n ⋅ q n − 1 ) ⋅ r n − 2   \bm{=-q_n\cdot r_{n-3}+(1+q_n\cdot q_{n-1})\cdot r_{n-2} \ } =qnrn3+(1+qnqn1)rn2 
      ⋯ ⋯ \bm{\cdots \cdots}
      = x ⋅ a + y ⋅ b   \bm{=x\cdot a+y\cdot b \ } =xa+yb 

  由于   q   , q 1   , q 2   , . . .   , q n − 1   , q n   \bm{\ q \ ,q_1\ , q_2 \ , ... \ , q_{n-1}\ ,q_n\ }  q ,q1 ,q2 ,... ,qn1 ,qn 都是整数

  所以 xy 必是整数

  故一定存在一组解 (x , y) 使得 a x + b y = g c d ( a , b ) \bm{ax+by=gcd(a,b)} ax+by=gcd(a,b) 成立

5、通过扩展欧几里得算法求解贝祖等式


解:令   a 0 x 0 + b 0 y 0 = g c d ( a 0 , b 0 )    − − − ( 1 ) \bm{\ a_0x_0+b_0y_0=gcd(a_0,b_0) \ \ ---(1)}  a0x0+b0y0=gcd(a0,b0)  (1)

  由欧几里得辗转相除公式可得:

   g c d ( b 0   ,   a 0   m o d   b 0 ) = g c d ( a 0 , b 0 )    − − − ( 2 ) \bm{gcd(b_0\ ,\ a_0\ mod\ b_0)=gcd(a_0,b_0)\ \ ---(2)} gcd(b0 , a0 mod b0)=gcd(a0,b0)  (2)

   ∵   x   m o d   y = x − ⌊ x / y ⌋ ⋅ y \bm{\because\ x \ mod \ y = x - \lfloor{x/y} \rfloor \cdot y}  x mod y=xx/yy ,其中 ⌊ ⌋ \bm{\lfloor \rfloor} 为向下取整符号

   ∴   g c d ( b 0   ,   a 0   m o d   b 0 ) = b 0 x 1 + ( a 0 − ⌊ a 0 / b 0 ⌋ ⋅ b 0 ) ⋅ y 1    − − − ( 3 ) \bm{\therefore \ gcd(b_0\ ,\ a_0\ mod\ b_0)=b_0x_1+(a_0 - \lfloor{a_0/b_0} \rfloor \cdot b_0)\cdot y_1 \ \ ---(3)}  gcd(b0 , a0 mod b0)=b0x1+(a0a0/b0b0)y1  (3)

  将 (1) (3) 式代入 (2) 可得:

   a 0 x 0 + b 0 y 0 = b 0 x 1 + ( a 0 − ⌊ a 0 / b 0 ⌋ ⋅ b 0 ) ⋅ y 1    − − − ( 4 ) \bm{ a_0x_0+b_0y_0=b_0x_1+(a_0 - \lfloor{a_0/b_0} \rfloor \cdot b_0)\cdot y_1 \ \ ---(4)} a0x0+b0y0=b0x1+(a0a0/b0b0)y1  (4)

  整理 (4) 得: a 0 x 0 + b 0 y 0 = a 0 y 1 + b 0   ( x 1 − ⌊ a 0 / b 0 ⌋ ⋅ y 1 )    − − − ( 5 ) \bm{ a_0x_0+b_0y_0=a_0y_1+b_0\ (x_1 - \lfloor{a_0/b_0} \rfloor \cdot y_1) \ \ ---(5)} a0x0+b0y0=a0y1+b0 (x1a0/b0y1)  (5)

   ∴   ( x 0 , y 0 ) = ( y 1 , x 1 − ⌊ a 0 / b 0 ⌋ ⋅ y 1 ) \bm{\therefore \ (x_0,y_0)=(y_1,x_1 - \lfloor{a_0/b_0} \rfloor \cdot y_1)}  (x0,y0)=(y1,x1a0/b0y1)

  为了进一步求得 x1y1 的值,可以按上述步骤求解

  故   ( x 1 , y 1 ) = ( y 2 , x 2 − ⌊ a 1 / b 1 ⌋ ⋅ y 2 ) \bm{\ (x_1,y_1)=(y_2,x_2 - \lfloor{a_1/b_1} \rfloor \cdot y_2)}  (x1,y1)=(y2,x2a1/b1y2)

  其中   g c d ( a 1 , b 1 ) = g c d ( b 0   ,   a 0   m o d   b 0 ) \bm{ \ gcd(a_1,b_1)=gcd(b_0\ , \ a_0\ mod\ b_0)}  gcd(a1,b1)=gcd(b0 , a0 mod b0),即   a 1 = b 0   ,   b 1 = a 0   m o d   b 0   \bm{\ a_1=b_0\ , \ b_1=a_0 \ mod\ b_0 \ }  a1=b0 , b1=a0 mod b0 

   ⋯ ⋯ \bm{\cdots \cdots}

  以此类推,直到递归至第 n 次使   b n = 0   ,   a n = g c d ( a n , b n ) \bm{\ b_n=0\ , \ a_n=gcd(a_n,b_n)}  bn=0 , an=gcd(an,bn),即   ( x n , y n ) = ( 1 , 0 )   \bm{\ (x_n,y_n)=(1,0)\ }  (xn,yn)=(1,0) 

  然后将该组解逐一回代能够求得: ( x n − 1 , y n − 1 ) , ( x n − 2 , y n − 2 ) , … , ( x 0 , y 0 ) \bm{(x_{n-1},y_{n-1}),(x_{n-2},y_{n-2}),\ldots,(x_0,y_0)} (xn1,yn1),(xn2,yn2),,(x0,y0)

  由于原方程为不定方程 ,于是求得的   ( x 0 , y 0 )   \bm{\ (x_0,y_0)\ }  (x0,y0) 只是一组特解

  通解为: ( x , y ) = ( x 0 ± k b 0   ,   y 0 ∓ k a 0 ) \bm{(x,y)=(x_0\pm kb_0\ ,\ y_0\mp ka_0)} (x,y)=(x0±kb0 , y0ka0) k ∈ Z \bm{k\in Z} kZ

   (   a x + b y = c   ⟹   a ( x + k b ) + b ( y − k a ) = a x + b y = c   ) \bm{(\ ax+by=c \ \Longrightarrow\ a(x+kb)+b(y-ka)=ax+by=c \ )} ( ax+by=c  a(x+kb)+b(yka)=ax+by=c )


C++算法实现

void extend_gcd(int a, int b,int &x, int &y){
	if(b==0) x=1,y=0;
	else {
		extend_gcd(b,a%b,x,y);
		int temp = y;
		y = x- a/b*y;
		x = temp;
	}
	return;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值