exgcd 运算过程中值域上界
扩展欧几里得算法(\(\text{Extended Euclidean Algorithm}\),算法竞赛中又称为 \(\text{exgcd}\))是用来求解 “给定正整数 \(x,y\),求满足 \(ax+by=\gcd(x,y)\) 的某个 特解 \((a',b')\)” 的算法。
这里顺便一提
这个不定方程的 通解,实际上,如果有特解 \((a',b')\),这个通解是
证明比较简单这里就省去了。所以通过扩展欧几里得构造出这么一个特解后,就可以得知这个不定方程的所有解。
为了避免歧义以及行文方便这里给出扩展欧几里得算法的一个实现(由于伪代码编写起来较麻烦,暂时 先用 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\)。
初值有
递推关系是(\(i\le n-1\))
容易发现 \(\{a_i|0\le i\le n-1\}=\{b_i|1\le i\le n\}\),所以主要关心 \(b_i\)。
结论是
Proof.
将 \((1)\) 改写一下,有递推式(\(i\le n-2\))
递推式 \((3)\) 的初值是 \(b_n=0,b_{n-1}=1\)。
根据 \(\lfloor\frac{x_i}{y_i}\rfloor\ge 1\),不难证明
于是根据 \((3)\) 又可以写出
于是有 \(\forall\;0\le i<j\le n\),
因此运算过程中的上界就是 $\lvert b_0\rvert $。
最后,只需证明
对 \(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)\) 成立,由于
故 \(i \ge i'\) 的时候 \((4)\) 依然成立。
由数学归纳法 \((4)\) 得证,从而命题得证。
\(\square\)
从上证明可以看出
于是就有
于是可以断言,exgcd
运算过程中值域上界不超过输入的两个变量 \(x,y\)。
后记
本文结论参考 Wikipedia。oi-wiki 上也有对这个东西的证明,给出的结论虽然松了一点但是对于算法竞赛来说够用了。