欧几里德算法 & 扩展欧几里德算法 & 求解丢番图方程

来源:互联网 发布:怎么看网络直播 编辑:程序博客网 时间:2024/05/23 19:22

欧几里德算法

    即辗转相除法,计算整数A, B最大公约数。

    基本算法:设 a = kb + r,其中a,b,k,r都是整数,则 gcd(a,b) = gcd(b,r),即 gcd(a,b) = gcd(b,a%b) 。

证明:

    a = kb + r;  则r = a%b ;
    设m为 a , b 的一个公约数,则 m|a , m|b,而 r = a - kb; 所以 m|r (注:m整除r,r能被m整除),因此m也是 (b , a%b) 的公约数;
    设m为 b , r 的一个公约数,则 m|b , m|r,而 a = r + kb; 所以 m|a ,因此m也是 (a , b) 的公约数;
    因此 (b , a%b) 与 (a , b) 公约数相同,最大公约数也一定相同,得证。

算法的C语言实现:

int gcd(int a,int b){    if(b==0)        return a;    return gcd(b, a%b);}

扩展欧几里德算法

    基本算法:对于不完全为 0 的非负整数 a,b,必然存在整数对 x,y ,使得 ax + by = gcd(a,b)  。

证明:

    前文得证 gcd(a,b) = gcd(b, a%b) ;
    所以 ax + by = bx1 + a%by1 ;
    化简得 ax + by = ay1 + b(x1 - (a/b)*y1) ;
    得到:x = y1 ; y = b(x1 - (a/b)*y1) ;
    递归的最终停止结果为 a = gcd( a , b) , b = 0 , 此时 x = 1 , y = 0 ;

扩展欧几里德递归代码实现:

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 temp = x;    x = y;    y = temp-a/b*y;    return r;}


扩展欧几里德算法求解丢番图方程

    用扩展欧几里德算法求解丢番图方程 ax + by = c ,  系数 a, b, c 为任意整数。
    丢番图方程有解的充要条件为 c % gcd( a , b ) == 0 。 
    由前一章节可知 ax + by = gcd(a,b) 存在整数解, 因此 c % gcd( a , b ) == 0 为丢番图方程有解的充分条件(为什么是必要条件还不清楚?)
    代码实现的话与扩展欧几里德算法基本相同, 不同的地方就是最后的结果 x和y 要乘上倍数 c / gcd ( a, b) 。
 
    







参考链接http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html

原创粉丝点击