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

扩展欧几里德

时间:2016-05-04 22:26:10      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

扩展欧几里德算法

  要是 a*x + b*y = gcd(a,b) ,则一定存在整数对(x0 , y0)使其有解

  则 x = x0 + (b/gcd)*t , y = y0 - (a/gcd)*t 是不定方程的通解

  因为 a*x + b*y = gcd(a , b);

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

  所以 b*x1 + (a % b)*y1 = gcd (此时a = b , b = a % b)
  gcd = b*x1 + (a - (a/b) * b) * y1;
  = b*x1 + a*y1 - (a/b) * b * y1;
  = a*y1 + b*(x1 - a/b*y1);

  x = y1;
  y = x1 - a/b * y1;

  依次类推
  当 b = 0 时
  a = gcd;

  定理1 gcd(a,b)是ax+by的线性组合的最小正整数,x,y∈z;

  定理2 如果ax+by=c,x,y∈z;则c%gcd==0;

  定理3 如果a,b是互质的正整数,c是整数,且方程
  ax+by=c

代码如下:

 1 int exgcd(int a , int b , int &x , int &y) {
 2     int res = a;
 3     if(!b) {
 4         x = 1 , y = 0;
 5     }
 6     else {
 7         res = exgcd(b , a % b , x , y);
 8         int temp = x;
 9         x = y;
10         y = temp - a / b * y;
11     }
12     return res;
13 }

 

扩展欧几里德

标签:

原文地址:http://www.cnblogs.com/Recoder/p/5459812.html

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