扩展欧几里得定理 exgcd

扩展欧几里得求形如 a x + b y = c ax + by = c 的方程。

a x b ( m o d m )       a x + m y = b a x \equiv b(\bmod m) \iff a x+m y=b

  • 对于不为 0 0 的整数 a , b a,b ,存在整数 x , y x,y ,使得 a x + b y = g c d ( a , b ) ax + by = gcd(a,b)

  • 方程 a x + b y = c ax + by = c 有解,当且仅当 g c d ( a , b ) c gcd(a,b)|c

特殊情况:对于 a x + b y = g c d ( a , b ) ax + by = gcd(a,b) ,当 b = 0 b = 0 时,令 x = 1 , y = 0 x = 1, y = 0 即求得一组解。

一般情况:借鉴辗转相除法 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b)=gcd(b,a \bmod b) ,假设已经求得了 ( b m o d a ) x 0 + a y 0 = g c d ( a , b ) (b \bmod a) x_0+ay_0=gcd(a,b) 的一组解 ( x 0 , y 0 ) (x_0, y_0) ,方程可以根据 a m o d m = a m a m a \bmod m=a-m\left \lfloor \frac{a}{m} \right \rfloor 变形为

( b a b a ) x 0 + a y 0 = g c d ( a , b ) (b-a\left \lfloor \frac{b}{a} \right \rfloor)x_0+ay_0=gcd(a,b)

b a x 0 + a y 0 + b x 0 = g c d ( a , b ) \left \lfloor \frac{b}{a} \right \rfloor x_0 + ay_0 + bx_0 = gcd(a,b)

a ( y 0 b a x 0 ) + b x 0 = g c d ( a , b ) a(y_0-\left \lfloor \frac{b}{a} \right \rfloor x_0)+bx_0=gcd(a,b)

交换 x 0 x_0 y 0 y_0
a ( x 0 b a y 0 ) + b y 0 = g c d ( a , b ) a(x_0-\left \lfloor \frac{b}{a} \right \rfloor y_0)+by_0=gcd(a,b)

{ a x + b y = g c d ( a , b ) a ( x 0 b a y 0 ) + b y 0 = g c d ( a , b )       { x = x 0 y 0 b a y = y 0 \begin{cases} ax + by = gcd(a,b) \\ a(x_0-\left \lfloor \frac{b}{a} \right \rfloor y_0)+by_0=gcd(a,b) \end{cases} \iff \begin{cases} x=x_0-y_0\left \lfloor \frac{b}{a} \right \rfloor \\ y=y_0 \\ \end{cases}

int exgcd(int a, int b, int &x, int &y) { 
    if (a == 0) {
        x = 0, y = 1;
        return b;
    }
    int d = exgcd(b % a, a, y, x);
    x -= b / a * y;
    return d;
}

如何求最小正整数解。假设我们求出了
a x 0 + b y 0 = g c d ( a , b ) ax_0+by_0 = gcd(a,b)
的一组解 ( x 0 , y 0 ) (x_0, y_0) 。有解的必要条件为 g c d ( a , b ) c gcd(a,b)|c ,所以令 k = c g c d ( a , b ) k = \frac{c}{gcd(a,b)}
a x + b y = c ax + by = c

a x + b y = k × g c d ( a , b ) ax + by = k \times gcd(a,b)

{ a x k + b y k = g c d ( a , b ) a x 0 + b y 0 = g c d ( a , b )       { x = k × x 0 y = k × y 0       { x = c g c d ( a , b ) × x 0 y = c g c d ( a , b ) × y 0 \begin{cases} a \frac{x}{k} + b \frac{y}{k} = gcd(a,b) \\ ax_0 + by_0 = gcd(a,b) \end{cases} \iff \begin{cases} x = k \times x_0 \\ y = k \times y_0 \end{cases} \iff \begin{cases} x = \frac{c}{gcd(a,b)} \times x_0 \\ y = \frac{c}{gcd(a,b)} \times y_0 \end{cases}

a × c g c d ( a , b ) × x 0 + b × c g c d ( a , b ) × y 0 = c a \times \frac{c}{gcd(a,b)} \times x_0 + b \times \frac{c}{gcd(a,b)} \times y_0 = c

为了求最小整数解,需要把上式的 x 0 x_0 尽可能地减小,如果 x 0 x_0 减小,对应的 y 0 y_0 会增加。所以设 x 0 x_0 减小了 t 0 t_0 y 0 y_0 增加了 t 1 t_1
{ x = x 0 × c g c d ( a , b ) c g c d ( a , b ) × t 0 y = y 0 × c g c d ( a , b ) + c g c d ( a , b ) × t 1 a × x 0 × c g c d ( a , b ) a × c g c d ( a , b ) × t 0 + b × y 0 × c g c d ( a , b ) + b × c g c d ( a , b ) × t 1 = c a × c g c d ( a , b ) × x 0 + b × c g c d ( a , b ) × y 0 = c a × c g c d ( a , b ) × t 0 = b × c g c d ( a , b ) × t 1 t 0 t 1 = b × c g c d ( a , b ) a × c g c d ( a , b ) t 0 t 1 = b a \begin{cases} x = x_0 \times \frac{c}{gcd(a,b)} - \frac{c}{gcd(a,b)} \times t_0 \\ y = y_0 \times \frac{c}{gcd(a,b)} + \frac{c}{gcd(a,b)} \times t_1 \end{cases} \\ \Downarrow \\ a \times x_0 \times \frac{c}{gcd(a,b)} - a \times \frac{c}{gcd(a,b)} \times t_0 + b \times y_0 \times \frac{c}{gcd(a,b)} + b \times \frac{c}{gcd(a,b)} \times t_1 = c\\ \because a \times \frac{c}{gcd(a,b)} \times x_0 + b \times \frac{c}{gcd(a,b)} \times y_0 = c \\ \therefore a \times \frac{c}{gcd(a,b)} \times t_0 = b \times \frac{c}{gcd(a,b)} \times t_1 \\ \frac{t_0}{t_1} = \frac{b \times \frac{c}{gcd(a,b)}}{a \times \frac{c}{gcd(a,b)}} \\ \frac{t_0}{t_1} = \frac{b}{a}

a ( x 0 t 0 ) + b ( y 0 + t 1 ) = c       a ( x 0 t 0 ) + b ( y 0 + a b × t 0 ) a (x_0 - t_0) + b(y_0 + t_1) = c \iff a(x_0 - t_0) + b(y_0 +\frac{a}{b} \times t_0 )

t 0 = b g c d ( a , b ) t_0 = \frac{b}{gcd(a,b)} ,将 x 0 x_0 减到不能再减为止,并考虑 b g c d ( a , b ) < 0 \frac{b}{gcd(a,b)} < 0 的情况需要加上模数再取模。总结公式为
{ x m i n = ( x 0 m o d b g c d ( a , b ) + b g c d ( a , b ) ) m o d b g c d ( a , b ) y m i n = c a × x 0 b \begin{cases} x_{min}=(x_0 \bmod \frac{b}{gcd(a,b)} + \frac{b}{gcd(a,b)}) \bmod \frac{b}{gcd(a,b)} \\ y_{min} = \frac {c – a \times x_0}{b} \end{cases}

猜你喜欢

转载自blog.csdn.net/qq_39984146/article/details/107740239