扩展欧几里得算法

裴蜀定理

证明

a , b ∈ Z a,b\in\mathbb{Z} a,bZ,那么对于 ∀ x , y ∈ Z \forall x,y\in\mathbb{Z} x,yZ gcd ⁡ ( a , b ) ∣ a × x + b × y \gcd(a,b)\mid a\times x+b\times y gcd(a,b)a×x+b×y

此外,一定 ∃   x , y ∈ Z \exist\,x,y \in \mathbb{Z} x,yZ,使得 a × x + b × y = gcd ⁡ ( a , b ) a\times x+b\times y=\gcd(a,b) a×x+b×y=gcd(a,b) 成立。

证明
证明第一点:

∵ gcd ⁡ ( a , b ) ∣ a , gcd ⁡ ( a , b ) ∣ b ∴ gcd ⁡ ( a , b ) ∣ a x , gcd ⁡ ( a , b ) ∣ b y    ( x , y ∈ Z ) ∴ gcd ⁡ ( a , b ) = a × x + b × y \begin{array}{l} \because \gcd(a,b)\mid a,\gcd(a,b)\mid b\\ \therefore \gcd(a,b)\mid ax,\gcd(a,b)\mid by\,\,(x,y\in\mathbb{Z})\\ \therefore \gcd(a,b)=a\times x+b\times y \end{array} gcd(a,b)a,gcd(a,b)bgcd(a,b)ax,gcd(a,b)by(x,yZ)gcd(a,b)=a×x+b×y

证明第二点:

a × x + b × y a\times x+b\times y a×x+b×y 的最小正整数值为 r r r,考虑证明 a   m o d   r = 0 a\bmod r=0 amodr=0

p = ⌊ a r ⌋ p=\Big\lfloor\dfrac{a}{r}\Big\rfloor p=ra,则可得 a   m o d   r = a − p × r a\bmod r=a-p\times r amodr=ap×r​。

代入 r r r,得到 a   m o d   r = a − p × ( a × x + b × y ) a\bmod r=a-p\times(a\times x+b\times y) amodr=ap×(a×x+b×y)

进一步可得 a × ( 1 − p × x ) + b × ( − p × y ) a\times(1-p\times x)+b\times (-p\times y) a×(1p×x)+b×(p×y),这就是 a x ′ + b y ′ ax'+by' ax+by​ 的形式。

因为 0 ≤ a   m o d   r < r 0\le a\bmod r<r 0amodr<r,且 r r r a × x + b × y a\times x+b\times y a×x+b×y 的最小正整数值,

所以 a   m o d   r = 0 a\bmod r = 0 amodr=0,即 r r r a a a 的因数。

同理可得 r r r 也是 b b b 的因数。

所以 r r r a , b a,b a,b 的公因数,即 r ∣ gcd ⁡ ( a , b ) r\mid\gcd(a,b) rgcd(a,b)

又因为 a × x + b × y a\times x+b\times y a×x+b×y 都是 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b) 的倍数,所以 gcd ⁡ ( a , b ) ∣ r \gcd(a,b)\mid r gcd(a,b)r

r = gcd ⁡ ( a , b ) r=\gcd(a,b) r=gcd(a,b)

Exgcd \textbf{Exgcd} Exgcd

首先考虑欧几里得算法是如何求解 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b) 的。

  1. b = 0 b=0 b=0 时, a a a 即为 a , b a,b a,b 的最大公约数。
  2. 求出 gcd ⁡ ( b , a   m o d   b ) \gcd(b,a\bmod b) gcd(b,amodb),设为 g 0 g_0 g0
  3. g = g 0 g=g_0 g=g0 g g g 就是 a , b a,b a,b​ 的最大公约数。

d = gcd ⁡ ( a , b ) d=\gcd(a,b) d=gcd(a,b) 于是可以仿照这个过程,求解不定方程:

  1. b = 0 b=0 b=0 时, a x + b y = d ax+by=d ax+by=d 的解是 x = d a x=\dfrac{d}{a} x=ad y y y 任意。

  2. 求出 b x + ( a   m o d   b ) y = d bx+(a\bmod b)y=d bx+(amodb)y=d 的一组解,设为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)

  3. ( x , y ) = f ( ( x 0 , y 0 ) ) (x,y)=f\big((x_0,y_0)\big) (x,y)=f((x0,y0)),那么 ( x , y ) (x,y) (x,y) 就是 a x + b y = d ax+by=d ax+by=d 的一组解。

    其中 f ( ( x 0 , y 0 ) ) f\big((x_0,y_0)\big) f((x0,y0)) 表示对 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 的一种变换。

现在的问题就是,如何通过 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 得到 ( x , y ) (x,y) (x,y)​。

PS在欧几里得算法中, gcd ⁡ ( a , b ) = gcd ⁡ ( b , a   m o d   b ) \gcd(a,b)=\gcd(b,a\bmod b) gcd(a,b)=gcd(b,amodb),故下面的式子中 d d d 是相等的。

已知 b x 0 + ( a   m o d   b ) y 0 = d bx_0+(a\bmod b)y_0=d bx0+(amodb)y0=d,转化形式可得:
b x 0 + ( a − ⌊ a b ⌋ b ) y 0 = d bx_0+(a-\Big\lfloor\dfrac{a}{b}\Big\rfloor b)y_0=d bx0+(abab)y0=d
a , b a,b a,b 提出来,可得
a y 0 + b ( x 0 − ⌊ a b ⌋ y 0 ) = d = a x + b y ay_0+b(x_0-\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0)=d=ax+by ay0+b(x0bay0)=d=ax+by
通过待定系数法,可得
{ x = y 0 y = x 0 − ⌊ a b ⌋ y 0 \begin{cases} x=y_0\\ y=x_0-\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0\\ \end{cases} {x=y0y=x0bay0


具体实现中,在数学上,当最后 b = 0 b=0 b=0 y y y 可以取任意值,但是如果 y y y 取得很大的话,中途中可能会超过 intlong long 的存储范围。

但是如果最后 b = 0 b=0 b=0 y = 0 y=0 y=0,那么对于其它的迭代步骤,求解 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 得到的一组解 ( x , y ) (x,y) (x,y) 一定满足:
{ ∣ x ∣ ≤ ∣ b 2 × gcd ⁡ ( a , b ) ∣ ∣ y ∣ ≤ ∣ a 2 × gcd ⁡ ( a , b ) ∣ \begin{cases} |x|\le\Bigg|\dfrac{b}{2\times \gcd(a,b)}\Bigg|\\ \hspace{0.5 mm}|y|\le\Bigg|\dfrac{a}{2\times \gcd(a,b)}\Bigg|\\ \end{cases} x 2×gcd(a,b)b y 2×gcd(a,b)a

证明:

PS:这里只考虑 a > b a>b a>b 的情况,显然 a ≤ b a\le b ab 在依次迭代后会变成 a > b a>b a>b 的情况。

首先,当 a   m o d   b = 0 a\bmod b=0 amodb=0 时,因为 a > b a>b a>b a a a b b b 的倍数,所以 a ≥ 2 × b a\ge 2\times b a2×b。迭代得到的解
{ x = y 0 = 0 < ∣ b 2 × gcd ⁡ ( a , b ) ∣ y = x 0 − ⌊ a b ⌋ y 0 = x 0 = ∣ 2 × b 2 × b ∣ ≤ ∣ a 2 × gcd ⁡ ( a , b ) ∣ \begin{cases} x=y_0=0<\Bigg|\dfrac{b}{2\times \gcd(a,b)}\Bigg|\\ y=x_0-\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0=x_0=\Bigg|\dfrac{2\times b}{2\times b}\Bigg|\le\Bigg|\dfrac{a}{2\times \gcd(a,b)}\Bigg| \end{cases} x=y0=0< 2×gcd(a,b)b y=x0bay0=x0= 2×b2×b 2×gcd(a,b)a
其次,设 b x + ( a   m o d   b ) y = gcd ⁡ ( b , a   m o d   b ) bx+(a\bmod b)y=\gcd(b,a\bmod b) bx+(amodb)y=gcd(b,amodb) 得到的解为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),满足:
{ x 0 ≤ ∣ a   m o d   b 2 × gcd ⁡ ( b , a   m o d   b ) ∣ y 0 ≤ ∣ b 2 × gcd ⁡ ( b , a   m o d   b ) ∣ \begin{cases} x_0\le\Bigg|\dfrac{a\bmod b}{2\times \gcd(b,a\bmod b)}\Bigg|\\ \hspace{0.5 mm}y_0\le\Bigg|\dfrac{b}{2\times \gcd(b,a\bmod b)}\Bigg| \end{cases} x0 2×gcd(b,amodb)amodb y0 2×gcd(b,amodb)b
a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 得到的解 ( x , y ) (x,y) (x,y) 也满足:

  1. ∣ x ∣ = ∣ y 0 ∣ ≤ ∣ b 2 × gcd ⁡ ( b , a   m o d   b ) ∣ = ∣ b 2 × gcd ⁡ ( a , b ) ∣ |x|=|y_0|\le\Bigg|\dfrac{b}{2\times \gcd(b,a\bmod b)}\Bigg|=\Bigg|\dfrac{b}{2\times\gcd(a,b)}\Bigg| x=y0 2×gcd(b,amodb)b = 2×gcd(a,b)b

  2. 由于 ∣ x 0 ∣ ≤ ∣ a   m o d   b 2 × gcd ⁡ ( b , a   m o d   b ) ∣ |x_0|\le\Bigg|\dfrac{a\bmod b}{2\times \gcd(b,a\bmod b)}\Bigg| x0 2×gcd(b,amodb)amodb ∣ ⌊ a b ⌋ y 0 ∣ ≤ ∣ ⌊ a b ⌋ 2 × gcd ⁡ ( a , b ) ∣ \Bigg|\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0\Bigg|\le \Bigg|\dfrac{\big\lfloor\frac{a}{b}\big\rfloor}{2\times\gcd(a,b)}\Bigg| bay0 2×gcd(a,b)ba

    所以
    ∣ y ∣ = ∣ x 0 − ⌊ a b ⌋ y 0 ∣ ≤ ∣ x 0 ∣ + ∣ ⌊ a b ⌋ y 0 ∣ = ∣ ⌊ a b ⌋ b + a   m o d   b 2 × gcd ⁡ ( a , b ) ∣ = ∣ a 2 × gcd ⁡ ( a , b ) ∣ |y|=\Bigg|x_0-\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0\Bigg|\le|x_0|+\Bigg|\Big\lfloor\dfrac{a}{b}\Big\rfloor y_0\Bigg|=\Bigg|\dfrac{\big\lfloor\frac{a}{b}\big\rfloor b+a\bmod b}{2\times \gcd(a,b)}\Bigg|=\Bigg|\dfrac{a}{2\times \gcd(a,b)}\Bigg| y= x0bay0 x0+ bay0 = 2×gcd(a,b)bab+amodb = 2×gcd(a,b)a

又可以发现,设 a x + b y = d = k × gcd ⁡ ( a , b ) ax+by=d=k\times\gcd(a,b) ax+by=d=k×gcd(a,b),那么每次得到的解都是在求解 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 时的解的 k k k 倍,所以不管 d d d 取多少,在最后的迭代中取 x = k , y = 0 x=k,y=0 x=k,y=0 同样是没有问题的。


求出一对解 x 0 , y 0 x_{0},y_{0} x0,y0 后,可求出通解为:
{ x = x 0 + b gcd ⁡ ( a , b ) × t y = y 0 − a gcd ⁡ ( a , b ) × t t ∈ Z \begin{cases} x=x_{0}+\dfrac{b}{\gcd(a,b)}\times t\\ y=y_{0}-\dfrac{a}{\gcd(a,b)}\times t \end{cases} \qquad t\in\mathbb{Z} x=x0+gcd(a,b)b×ty=y0gcd(a,b)a×ttZ


时间复杂度与欧几里得算法相同,故时间复杂度为 O ( log ⁡ max ⁡ { a , b } ) O(\log\max\{a,b\}) O(logmax{a,b})

Code \textbf{Code} Code

using lint = long long;

lint exgcd(lint a, lint b, lint &x, lint &y) {
  if (b == 0) {
    x = 1, y = 0;
    return a;
  }
  lint d = exgcd(b, a % b, y, x);
  y -= a / b * x;
  return d;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值