首页 > 其他 > 详细

欧几里德及其拓展和应用

时间:2014-02-27 20:37:48      阅读:433      评论:0      收藏:0      [点我收藏+]

  

欧几里德定理求最大公约数:

Datatype Gcd(Datatype  a, Datatype  b){
         return (b == 0 ? a : Gcd (b, a%b));
}

运用的原理为辗转相除

Gcd(a, b) == Gcd (b, a) == Gcd(-a, b) == Gcd(|a|, |b|)

 

 

拓展欧几里得定理:
求解方程ax + by = Gcd(a, b);

bubuko.com,布布扣
int Gcd_value = 0, x = 0, y = 0; //Gcd_value为a,b的最大公约数

int exGcd(int a, int b, int &Gcd_value, int &x, int &Y){
        if (b == 0){
             x = 1;
             y = 0;
             Gcd_value = a;
        }
        else{
             exGcd(b, a%b, Gcd_value, x, y);
             int temp = x;
             x = y;
             y = tm - y*(a/b);
        }
}
bubuko.com,布布扣

 

证明:

当a != 0且b == 0,Gcd(a, b) = a,则ax + by = a ==> x = 1且y =0;

a*b!= 0时,Gcd(a, b) == Gcd (b, a%b);

则有 ax1 + by1 = Gcd(a, b) = Gcd (b, a%b) = bx2 + (a%b)y2;

将右边变形:b*x2 + (a%b)*y2 = b*x2 + (a –[a/b]*b)*y2 = b*x2 + a*y2 – b*y2*[a/b] = a*y2 + b*(x2 - y2*[a/b]);

则有 ax1 + by1 = a*y2 + b*(x2 - y2*[a/b]) ==> x1 = y2 且 y1 = x2 - y2*[a/b];

 故采用递归的方法直到找到 b==0 时的情况,即 xn = 1 且 yn = 0,然后回溯赋值给xn-1,yn-1,然后继续回溯......直到找到x0,y0 !

欧几里德及其拓展和应用,布布扣,bubuko.com

欧几里德及其拓展和应用

原文:http://www.cnblogs.com/shengshouzhaixing/p/3570358.html

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