首页 > 编程语言 > 详细

扩展欧几里得算法

时间:2016-01-25 19:26:39      阅读:255      评论:0      收藏:0      [点我收藏+]

2016.1.25

(未更新完)

一、欧几里得算法(辗转相除法)

1、用途:快速计算两个数的最大公约数。

2、精髓:gcd(a,b)=gcd(b,a%b)

3、证明:设r=a mod b,则我们要证明的是gcd(a,b)=gcd(b,r)

             设gcd(a,b)=c,则a=mc,b=nc,且m,n互质。那么r=a-kb=(m-kn)c,所以c也是r的因数。

             若gcd(b,r)>c,则设为d,则有b=m1*d,r=n1*d,所以a=(m1+n1)*d,则d为a的因数,所以gcd(a,b)=d,与题设不符。

             所以gcd(a,b)=gcd(b,r)

4、时间复杂度:显然经过两次递归后第一个参数至少减小一半

                      所以时间复杂度粗略为O(log max(a,b))

5、经典例题:线段上各点的个数(oj 0582)

 

二、扩展欧几里得算法:

1、用途:快速求整数x,y使得ax+by=gcd(a,b)

2、精髓代码:

void extgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1;y=0;
        return a;
    }
    else
    {
        extgcd(b,a%b,y,x);
        y-=(a/b)*x; 
    }
}

 

     3、证明:由于b*x1 + (a%b)*y1 = gcd(a,b)

                  a%b = a - (a/b)*b

                  所以gcd(a,b) = b*x1 + (a-(a/b)*b)*y1

                                    = b*x1 + a*y1 – (a/b)*b*y1

                                    = a*y1 + b*(x1 – a/b*y1)

                  对于我们所求的x,y使得ax+by=gcd(a,b)

                  则有  x = y1

                  y = x1 – a/b*y1

                  证毕

 

                  至于终止条件,因为当欧几里得算法终止时a=gcd,b=0,则当x=1,y=0时,必使目标公式成立。

     4、时间复杂度:与欧几里得算法一致

     5、经典例题:双六(oj 0795)

扩展欧几里得算法

原文:http://www.cnblogs.com/16er/p/5158332.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!