> 文档中心 > 数学 - 扩展欧几里得算法

数学 - 扩展欧几里得算法


扩展欧几里得算法用于解决二元一次不定方程、一次同余方程、逆元等问题

二元一次不定方程

  • 二元一次不定方程的定义: a x + b y = c , ( a , b , c ∈ Z 且 a , b ≠ 0 ) (1) ax + by = c,(a, b, c \in Z且a, b \neq 0) \tag{1}ax+by=c(a,b,cZa,b=0)(1)
  • 如果c = 0 c = 0 c=0,则方程的整数解为:x = − b t , y = a t , ( t ∈ Z ) x = -bt,y = at,(t \in Z) x=bty=at(tZ)
  • 如果c c c为负数,则(1)式两边乘以− 1 -1 1,等号右边就变成正整数;因为所求的x x xy y y可正可负,所以我们只用讨论a a ab b b是正整数的情况。
  • d d da a ab b b的最大公因数,即 d = g c d ( a , b ) , a =a1 ∗ d , b =b1 ∗ d , (a1 ,b1 ) = 1 d = gcd(a, b),a = a_1 * d,b = b_1 * d,(a_1, b_1) = 1 d=gcd(a,b)a=a1db=b1d(a1,b1)=1,则(1)式变为 d ∗ ( a 1 x + b 1 x ) = c (2) d * (a_1x + b_1x) = c \tag{2}d(a1x+b1x)=c(2)

结论:当 d ∤ c d\nmid c dc 时,(1)式没有整数解;当 d ∣ c d\mid c dc 时,(1)式一定有整数解,这可以通过贝祖定理(又称裴蜀定理)得到。

贝祖定理:如果 a a a b b b是整数,且 g c d ( a , b ) = d gcd(a, b) = d gcd(a,b)=d,那么对于任意的整数 x , y , a x + b y x,y,ax + by xyax+by都一定是 d d d的倍数;特别的,一定存在整数 x , y x,y xy,使 a x + b y = d ax + by = d ax+by=d成立。

  • 贝祖定理的一个重要推论是:a a ab b b互质的充分必要条件是存在整数x , y x,y xy,使a x + b y = 1 ax + by = 1 ax+by=1
  • a x + b y ax + by ax+by能够得到的最小结果就是它们的最小公倍数

我们通过几个例子,解释 x x x y y y的求解步骤,并在此基础上得出扩展欧几里得算法。

例1 17 x + 5 y = 1 17x + 5y = 1 17x+5y=1

∵ g c d ( 17 , 5 ) = 1 , ∴ 方 程 有 解 \because gcd(17, 5) = 1,\therefore 方程有解 gcd(17,5)=1

( 3 ∗ 5 + 2 ) x + 5 y = 1 (3*5 + 2)x + 5y = 1 (35+2)x+5y=1,整理得:
5 ( 3 x + y ) + 2 x = 1 5(3x + y) + 2x = 1 5(3x+y)+2x=1
用换元法,如果我们求出如下方程的解,
5 x ′ + 2 y ′ = 1 5x^{'} + 2y^{'} = 1 5x+2y=1,则: x = y ′ , y = x ′ − 3 y ′ x = y^{'},y = x^{'} - 3y^{'} x=yy=x3y

( 2 ∗ 2 + 1 ) x ′ + 2 y ′ = 1 (2*2 + 1)x^{'} + 2y^{'} = 1 (22+1)x+2y=1,整理得:
2 ( 2 x ′ + y ′ ) + x ′ = 1 2(2x^{'} + y^{'}) + x^{'} = 1 2(2x+y)+x=1
用换元法,如果我们求出如下方程的解,
2 x ′ ′+ y ′ ′= 1 2x^{''} + y^{''} = 1 2x+y=1,则: x ′ = y ′ ′, y ′ = x ′ ′− 2 y ′ ′ x^{'} = y^{''},y^{'} = x^{''} - 2y^{''} x=yy=x2y

( 2 ∗ 1 + 0 ) x ′ ′+ y ′ ′= 1 (2*1 + 0)x^{''} + y^{''} = 1 (21+0)x+y=1,整理得:
1 ( 2 x ′ ′+ y ′ ′) + 0 x ′ ′= 1 1(2x^{''} + y^{''}) + 0x^{''} = 1 1(2x+y)+0x=1
用换元法,如果我们求出如下方程的解,
1 x ′ ′ ′+ 0 y ′ ′ ′= 1 1x^{'''} + 0y^{'''} = 1 1x+0y=1,则: x ′ ′= y ′ ′ ′, y ′ ′= x ′ ′ ′− 2 y ′ ′ ′ x^{''} = y^{'''},y^{''} = x^{'''} - 2y^{'''} x=yy=x2y

显而易见,方程 1 x ′ ′ ′+ 0 y ′ ′ ′= 1 1x^{'''} + 0y^{'''} = 1 1x+0y=1 有解 x ′ ′ ′= 1 , y ′ ′ ′= 0 x^{'''} = 1,y^{'''} = 0 x=1y=0
x ′ ′ ′ x^{'''} x的系数 1 1 1,就是原方程中 17 17 17 5 5 5的最大公约数

回溯可得,
x ′ ′= 0 , y ′ ′= 1 x^{''} = 0,y^{''} = 1 x=0y=1
x ′ = 1 , y ′ = − 2 x^{'} = 1,y^{'} = -2 x=1y=2
x = − 2 , y = 7 x = -2,y = 7 x=2y=7

例2 27 x + 21 y = 3 27x + 21y = 3 27x+21y=3

∵ g c d ( 27 , 21 ) = 3 , ∴ 方 程 有 解 \because gcd(27, 21) = 3,\therefore 方程有解 gcd(27,21)=3

( 1 ∗ 21 + 6 ) x + 21 y = 3 (1*21 + 6)x + 21y = 3 (121+6)x+21y=3,整理得:
21 ( x + y ) + 6 x = 3 21(x + y) + 6x = 3 21(x+y)+6x=3
用换元法,如果我们求出如下方程的解,
21 x ′ + 6 y ′ = 3 21x^{'} + 6y^{'} = 3 21x+6y=3,则: x = y ′ , y = x ′ − y ′ x = y^{'},y = x^{'} - y^{'} x=yy=xy

( 3 ∗ 6 + 3 ) x ′ + 6 y ′ = 3 (3*6 + 3)x^{'} + 6y^{'} = 3 (36+3)x+6y=3,整理得:
6 ( 3 x ′ + y ′ ) + 3 x ′ = 3 6(3x^{'} + y^{'}) + 3x^{'} = 3 6(3x+y)+3x=3
用换元法,如果我们求出如下方程的解,
6 x ′ ′+ 3 y ′ ′= 3 6x^{''} + 3y^{''} = 3 6x+3y=3,则: x ′ = y ′ ′, y ′ = x ′ ′− 3 y ′ ′ x^{'} = y^{''},y^{'} = x^{''} - 3y^{''} x=yy=x3y

( 2 ∗ 3 + 0 ) x ′ ′+ 3 y ′ ′= 3 (2*3 + 0)x^{''} + 3y^{''} = 3 (23+0)x+3y=3,整理得:
3 ( 2 x ′ ′+ y ′ ′) + 0 x ′ ′= 3 3(2x^{''} + y^{''}) + 0x^{''} = 3 3(2x+y)+0x=3
用换元法,如果我们求出如下方程的解,
3 x ′ ′ ′+ 0 y ′ ′ ′= 3 3x^{'''} + 0y^{'''} = 3 3x+0y=3,则: x ′ ′= y ′ ′ ′, y ′ ′= x ′ ′ ′− 2 y ′ ′ ′ x^{''} = y^{'''},y^{''} = x^{'''} - 2y^{'''} x=yy=x2y

显而易见,方程 3 x ′ ′ ′+ 0 y ′ ′ ′= 3 3x^{'''} + 0y^{'''} = 3 3x+0y=3 有解 x ′ ′ ′= 1 , y ′ ′ ′= 0 x^{'''} = 1,y^{'''} = 0 x=1y=0
x ′ ′ ′ x^{'''} x的系数 3 3 3,就是原方程中 27 27 27 21 21 21的最大公约数

回溯可得,
x ′ ′= 0 , y ′ ′= 1 x^{''} = 0,y^{''} = 1 x=0y=1
x ′ = 1 , y ′ = − 3 x^{'} = 1,y^{'} = -3 x=1y=3
x = − 3 , y = 4 x = -3,y = 4 x=3y=4

对于方程 a x + b y = g c d ( a , b ) ax + by = gcd(a, b) ax+by=gcd(a,b)

( ⌊ a / b ⌋ ∗ b + a % b ) x + b y = g c d ( a , b ) (\lfloor a/b \rfloor * b + a \% b)x + by = gcd(a, b) (a/bb+a%b)x+by=gcd(a,b),整理得:
b ( ⌊ a / b ⌋ ∗ x + y ) + a % b ∗ x = g c d ( a , b ) b(\lfloor a/b \rfloor * x + y) + a \% b * x = gcd(a, b) b(a/bx+y)+a%bx=gcd(a,b)
用换元法,如果我们求出如下方程的解,
b ∗ x ′ + a % b ∗ y ′ = g c d ( a , b ) b * x^{'} + a \% b * y^{'} = gcd(a, b) bx+a%by=gcd(a,b),则: x = y ′ , y = x ′ − ⌊ a / b ⌋ ∗ y ′ x = y^{'},y = x^{'} - \lfloor a/b \rfloor * y^{'} x=yy=xa/by

不断递归,最后我们得到方程:
g c d ( a , b ) ∗ x ~ + 0 ∗ y ~ = g c d ( a , b ) gcd(a, b) * \tilde x + 0 * \tilde y = gcd(a, b) gcd(a,b)x~+0y~=gcd(a,b)

可得该方程的一组解: x ~ = 1 , y ~ = 0 \tilde x = 1,\tilde y = 0 x~=1y~=0
x ~ \tilde x x~的系数,就是原方程中 a a a b b b的最大公约数

不断回溯,最后得到原方程的解

扩展欧几里得算法的参考代码

//二元一次不定方程:ax + by = gcd(a, b)//函数返回 gcd(a, b);通过引用传递,返回一组解 (x, y)int exgcd(int a, int b, int &x, int &y) {    if (b == 0) { x = 1, y = 0; return a;    }    int gcd = exgcd(b, a % b, x, y);    int t = x;    x = y;    y = t - a / b * y;    return gcd;}

总结

对于一般情况, a x + b y = c ax + by = c ax+by=c,( a , b , c a, b, c a,b,c为正整数),设 d = g c d ( a , b ) d = gcd(a, b) d=gcd(a,b)

  • 如果d ∤ c d \nmid c dc,方程无解
  • 如果d ∣ c d \mid c dc
    • 先求出方程 a x + b y = d ax + by = d ax+by=d的一组解 x 0, y 0x_0, y_0 x0,y0
    • 原方程的一组解为 x ′ = x 0∗ c / d , y ′ = y 0∗ c / d x^{'} = x_0 * c/d,y^{'} = y_0 * c/d x=x0c/dy=y0c/d
    • 原方程的通解为 x = x ′ + k ∗ b / d , y = y ′ − k ∗ a / d x = x^{'} + k * b / d,y = y^{'} - k * a / d x=x+kb/dy=yka/d k k k为任意整数
    • p = b / d p = b / d p=b/d x x x的最小非负整数解为 ( x ′ %   p + p )   %   p (x^{'} \% \ p + p) \ \% \ p (x% p+p) % p
    • q = a / d q = a / d q=a/d y y y的最小非负整数解为 ( y ′ %   q + q )   %   q (y^{'} \% \ q + q) \ \% \ q (y% q+q) % q

求解一次同余方程 a x ≡ b   ( m o d   m ) ax \equiv b \ (mod \ m) axb (mod m)

  • 一次同余方程亦称线性同余方程,指未知数仅出现一次幂的同余方程。
  • 该同余方程等价于 a x = m ∗ ( − y ) + b ax = m * (-y) + b ax=m(y)+b,即a x + m y = b ax + my = b ax+my=b
  • 如果g c d ( a , m ) ∤ b gcd(a, m) \nmid b gcd(a,m)b,该方程无解
  • 如果g c d ( a , m ) ∣ b gcd(a, m) \mid b gcd(a,m)b,用上述方法求解

求解乘法逆元

  • 对于正整数a , m a, m a,m,如果有a x ≡ 1   ( m o d   m ) ax \equiv 1 \ (mod \ m) ax1 (mod m),则称x x x的最小正整数解为a a am m m的逆元,也叫做数论倒数,记作 a − 1a^{-1} a1a a ax x x一定都和m m m互质,如果a a am m m不互质就不存在逆元。
  • 乘法运算中a ∗a − 1 = 1 a * a^{-1} = 1 aa1=1,模运算中,a ∗a − 1 ≡ 1   ( m o d   m ) a * a^{-1} \equiv 1 \ (mod \ m) aa11 (mod m)

扩展欧几里得算法求逆元

  • 见求解一次同余方程

费马小定理求逆元

  • 如果模数m m m为质数,可利用费马小定理求逆元: a m − 1 ≡ 1   ( m o d   m ) a^{m-1} \equiv 1 \ (mod \ m) am11 (mod m)
  • 因为a ∗a m − 2 ≡ 1   ( m o d   m ) a * a^{m-2} \equiv 1 \ (mod \ m) aam21 (mod m),所以a a a的逆元是 a m − 2   % m a^{m-2} \ \% m am2 %m,用快速幂计算
  • 例如,m m m为7时,3 ∗35 ≡ 1   ( m o d   7 ) 3 * 3^5 \equiv 1 \ (mod \ 7) 3351 (mod 7) 35   %   7 3^5 \ \% \ 7 35 % 73 3 37 7 7的逆元

欧拉函数求逆元

  • 欧拉定理:如果a a am m m互质,设ϕ ( m ) \phi(m) ϕ(m)为小于m m m且与m m m互质的正整数的个数,则有 a ϕ ( m ) ≡ 1   ( m o d   m ) a^{\phi(m)} \equiv 1 \ (mod \ m) aϕ(m)1 (mod m)
  • 因为a ∗a ϕ ( m ) − 1 ≡ 1   ( m o d   m ) a * a ^ {\phi(m) - 1} \equiv 1 \ (mod \ m) aaϕ(m)11 (mod m),所以a a a的逆元是 a ϕ ( m ) − 1   % m a^{\phi(m)-1} \ \% m aϕ(m)1 %m,用快速幂计算
  • m m m可以不是质数
  • 例如,m m m为8时,ϕ ( 8 ) = 4 \phi(8) = 4 ϕ(8)=43 ∗33 ≡ 1   ( m o d   8 ) 3 * 3^3 \equiv 1 \ (mod \ 8) 3331 (mod 8) 33   %   8 3^3 \ \% \ 8 33 % 83 3 38 8 8的逆元

逆元的用处

  • 取余运算有如下性质
    • ( a + b ) % m = ( a % m + b % m ) % m (a + b) \% m = (a \% m + b \% m) \%m (a+b)%m=(a%m+b%m)%m
    • ( a − b ) % m = ( a % m − b % m ) % m (a - b) \% m = (a \% m - b \% m) \%m (ab)%m=(a%mb%m)%m
    • ( a ∗ b ) % m = ( a % m ∗ b % m ) % m (a * b) \% m = (a \% m * b \% m) \%m (ab)%m=(a%mb%m)%m
    • a b  % m = ( a % m ) b  % m a^b \ \% m = (a \% m)^b \ \%m ab %m=(a%m)b %m
  • 但对除法不成立
    • ( a   /   b ) % m ≠ ( a % m   /   b % m ) % m (a \ / \ b) \% m \neq (a \% m \ / \ b \% m) \%m (a / b)%m=(a%m / b%m)%m
    • 例如,$ (8 / 2) % 7 = 4 , 而 ,而 (8 % 7) / (2 % 7) % 7 = 0$
  • 如果b ∣ a b \mid a ba,则( a   /   b ) % m = ( a   /   b ) ∗ ( b ∗b − 1 ) % m = ( a / b ∗ b ) ∗ (b − 1 ) % m = ( a ∗b − 1 ) % m (a \ / \ b) \% m = (a \ / \ b) * (b * b^{-1}) \% m = (a / b * b) * (b^{-1}) \% m = (a * b^{-1}) \% m (a / b)%m=(a / b)(bb1)%m=(a/bb)(b1)%m=(ab1)%m。这样我们就把除法取余运算转化成了乘法取余运算。
  • 例如,求3的幂的和
    在这里插入图片描述