扩展欧几里德算法(附证明)

原创 2015年10月24日 23:45:49

扩展欧几里德算法(附证明)

tags : acm 数论


完全没接触过数论的渣渣脑抽不想敲代码,便看看数论冷静一下.

扩展欧几里得算法在acm-icpc中是常用算法,主要用于在已知a,b的情况下求解一组x,y,使它们满足贝祖等式: ax+by=gcd(a,b)=d.
顾名思义,该算法是对欧几里得算法的拓展.其代码也是在gcd的基础上做小小的修改.

int exGcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;y=0;
        return a;
    }
    int r=exGcd(b,a%b,x,y);
    int t=x;x=y;y=t-a/b*y;
    return r;
}

证明:

(证明过程参考自百度百科)

原式: ax+by=gcd(a,b)(假设ab)

  • 当b=0时有gcd(a,b)=a,此时x=1,y=0

  • 当b不为0时,根据欧几里得定理gcd(a,b)=gcd(b,amodb)可得ax+by=gcd(a,b)=gcd(b,amodb)=bx+(amodb)y,即

    ax+by=bx+(amodb)y=bx+(aba/b)y

    移项得
    ax+by=bx+(amodb)y=ay+b(xa/by)

    根据恒等定理,有
    {x=yy=xa/by

    这有什么用呢?xy还是不知道呀.
    重新来看看我们得到的两个等式.x和y是gcd(a,b)=ax+by的解,而x’和y’是在对gcd(a,b)按欧几里德算法进行一步后的结果对应的贝祖等式gcd(b,amodb)=bx+(amodb)y的解.也就是说,gcd(a,b)对应的贝祖等式的解x,y可以由gcd(b,amodb)对应等式的解x’,y’计算得出
    由于欧几里德算法最后一步为gcd(d,0)=d,此时对应的等式的解为x=1,y=0,因此只要如上述代码,从gcd(d,0)往前处理,在进行欧几里德算法的递归的时候根据相邻两次调用间x,y和x’,y’的关系计算即可求出ax+by=gcd(a,b)的解.

更进一步,对于任意不定式ax+by=c,只需要在等式ax+by=gcd(a,b)=d两边乘上c/d即可得到解为x=xc/d,y=yc/d

如何得到所有解?
实际上在之前的计算和证明中我们得到的只是不定方程的一组解,那么怎样得到所有解呢?对于一般形式ax+by=c有通解x=p+kb,y=qka(k).(证明略,只要代入一下就知道为什么通解是这个了)

版权声明:本文为博主原创文章,未经博主允许不得转载,未经允许将会考虑法律手段维权。

扩展欧几里德算法详解

扩展欧几里德算法     谁是欧几里德?自己百度去     先介绍什么叫做欧几里德算法     有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b...
  • zhjchengfeng5
  • zhjchengfeng5
  • 2012年07月25日 21:49
  • 57014

扩展欧几里得专题

最近一周都在刷扩展欧几里得、逆元、整除之类的数论专题,颇有心得,决定写一发。虽然说是扩展欧几里得专题,但是其实里面加了几道普通数论题,不想做的可以跳过。因为我是随便找的题目,所以题目的难度不是按照我的...
  • shengtao96
  • shengtao96
  • 2016年04月24日 19:36
  • 1149

扩展欧几里得 模板

1. 扩展欧几里得模板。 2. 求解两个元是整数的方程可以转换为取余消元枚举其中一个数。 3. 复杂度和gcd一样是lgn。 4. gcd(a,b)//a,b可以是任意整数,但是为了保证结果是正的,所...
  • cFarmerReally
  • cFarmerReally
  • 2016年08月04日 22:12
  • 491

扩展欧几里德算法

说实话,数论只会gcd,这样可不行啊,只好补一补了 扩展欧几里德算法,乍听听高端的,很久以前就听说了,不过一回都没写过,现在看了一下,没有想象中的难理解 首先,要清楚扩展欧几里德算法求的是什么 对于形...
  • xym6336
  • xym6336
  • 2015年03月14日 14:33
  • 184

扩展欧几里德(顺带说一下取模)

扩展欧几里德定律:  对于不完全为0的非负整数a,b,gcd(a, b)表示a, b的最大公约数,必定存在整数对x,y,满足a*x+b*y==gcd(a, b)。 证明:(转) a*x1+b*y1...
  • tree__water
  • tree__water
  • 2016年08月03日 23:47
  • 2280

扩展欧几里得入门必看

首先、扩展欧几里得定理:对于两个不全为0的整数a、b,必存在一组解x,y,使得ax+by==gcd(a,b); 实现如下: int gcd(int a,int b) { int t,d; ...
  • YHYYXT
  • YHYYXT
  • 2015年04月21日 23:12
  • 839

扩展欧几里德知识(一)

理解欧几里德,那么扩展欧几里德就能很容易理解了,对任意a,b(a>b),我们列出这样一个式子: a*x+b*y=gcd(a,b); 不要觉得扩展欧几里德很牛逼,它就是一个算x,y的一个方法,...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016年04月09日 00:44
  • 405

原根(扩展欧几里得的应用)

  • 2015年08月12日 00:36
  • 286KB
  • 下载

欧几里得 & 拓展欧几里得算法 讲解 (Euclid & Extend- Euclid Algorithm)

欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。 ——百度百科 代码...
  • ACMore_Xiong
  • ACMore_Xiong
  • 2015年08月16日 02:10
  • 8071

扩展欧几里得算法

题目:POJ1006 Biorhythms #include int a[4]; int m[4]; int M,x,y,gcd; void Extend_Euclid(int a,int b)...
  • ACdreamers
  • ACdreamers
  • 2012年08月29日 14:17
  • 2914
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:扩展欧几里德算法(附证明)
举报原因:
原因补充:

(最多只允许输入30个字)