扩展欧几里得学习笔记

简述Exgcd

要求关于\(x,y\)的方程\(ax+by=c\)的一组解。

假装显然我们要先求出\(ax+by=\mathrm{gcd}(a,b)\)的一组解,然后就可以找出所有的解\(x,y\)

\(bx'+(a\%b)y'=\mathrm{gcd}(b,a\%b)=\mathrm{gcd}(a,b)\)

\(\because a \% b = a - \left\lfloor\frac{a}{b}\right\rfloor \times b\)

\(\therefore bx' + (a \% b) y' = bx' + (a - \left\lfloor\frac{a}{b}\right\rfloor \times b) y’\)

\(\quad = bx' + ay' - \left\lfloor\frac{a}{b}\right\rfloor \times by’ = ay' + b (x' - \left\lfloor\frac{a}{b}\right\rfloor \times y')\)

故有:

\[\mathrm{Exgcd}(a,b)=\left\{ \begin{array}{} x = 1,\; y = 1 & \mathrm{if}\;b=0\\ \mathrm{Exgcd}(b,a \% b),\; y = x - \left\lfloor\frac{a}{b}\right\rfloor\times y & \mathrm{if} \; b \not = 0 \end{array} \right. \]

代码

void exgcd(int a, int b, int &d, int &x, int &y) {
	if(b == 0) {
		d = a, x = 1, y = 0;
	} else {
		exgcd(b, a % b, d, x, y);
		int t = x;
		x = y, y = t - (a / b) * y;
	}
}
posted @ 2018-09-01 18:59  zhylj  阅读(115)  评论(0编辑  收藏  举报