扩展欧几里得定理 exgcd

扩展欧几里得求形如 a x + b y = c ax + by = 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 axb(modm)ax+my=b

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

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

特殊情况:对于 a x + b y = g c d ( a , b ) ax + by = gcd(a,b) ax+by=gcd(a,b),当 b = 0 b = 0 b=0 时,令 x = 1 , y = 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) gcd(a,b)=gcd(b,amodb),假设已经求得了 ( 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) (bmoda)x0+ay0=gcd(a,b) 的一组解 ( x 0 , y 0 ) (x_0, y_0) (x0,y0),方程可以根据 a   m o d   m = a − m ⌊ a m ⌋ a \bmod m=a-m\left \lfloor \frac{a}{m} \right \rfloor amodm=amma 变形为

( 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) (baab)x0+ay0=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) abx0+ay0+bx0=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) a(y0abx0)+bx0=gcd(a,b)

交换 x 0 x_0 x0 y 0 y_0 y0
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(x0aby0)+by0=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} {ax+by=gcd(a,b)a(x0aby0)+by0=gcd(a,b){x=x0y0aby=y0

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) ax0+by0=gcd(a,b)
的一组解 ( x 0 , y 0 ) (x_0, y_0) (x0,y0)。有解的必要条件为 g c d ( a , b ) ∣ c gcd(a,b)|c gcd(a,b)c,所以令 k = c g c d ( a , b ) k = \frac{c}{gcd(a,b)} k=gcd(a,b)c
a x + b y = c ax + by = c ax+by=c

a x + b y = k × g c d ( a , b ) ax + by = k \times gcd(a,b) ax+by=k×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} {akx+bky=gcd(a,b)ax0+by0=gcd(a,b){x=k×x0y=k×y0{x=gcd(a,b)c×x0y=gcd(a,b)c×y0

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 a×gcd(a,b)c×x0+b×gcd(a,b)c×y0=c

为了求最小整数解,需要把上式的 x 0 x_0 x0 尽可能地减小,如果 x 0 x_0 x0 减小,对应的 y 0 y_0 y0 会增加。所以设 x 0 x_0 x0 减小了 t 0 t_0 t0 y 0 y_0 y0 增加了 t 1 t_1 t1
{ 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} {x=x0×gcd(a,b)cgcd(a,b)c×t0y=y0×gcd(a,b)c+gcd(a,b)c×t1a×x0×gcd(a,b)ca×gcd(a,b)c×t0+b×y0×gcd(a,b)c+b×gcd(a,b)c×t1=ca×gcd(a,b)c×x0+b×gcd(a,b)c×y0=ca×gcd(a,b)c×t0=b×gcd(a,b)c×t1t1t0=a×gcd(a,b)cb×gcd(a,b)ct1t0=ab

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 ) a(x0t0)+b(y0+t1)=ca(x0t0)+b(y0+ba×t0)

t 0 = b g c d ( a , b ) t_0 = \frac{b}{gcd(a,b)} t0=gcd(a,b)b,将 x 0 x_0 x0 减到不能再减为止,并考虑 b g c d ( a , b ) < 0 \frac{b}{gcd(a,b)} < 0 gcd(a,b)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} {xmin=(x0modgcd(a,b)b+gcd(a,b)b)modgcd(a,b)bymin=bca×x0

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值