Pentium.Labs

System全家桶:https://zhuanlan.zhihu.com/c_1238468913098731520

导航

辗转相除法、扩展欧几里得

辗转相除法:求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  阅读(357)  评论(0编辑  收藏  举报



Pentium.Lab Since 1998