定义:
对于不完全为0的两个整数a,b,gcd(a,b)表示a,b的最大公约数
则必然存在整数对x,y,使得gcd(a,b)=ax+by。
(由数论中的相关定理可知,至于这个相关定理是什么,我也不清楚我也不深究这个)
解法及证明:
①显然当b=0时,有x=1,y=0。
由欧几里德算法我们知道gcd(a,b)=gcd(b,a%b)(PS:%为求余运算符)
所以我们可以得到以下关系式:a*x1+b*y1=b*x2+a%b*y2,该式等同于a*x1+b*y1=b*x2+(a-[a/b]*b)*y2
变形可得a*x1+b*y1=a*y2+b*(x2-[a/b])
所以我们可以得到以下递推式:x1=y2,y1=x2-[a/b],结合①为递推结束条件,即可求解.
代码实现:
void exgcd(int a,int b)
{
if(b==0) {x=1;y=0;return;}
exgcd(b,a%b);
int t=y;
y=x-a/b*y;
x=t;
}
由一组解推出所有解:
已知x1,y1是二元一次方程ax+by=c的一组整数解,则其所有解的通式为x=x1+kb,y=y1-ka(k为整数)
证明:略
推广到一般二元一次方程求整数解:
例如我们要求二元一次方程ax+by=c的整数解
令d=gcd(a,b),如果c%d!=0的话,则无整数解(这个很容易证明,我就不多说了)
方程两边除以d得a/d*x+b/d*y=c/d,这里显然gcd(a/d,b/d)=1
所以我们可以先用扩展欧几里德算法求出a/d*x+b/d*y=1的解
然后求出的x和y再乘以c/d即为原二元一次方程的一组整数解