模板扩展欧几里得 + 逆元

Posted Dance Of Faith

tags:

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

事实上,我们可以直接在欧几里德算法求解 gcd(a, b) 的过程中,构造一组 ax + by = gcd(a, b) 的解 

这个方法依赖于递归的思想 
边界:b = 0 时, a * 1 + b * 0 = gcd(a, b) 
设我们找到了一组 b * x + (a % b) * y = gcd(a, b) 的解,那么: 
-->  b * x + (a - [a / b] * b]) * y = gcd(a, b)

-->  a * y + b * (x - [a / b] * y) = gcd(a, b) 
令 x’ = y, y’ = (x - [a / b] * y),可以得到: 
ax’ + by’ = gcd(a, b)

LL Exgcd(LL a,LL b,LL &x,LL &y){
    if (b==0){
        x=1; y=0; return a;
    }
    LL G=Exgcd(b,a%b,x,y),tx=x;
    x=y; y=tx-a/b*y;
    return G;
}

 

 

事实上,扩欧可以用来求逆元:

形如 a * x ≡ 1 (mod p) 的式子

可以看成: a * x + p * y ≡ 1 (mod p)

显然,当且仅当 gcd(a, p) = 1 时存在一组解(x, y)满足条件,也就是存在a mod p的逆元。

我们很容易知道 x 就是a mod p 的逆元。

LL GetInv(LL a,LL p){
    LL x,y;
    LL G=Exgcd(a,p,x,y);
    return (x%p+p)%p;
}

 

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

逆元模板

逆元Inv(模板+应用)

[洛谷P3811]模板乘法逆元

欧几里得,扩展欧几里得(模板)

利用扩展的欧几里得算法求逆元

扩展欧几里得模板