码迷,mamicode.com
首页 > 编程语言 > 详细

扩展欧几里得算法及实现

时间:2014-12-02 13:36:53      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:c++   数论   欧几里得   扩展欧几里得   算法实现   


欧几里得算法,即辗转相除法,用于求整数a,b的最大公约数。

欧几里得算法C++实现代码:(无需确定 a,b 大小关系)

long long gcd(long long a,long long b){
    return b?gcd(b,a%b):a;
}



扩展欧几里得算法:设a和b不全为0,则存在整数x和y,使得 gcd(a,b) = xa + yb 

证明: 假设 a>b 

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

当 ab!=0时:

设: x1a + y1b = gcd(a,b) 

x2b + y2(a%b) = gcd(b,a%b)

因为 gcd(a,b) == gcd(b,a%b) 

所以 x1a + y1b = x2b + y2(a%b) = x2b + y2(a-a/b*b) =y2a  + x2b - y2(a/b)*b

因此 x1 = y2 , y1 = x2-(a/b)y2

这样就能够基于 x2, y2 求出 x1 , y1 的解。


扩展欧几里得C++实现代码 01:

long long Exgcd(long long a,long long b,long long& x,long long& y){
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    long long d=exgcd(b,a%b,x,y);
    long long tmp=x;
    x=y;
    y=tmp-a/b*y;
    return d;
}

扩展欧几里得C++实现代码 02:

#define ll long long
void Exgcd(ll a,ll b,ll& d,ll& x,ll& y){
    if(!b){ d=a;x=1;y=0;return ;}
    Exgcd(b,a%b,d,y,x);
    y -= a/b*x ;
    return ;
}

扩展欧几里得算法及实现

标签:c++   数论   欧几里得   扩展欧几里得   算法实现   

原文地址:http://blog.csdn.net/u010717079/article/details/41675967

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