辗转相除法、扩展欧几里得
辗转相除法:求gcd(a,b)
扩展欧几里得:解关于x和y的方程:a*x+b*y=gcd(a,b)
推广:对于关于x和y的方程a*x+b*y=n
有整数解的条件是n%gcd(a,b)==0
所以这种方程可以这样解:
先解方程a*x'+b*y'=gcd(a,b)
因而x=x'*n/gcd(a,b) , y=y'*n/gcd(a,b)
若方程a*x+b*y=c的一组整数解为(x0,y0),则它的任意整数解都可以写成(x0+k*b',y0-k*a')。
其中a'=a/gcd(a,b),b'=b/gcd(a,b)。 k取任意整数
总结一下这类问题的解法:
对于方程ax+by=c
设tm=gcd(a,b)
先用扩展欧几里得求出方程ax+by=tm的解x0、y0
然后有a*x0+b*y0=tm
令x1=x0*(c/tm),y1=y0*(c/tm)
则a*x1+b*y1=c
x1、y1即原方程的一个特解
这个方程的通解:xi=x1+k*(b/m),yi=y1-k*(a/m)
另:如果要求yi的最小非负解?令r=a/tm,则解y2=(y1%r+r)%r
其他类似的要求自己用纸算一算,YY一下就行了
1 int gcd(int a,int b){ 2 if (b==0) return a; 3 return gcd(b,a%b); 4 } 5 6 7 ------------------------------------------------ 8 9 10 int extgcd(int a,int b,int& x,int& y){ 11 int d=a; 12 if (b!=0){ 13 d=extgcd(b,a%b,y,x); 14 y-=(a/b)*x; 15 }else{ 16 x=1;y=0; 17 } 18 return d; 19 }
Reference:http://blog.csdn.net/lhfight/article/details/7755994
http://blog.sina.com.cn/s/blog_6f71bea30100o4v9.html
posted on 2014-10-31 20:35 Pentium.Labs 阅读(362) 评论(0) 编辑 收藏 举报