zoukankan      html  css  js  c++  java
  • 【科技】扩展欧几里得 + 逆元

    事实上,我们可以直接在欧几里德算法求解 $(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 floor * b) * y = (a, b)$

    -->  $a * y + b * (x - lfloor a / b floor * y) = (a, b)$ 
    令 $x’ = y$, $y’ = (x - lfloor a / b floor * 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;
    }
  • 相关阅读:
    LAMP课程(3)
    LAMP课程
    vim文本编辑
    mysql常用语句
    mysql双机互相备份
    Java NIO
    适配器模式
    对象的序列化与反序列化
    字符流
    Java Socket
  • 原文地址:https://www.cnblogs.com/Dance-Of-Faith/p/7779837.html
Copyright © 2011-2022 走看看