解不定方程ax+by=m的最小解

  

  给出方程a*x+b*y=c,其中所有数均是整数,且a,b,c是已知数,求满足那个等式的x,y值?这个方程可能有解也可能没解也可能有无穷多个解(注意:这里说的解都是整数解)?

  既然如此,那我们就得找出有解和无解的条件!

  先给出定理:方程a*x+b*y=c有解,当且仅当 c%gcd(a,b)=0。

  定理的证明很容易,如下:

  证明:

  若c%gcd(a,b)=0,则一定存在一个整数K,有c=K*gcd(a,b), 而我们知道a*x+b*y=gcd(a,b)一定存在解(x1, y1)所以就有K*(a*x1 +b*y1 )  = K*gcd(a,b)------>a*K*x1 +b*K*y1 = c,得出解为:(K*x1 , K*y1 )。定理得证。

  那么在a*x+b*y=c有解的情况下如何求解呢?

  

  由上可知,a*x+b*y=c 与 a*x+b*y=K*gcd(a,b)是等价的。另外a*x+b*y=gcd(a,b)的一组解为 x1, y1。

  令a1=a/gcd(a,b), b1=b/gcd(a,b),c1=c/gcd(a,b).

  综上,我们可以得出x,y的一组解就是x1*c1, y1*c1(实际上这个解我们在上面的证明定理的过程中就可以得出这组解,只是我们要的是最小解,所以在此处给出),但是满足方程的解有无穷多个,在实际的解题中我们常常只要求其最小解。现以求x的最小解为例,至此我们已经求的一组解使得满足方程a*x+b*y=m,那么a*(x+n*b)+b*(y-n*a)=m显然也成立。可知x+n*b(n=....-2,-1,0,1,2....)就是方程x解集。存在一个k使得x+k*b>0,x的最小解就是(x+k*b)%b.若我们将方程两边同时除以gcd(a,b),则方程变为a1*x+b1*y=c1,同上分析可知。x的最小值就是(x+k*b1)%b1,由于b1<=b,故这个值定会小于等于之前我们认为最小值。在实际求解时常用while(x<0) x+=b来使得为正的条件满足。

  另外给出所有解得公式,若是该方程的一组整数解,那么该方程的所有整数解可表示为.

参考资料:百度百科

     http://www.cnblogs.com/void/archive/2011/04/18/2020357.html

时间: 2024-10-12 07:13:12

解不定方程ax+by=m的最小解的相关文章

解同余式ax ≡ c(mod m)

将式子变形为 ax-c=my 可以看出原式有解当且仅当线性方程ax-my=c有解 设g = gcd(a, m) 则所有形如ax-my的数都是g的倍数 因此如果g不整除c则原方程无解. 下面假设g整除c: 利用扩展欧几里得算法解出 au + mv =g 一个特解(u0, v0) 所以可用整数c/g乘上上式 au0*(c/g) + mv0*(c/g) = c 得到原式的解x0 = u0*(c/g) 解的个数: 假设x1是ax ≡ c(mod m)的其他解 ax1 ≡ ax2(mod m),所以m整除

用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)

数值分析里面经常会涉及到用MATLAB程序实现用列主元消去法分别解方程组Ax=b 具体的方法和代码以如下方程(3x3矩阵)为例进行说明: 用列主元消去法分别解方程组Ax=b,用MATLAB程序实现: (1) 1. 实现该方程的解的MATLAB代码可以分为两种,一种是入门级别的,只是简单地计算出这道题即可,第二种是一种通用的代码,可以实现很多3x3矩阵的方程解,写好以后只需要改不同矩阵里的元素即可算出相应的解,需要建立在对MATLAB比较熟悉的基础上,具体如下: 第一种代码实现-入门级: A=[3

扩展欧几里得解不定方程

LL gcd(LL a,LL b){ if(b==0) return a; else return gcd(b,a%b); } LL ex_gcd(LL a,LL b,LL &x,LL &y){ if(b==0){ x=1;y=0; return a; } LL r=ex_gcd(b,a%b,x,y); LL t=x; x=y; y=t-a/b*y; return r; } //求解ax+by=c的解x,y x,y需要提前定义 bool linear_equation(LL a,LL b,

Codeforces7C-扩展欧几里德解线性方程(Ax+By+C=0)

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <string.h> #include <iostream> #include <vector> #include <list> #include <stack> #include <queue> #include <

拓展gcd解不定线性方程ax+by=c模版

拓展gcd解不定线性方程ax+by=c模版 /** 解不定方程 ax+by=c */ ll a,b,c; ll x,y; ll exgcd(ll a,ll b,ll &x,ll &y) { if(b==0){ x=1;y=0; return a; } ll r=exgcd(b,a%b,x,y); ll t=y; y=x-a/b*y; x=t; return r; } bool NLE(ll a,ll b,ll c,ll &x,ll &y) /**解不定方程 ax+by=c;

欧几里德与扩展欧几里德算法(转)

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a

ACM-欧几里得与拓展欧几里得算法

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 递归版算法: 1 int gcd(int a,int b) 2 { 3 if(b==0) 4 return a; 5 return 6 gcd(b,a%b); 7 } 递归优化版: 1 int gcd(int a,int b) 2 { 3 return b ? gcd(b,a%b) : a; 4

欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a

【转】欧几里得与扩展欧几里得

转自:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - k