扩展欧几里得算法与乘法逆元

· · 个人记录

Part 1:前置知识

Part 2:扩展欧几里得算法

1、求 ax+by=\gcd(a,b) 的一组特解

#define LL long long
LL exgcd(LL a,LL b,LL &x,LL &y)
{
    if(b==0)
    {
        x=1;  y=0;  
        return a;
    }

    LL d=exgcd(b,a%b,x,y);
    LL tmp=x;
    x=y;  y=tmp-(a/b)*y;

    return d;
}

2.求 ax+by=\gcd(a,b) 的通解

3.求 ax+by=c 的解

Part 3:乘法逆元

1. 定义

2.扩展欧几里得算法求逆元

void exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;  y=0;
        return;
    }

    exgcd(b,a%b,x,y);
    int tmp=x;
    x=y;  y=tmp-(a/b)*y;
    return;
}

int main()
{
    scanf("%d%d",&n,&m); //n为逆元表达式中的a

    int x=0,y=0;
    exgcd(n,m,x,y);
    x=(x%m+m)%m;

    printf("%d\n",x);

    return 0;
}

3.费马小定理求逆元

4.线性递推求逆元