扩展欧几里德算法,直线上的点
课本上关于这一节讲得不是很清楚
部分内容参考自: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); } }