您的位置:首页 > 其它

拓展欧几里得 总结

2016-09-19 13:11 183 查看
拓展欧几里得

1、         a*x+b*y=c,如果c是gcd(a,b)的倍数方程才有解;否则就求不出x,y(整数);当然这组解不是唯一的;是多个的。

2、         对于拓展欧几里得的模板还是要记住的,所求出的值有3个,r,x0,y0(当然这些都是用地址传递的,看模板),r=gcd(a,b),x0,y0是多个解中的其中一个解。

3、         我们需要求的值c大多数都不会是r;那该怎么办呢?  注意 a*x+b*y=c(设 r*k=c)

a*(x/k)+b*(y/k)=r; 其实我们用模板求出的x0=x/k,y0=y/k;其实x,y的所有解都可以表示成x=x1+k*b1, y=y1+k*a1;(不要问我为什么这是前人说的)b1=b/r , a1=a/r ; x1, y1其实就是最优解

y1=(y0*c/ r)%(a/r) ; x1=(x0*c/r)%(b/r);

4、         你们可能会对于 a/r ,b/r 这一点不懂,其实为了让大家容易理解,我是故意先这样说的,其实因为它的第二个和第三个定理导致的。

定理二:若gcd(a, b) = 1,则方程ax≡ c (mod b)在[0,
b-1]上有唯一解。

定理三:若gcd(a, b) = d,则方程ax≡ c (mod b)在[0,
b/d - 1]上有唯一解。

大家现在懂了吧!好下面就要进一步深入了解了,这里求得的x1, y1
可能是不满足条件的如果需要求出x1的最优正解,我们求出的却是负值,呵呵,那就肯定错,那么就需要变换一下,其实是有个公式的,需要最小正解的公式     

x1=(x1+L)%L (L=b/r); y1也是类似

最小绝对值负解 x1=(x1-L)%L;y1也是类似(L=a/r)

想要知道的小粉们请继续往下看:@_@ 
还记得sinx,cosx函数吗?如果给出一个值-1<a<1的话你是能过求出无数个解的,这个函数就可以用这个思想,对于最小的正解肯定是唯一的用y1=(y0*(k-1))%L(L=a/r,k=c/r);这样就求出最小的正解

当然负值就不用我说了吧!

 拓展欧几里得模板

LL 代表__int64

void exgcd(LL a,LL b,LL &r,LL &x1,LL&y1)//拓展欧几里得模板记住

{

      if(b==0)

      {

           r=a;

           x=1;

           y=0;

      }

      else

      {

           exgcd(b,a%b,r,y,x);

           y-=x*(a/b);

      }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: