应用:求两个数的最大公约数和最小公倍数
求最大公约数代码:
long long gcd(long long a,long long b)
{
return b==0?a:gcd(b,a%b);
}
求最小公倍数代码:
long long lcm(long long a,long long b)
{
return a/gcd(a,b)*b;
}
扩展欧几里德算法:
应用:①求解不定方程
②求解同余方程
③求解模的逆元
代码:
//d为a和b的最大公约数,x和y是方程的其中一组解
void exgcd(long long a,long long b,long long &d,long long &x,long long &y)
{
if(!b)
{
d=a;
x=1;
y=0;
}
else
{
exgcd(b,a%b,d,y,x);
y=y-x*(a/b);
}
}
实用结论:设a,b,c为正整数。若方程ax+by=c的一组解为(x0,y0),那么它的任意整数解可以写成(x0+kb',y0-ka'),其中a'=a/gcd(a,b),b'=b/gcd(a,b),k为任意整数。
证明:若用扩展欧几里德求出了ax+by=gcd(a,b)的一组解(x1,y1),设另外一组解(x2,y2)。则x1*a+y1*b=x2*a+y2*b=gcd(a,b),变形得a(x1-x2)=b(y2-y1)。设g=gcd(a,b),方程两边同时除以g得:a'(x1-x2)=b'(y2-y1),其中a'=a/g,b'=b/g。此时a'与b'互素,则(x1-x2)%b'==0,设x1-x2为kb',则y2-y1=ka',那么y2=y1+kb'。
另外,扩展欧几里德算法的应用还有三条定理:定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使d = a*x+ b*y。
定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。
定理三:若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。
根据定理三,可以在求出一特解的情况下求出方程的最小解x=(x'%(b/d)+b/d)%(b/d),其中x'是一特解。