扩展欧几里得各类问题模板

  扩展欧几里得各类问题模板

  昨天看了一下扩展欧几里得,今天找了几个模板


1.欧几里得(最大公约数,最小公倍数)

int gcd(int a,int b)
{
    if((b==0)   return a;
    else   gcd(b,a%b);       
}


2.扩展欧几里得求最小整数解

给出 a*x+b*y=c

int e_gcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    int ans,tep;
    ans=gcd(b,a%b,x,y);
    tep=x;
    x=y;
    y=tep-a/b*y;
}

这是求的 a*x+b*y=gcd(a,b)   如果 c%gcd(a,b)==0  ,就说明有解,

最小整数解为 b=b/gcd(a,b)   x=x*(c/gcd(a,b))   x=(x%b+b)%b


3.最小乘法逆元

感觉和最小整数解差不多,就是最后  a*x + m*y = 1

什么是乘法逆元 

例如:4关于1模7的乘法逆元为多少?
4X≡1 mod 7
这个方程等价于求一个X和K,满足
4X=7K+1
其中X和K都是整数。
若ax≡1 mod f, 则称a关于模f的乘法逆元为x。也可表示为ax≡1(mod f)。
int cal(int a,int m)
{
    int x,y;
    int gcd=e_gcd(a,m,x,y);
    if(1%gcd!=0) return -1;
    x*=1/gcd;
    m=abs(m);
    int ans=x%m;
    if(ans<=0) ans+=m;
    return ans;
}





   

发布了74 篇原创文章 · 获赞 48 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章