exgcd 运算过程中值域上界

扩展欧几里得算法\(\text{Extended Euclidean Algorithm}\),算法竞赛中又称为 \(\text{exgcd}\))是用来求解 “给定正整数 \(x,y\),求满足 \(ax+by=\gcd(x,y)\) 的某个 特解 \((a',b')\)” 的算法。

这里顺便一提

\[ax+by=\gcd(x,y) \]

这个不定方程的 通解,实际上,如果有特解 \((a',b')\),这个通解是

\[(a,b)=(a'+k\frac{y}{\gcd(x,y)},b'-k\frac{x}{\gcd(x,y)}),k\in \Z \]

证明比较简单这里就省去了。所以通过扩展欧几里得构造出这么一个特解后,就可以得知这个不定方程的所有解。

为了避免歧义以及行文方便这里给出扩展欧几里得算法的一个实现(由于伪代码编写起来较麻烦,暂时 先用 c++ 语言代替。)

int n, a[N], b[N], x[N], y[N];
pair<int, int> exgcd(int x0, int y0)
{
	x[0]=x0, y[0]=y0;
	for(n=0; y[n]>0; n++) x[n+1]=y[n], y[n+1]=x[n]-x[n]/y[n]*y[n];
    
	a[n]=1, b[n]=0;
	for(int i=n-1; i>=0; i--) a[i]=b[i+1], b[i]=a[i+1]-(x[i]/y[i])*b[i+1];	
	return make_pair(a[0], b[0]);
}

这段程序中,调用 exgcd(x, y),返回 \(ax+by=\gcd(x,y)\) 一个特解 \((a', b')\)。这么写而不是用递归实现的好处是,可以直观地看见其中的递推关系。

不妨只考虑 \(x>y>0\) 并且 \(x\bmod y\not\equiv 0\) 的情况。这是因为,如果 \(x<y\),上面的程序无非等价于调用 exgcd(y,x) 然后交换二元组的顺序;如果 \(x\bmod y\not\equiv 0\),等价于 \(n=1\),那么 \(a,b\) 要么是 \(0\) 要么是 \(1\)。这么规定,方便下文给出一个更紧的上界。

考虑的是 \(x\bmod y\not\equiv 0\),自然有 \(n\ge 2\)

初值有

\[(a_n,b_n)=(1,0) \]

递推关系是(\(i\le n-1\)

\[\tag{1} a_i=b_{i+1},b_i=a_i-\lfloor\frac{x_i}{y_i}\rfloor\times b_{i+1} \]

容易发现 \(\{a_i|0\le i\le n-1\}=\{b_i|1\le i\le n\}\),所以主要关心 \(b_i\)

结论是

\[\tag{2} \lvert b_i\rvert \le \frac{x}{2\gcd(x,y)} \]

Proof.

\((1)\) 改写一下,有递推式(\(i\le n-2\)

\[\tag{3} b_i=b_{i+2}-\lfloor\frac{x_i}{y_i}\rfloor\times b_{i+1} \]

递推式 \((3)\) 的初值是 \(b_n=0,b_{n-1}=1\)

根据 \(\lfloor\frac{x_i}{y_i}\rfloor\ge 1\),不难证明

\[\operatorname{sgn} (b_i) = \left\{ \begin{array} & 0 & i=n\\ 1 & i\not= n \land n-i\bmod 2 \equiv 0 \\ -1 & i\not= n \land n-i\bmod 2 \equiv 1 \\\end{array} \right. \]

于是根据 \((3)\) 又可以写出

\[\lvert b_i\rvert=\lvert b_{i+2}\rvert+ \lfloor\frac{x_i}{y_i}\rfloor\times\lvert b_{i+1}\rvert \]

于是有 \(\forall\;0\le i<j\le n\)

\[\lvert b_i\rvert \ge \lvert b_j\rvert \]

因此运算过程中的上界就是 $\lvert b_0\rvert $。

最后,只需证明

\[\tag{4} \lvert b_i\rvert \le \frac{x_i}{2\gcd(x,y)} \]

\(i\) 施归纳法。

\(i\ge n-1\),由于 \(b_n=0,b_{n-1}=1\),并且只考虑 \(x>y>0\) 并且 \(x\bmod y\not\equiv 0\) 的情况,可以断言 \(x_{n-1}\ge 2x_{n}\),因此它是对的。

假设 \(i\ge i'+1\) 的时候 \((4)\) 成立,由于

\[\begin{aligned}\lvert b_i\rvert=\lvert b_{i+2}\rvert+ \lfloor\frac{x_i}{y_i}\rfloor\times\lvert b_{i+1}\rvert&\le\frac{x_{i+2}}{2\gcd(x,y)}+\lfloor\frac{x_i}{y_i}\rfloor\times\frac{x_{i+1}}{2\gcd(x,y)} \\&=\frac{x_{i+2}}{2\gcd(x,y)}+\frac{x_i-x_{i+2}}{x_{i+1}}\times\frac{x_{i+1}}{2\gcd(x,y)} \\&=\frac{x_i}{2\gcd(x,y)}\end{aligned} \]

\(i \ge i'\) 的时候 \((4)\) 依然成立。

由数学归纳法 \((4)\) 得证,从而命题得证。

\(\square\)

从上证明可以看出

\[\lvert b_{1}\rvert \le \frac{x_1}{2\gcd(x,y)}=\frac{y}{2\gcd(x,y)} \]

于是就有

\[\lvert a_i\rvert \le \max(\frac{y}{2\gcd(x,y)},1) \]

于是可以断言,exgcd 运算过程中值域上界不超过输入的两个变量 \(x,y\)


后记

本文结论参考 Wikipedia。oi-wiki 上也有对这个东西的证明,给出的结论虽然松了一点但是对于算法竞赛来说够用了。

posted @ 2022-03-17 21:01  gsj_z  阅读(93)  评论(0编辑  收藏  举报