扩展欧几里得的一些心得

Posted Storm_Spirit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩展欧几里得的一些心得相关的知识,希望对你有一定的参考价值。

  最近发现扩展欧几里得的使用过程中有一些要注意的地方。

  1.ax+by=c,这个式子中,如果b是负数,那么把它当作正数来算也无妨,因为只要给y乘一个(-1)就可以了。当然a也是同理。

  2.如果解出来的x是一个负数,那么怎么变成正数呢?

    方法如下:

    得出来的解是ax+by=gcd(a,b)的解,令g=gcd(a,b),那么两边同时乘以(c/g)可以得到(ac/g)*x+(b/g)*(y*c)=c。

    先对ax+by=c考虑,我们可以转化成a(x+b)+b(y-a)=c。因此x可以是在原数字的基础上加减若干个b(即y前面的系数)。那么我们对上一行的x就可  以进行这样的操作,x=(x%mod+mod)%mod,其中mod等于y前面的系数,即b/g,这样mod小了,x才会成为最小的正整数。(虽然这里有点小疑问,  但是做了几题都可以用这样的方法那就这样子吧。。)

    推荐题目是:POJ 2115和HDU 5114。

  

  顺便,,扩展欧几里得的模板如下:

 

1 void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y)
2 {
3     if(!b) {d=a;x=1;y=0;}
4     else
5     {
6         ex_gcd(b,a%b,d,y,x);
7         y -= x*(a/b);
8     }
9 }

 

以上是关于扩展欧几里得的一些心得的主要内容,如果未能解决你的问题,请参考以下文章

欧几里得算法和扩展欧几里得算法

RSA:使用扩展欧几里得算法的私钥计算

扩展欧几里得

扩展欧几里得算法

POJ 1061 青蛙的约会 扩展欧几里得

数论 逆元求解(扩展欧几里得算法+费马小定理)