【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);
全部评论

相关推荐

喜欢飞来飞去的雪碧在刷代码:可以试一试字节
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务