码迷,mamicode.com
首页 > 其他好文 > 详细

扩展欧几里得

时间:2016-04-17 11:37:25      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

  扩展欧几里得挺早就会了,但是当时不会证明,现在可以自己推导出来了,下面说一下推导过程。

  首先给你a,b,让你求出一组x,y,满足ax+by=gcd(a,b).这个gcd是很轻松可以得到的,但是x和y呢?其实我们也可以在求gcd的时候顺便得到一组解。

  先看看我们是怎么求gcd的:ans=gcd(b,a%b),那么最后一步终止条件是什么呢?是b=0,从这里我们可以发现此时,gcd*x+0*y=gcd,这个时候我们可以看出x和y分别是1和0时肯定满足条件。此时我们就得到了终止条件时候的x和y的值了。但是,每一次相邻的x和y有没有什么关系呢?答案是有的,我们令c=gcd(a,b), ax1+by1=c, 那么下一步就有ax2+(a%b)y2=c, 我们对这一步的公式进行变形。首先可以发现a%b=a-(a/b)*b, 我们带入就得到ax2+(a-(a/b)*b)y2=c, 移项合并后就有ay2+b[x2-(a/b)*y2]=c, 因此,我们发现其实x1=y2,y1=x2-(a/b)*y2, 依靠这种关系,我们就可以得到一组解了。

int e_gcd(long long a,long long b,long long &x,long long &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    long long ans=e_gcd(b,a%b,x,y);
    long long temp=x;
    x=y;
    y=temp-(a/b)*y;
    return ans;
}

  当然,我们还要知道怎么得到所有解。这个很容易就可以推导,我直接给出公式: 令A=a/gcd(a,b), B=b/gcd(a,b), 一组解为x0,y0, 则所有解为x=x0+B*t, y=y0-A*t, t为任意整数。

扩展欧几里得

标签:

原文地址:http://www.cnblogs.com/cons/p/5400541.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!