【The Balance】拓展欧几里得
今天在学数论中的拓展欧几里得,记录一下例题,加深记忆。
首先引入exgcd的概念,是为了解决形如ax+by=gcd(a,b)的不定方程,求解其最小解和通解
具体的算法证明过程我这里就不再阐述,详情请百度,这里给出俩种计算exgcd的方法
void exgcd(int a,int b,int &g,int &x,int &y)//g为gcd(a,b)
{
if(!b){g=a,x=1,y=0;}
else
{
exgcd(b,a%b,g,y,x);y-=x*(a/b);
}
}
int exgcd(int a,int b,int &x,int &y)//返回值为gcd(a,b)
{
if(b==0){
x=1;
y=0;
return a;
}
int q=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return q;
}那么将问题扩大化,假如我们要求解形如ax+by=c的不定方程时呢?
这里给出计算最小解的过程
a/=g,b/=g,d/=g;
int x1=x*d; x1=(x1%b+b)%b;//以x作为基准
int y1=(d-a*x1)/b; y1=abs(y1);//求出一组最小x1+y1
int y2=y*d; y2=(y2%a+a)%a;//以y作为基准
int x2=(d-b*y2)/a; x2=abs(x2);
if(x1+y1<x2+y2) printf("%d %d\n",x1,y1);
else printf("%d %d\n",x2,y2);
查看7道真题和解析
