扩展欧几里德算法,直线上的点

课本上关于这一节讲得不是很清楚

部分内容参考自:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html

扩展欧几里德算法

基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。

扩展欧几里德算法的应用主要有以下三方面:

(1)求解不定方程;

(2)求解模线性方程(线性同余方程);

(3)求解模的逆元;

 

(1):

  设a,b,c为任意整数,g=gcd(a,b),方程ax+by=g的一组解为(x0,y0),则当c为g的倍数时,ax+by=c的一组解为(p0,q0)=(x0*c/g,y0*c/g),方程的其他解为(pi,qi)=(p0 + b/g * t,q0-a/g*t)其中t为任意值;当c不为g的倍数时,不存在解

d的初值不用管?  

//算法,解方程ax+by=gcd(a,b),其中d=gcd(a,b),x,y初始值任意即可 

void MEuclid(int a,int b,int &d,int &x,int &y)

{

 if(b==0){d=a;x=1;y=0;return;}

 else     {MEuclid(b,a%b,d,y,x);

        y-=x*(a/b);

    }

}
View Code

 

你可能感兴趣的:(算法)