【科技】扩展欧几里得 + 逆元

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

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

-->  $a * y + b * (x - \lfloor a / b \rfloor * y) = (a, b)$ 
令 $x’ = y$, $y’ = (x - \lfloor a / b \rfloor * y)$,可以得到: 
$a * x’ + b * y’ = (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 \equiv 1 (mod \; p)$ 的式子

可以看成: $a * x + p * y \equiv 1 (mod \; p)$

显然,当且仅当 $(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;
}

 

posted @ 2017-11-03 19:08  Dance_Of_Faith  阅读(178)  评论(0编辑  收藏  举报