问题描述:
求解二元一次方程ax+by=c。
问题分析:
上述的二元一次方程可以用同余方程来进行描述:ax≡cmod(b)
两个问题可以进行转换,但是都可以用扩展的欧几里得算计来解决。
首先关于欧几里得算法(也叫做辗转相除法),可以查看我的另外一篇文章:
http://blog.csdn.net/yi_ming_he/article/details/72084826
下面就来说说如何用扩展欧几里得算法求解二元一次方程。
首先,对于a0x+b0y=gcd(a0,b0)
如果我们另a0=b, b0=a%b=a-(a/b)*b
把它带入原方程:bx+(a-a/b*b)y=gcd(b, a%b)=gcd(a,b)
然后我们稍微变一下,把a和b提取出来,就变成:ay+b(x-a/b*y)=gcd(a,b)
可以看到,这个地方已经和辗转相除法联系起来了
因此只需要用x=y, y=x-a/b*y进行迭代就可以求出一组可行的解了(如果解存在的话)
另外:对于ax+by=c有整数解的充分必要条件是c%gcd(a,b)==0
我们先用扩展欧几里得算法求出a0x+b0y=gcd(a0,b0)一组解(x0,y0),然后两边同时乘以c/gcd(a,b),就得到了原方程ax+by=c的一组解。
此外,如果gcd(a,b)=1, ax+by=c的一组解为(x0,y0),那么该方程的统计为x=x0+bt,y=y0-at(其中t为任意整数),这样我们就可以求出这个方程的所有解。
但是如果我们想求的是这个方程的x的最小正整数解,我们只需要另t=b/gcd(a,b),x=(x%t+t)%t
如果此时x为正数,那结果就是它了,如果此时x为负数那再加一个t的绝对值就可以了
既然x的结果求出来了,那么把x带入方程就可以求出y值了。