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

拓展欧几里得算法

时间:2014-10-07 14:53:03      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   sp   div   c   log   r   amp   

 1 void gcd(LL a,LL b,LL &d,LL &x,LL &y)
 2 {
 3     if (!b)
 4     {
 5         x=1;
 6         y=0;
 7         d=a;
 8     }
 9     else
10     {
11         gcd(b,a%b,d,y,x); 
12         y-=a/b*x;
13     }
14 }


为了便于理解,如果给出的a<0,一开始就把a=-a,c=-c,这样a,b,c都是正的了。

如果 (c%d!=0) 那么无解。

否则 令k=c/d, a‘=a/d ,   b‘=b/d;

对于函数求出的x,先映射一下 ,x*=k.

然后 x每次 加 b‘, y每次减 a‘ 是不会影响等式成立的。

这样 就可以 求出x的最小整数解。

     if (x<0)
        (x+=abs(x)/b‘ * b‘ + b‘) %= b‘;
     if (x>0)
        x-=x/b‘ * b‘;

拓展欧几里得算法

标签:style   blog   color   sp   div   c   log   r   amp   

原文地址:http://www.cnblogs.com/vb4896/p/4009181.html

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