跳到主要内容

不定方程-扩展欧几里得算法

用来求ax+by=gcd(a,b)ax+by=gcd(a,b)的一组整数解

扩展欧几里得算法

b=0b=0时,显然x=1,y=0x=1,y=0是一组解 当b0b\neq0时, gcd(a,b)=ax+bygcd(b,a%b)=bx1+(a%b)y1=bx1+(aab×b)y1=ay1+b(x1aby1)\begin{aligned} \operatorname{gcd}(a, b) & =a x+b y \\ \operatorname{gcd}(b, a \% b) & =b x_{1}+(a \% b) y_{1} \\ & =b x_{1}+\left(a-\left\lfloor\frac{a}{b}\right\rfloor \times b\right) y_{1} \\ & =a y_{1}+b\left(x_{1}-\frac{a}{b} y_{1}\right) \end{aligned} 所以:x=y1,y=x1aby1x=y_{1}, y=x_{1}-\frac{a}{b} y_{1} 通解: {x=x0+bgcd(a,b)ky=y0agcd(a,b)k(考虑ax+by=0构造)\left\{\begin{array}{l} x=x_{0}+\frac{b}{\operatorname{gcd}(a, b)} * k \\ y=y_{0}-\frac{a}{\operatorname{gcd}(a, b)} * k \end{array}\right. ( 考虑 a x+b y=0 构造 )

int exgcd(int a,int b,int &x,int &y){
if (b==0){
x=1,y=0;
return a;
}
int x1,y1,d;
d= exgcd(b,a%b,x1,y1);
x=y1,y=x1-a/b*y1;
return d;
}

求不定方程ax+by=cax+by=c的一组整数解: 如果gcd(a,b)cgcd(a,b)|c,一定有整数解,否则没有 的一组解,在乘以cgcd(a,b)\frac{c}{gcd(a,b)},即可得到原方程的特解。