码迷,mamicode.com
首页 > 其他好文 > 详细

扩展欧几里得

时间:2018-06-02 19:35:57      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:nbsp   最大公约数   ret   ==   递归   style   最大   return   IV   

首先接触的就是欧几里得求最大公约数(GCD)

1 int gcd(int a, int b){
2     // b < a
3     while(b){
4         int t = a%b;
5         a = b;
6         b = t;
7     }
8     return a;
9 }

递归的写法:

1 int gcd(int a, int b){
2    if(!b) return a;
3    return gcd(b, a%b);
4 }

 

在扩展欧几里得中,设法求 ax + by = gcd(a, b) 中的一组 x 和 y 的解

当 b = 0 的时候, gcd(a, b) = a,此时的 x = 1, y = 0为其中的一组的解

当 b ≠ 0 的时候 , 设 

  ax1 + by1 = gcd(a, b)

又辗转相除法得:

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

设 bx2 + (a%b)y2 = gcd(b, a%b) = gcd(a, b)

所以综合得到一个等式:  ax1 + by1 = bx2 + (a%b)y2  (想得到x1, y1)

又 a%b = a - (a/b)*b ,带入上式中

得  bx2 + [ a - (a/b)*b]y2 = ax1 + by1

   ay2 + bx2 - (a/b)*b*y2 = ax1 + by1

所以在知道x2, y2 之后,便可以推出

  x1 = y2

  y1 = x2 - (a/b)*y2

然后推回去就行了

 1 int ex_gcd(int a, int b, int &x, int &y){
 2     if(b == 0){
 3         x = 1;
 4         y = 0;
 5         return a;
 6     }
 7     int r = ex_gcd(b, a%b, x, y);
 8     int t = x;
 9     x = y;
10     y = t - floor(a/b)*y;
11     return r;
12 }

 

扩展欧几里得

标签:nbsp   最大公约数   ret   ==   递归   style   最大   return   IV   

原文地址:https://www.cnblogs.com/jaydenouyang/p/9126289.html

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