• [数论] 求逆元


    逆元

    •何为逆元

    方程ax≡1(mod  p),的解称为a关于模p的逆,当gcd(a,p)==1(即a,p互质)时,方程有唯一解,否则无解。

    逆元有对称性,x是a关于b的逆元,那a也是x关于b的逆元。

    线性递推求逆元

    线性求从1到n的$mod p$ 的逆元

    设$p=ki+r (r<i<p,i>1)$  ①

    可以得到

    $k=lfloor frac{p}{i} floor$  ②

    $r=p mod i$  ③

    $ki+requiv 0 (mod p)$  ④

    两边同乘$i^{-1}cdot r^{-1}$得

    $kr^{-1}cdot i^{-1}equiv 0 (mod p)$

    移项得$i^{-1}equiv -kr^{-1} (mod p)$  ⑤

    将②③代入⑤

    得 $i^{-1}equiv -lfloor frac{p}{i} floorcdot (p mod i)^{-1}(mod p)$

    由于$1^{-1}equiv 1 (mod p)$

    所以1到n $mod p$逆元就可以线性递推出来了

    •代码

    1 inv[1]=1;
    2 for(int i=2;i<=n;i++)
    3     inv[i]=-(p/i)*inv[p%i];
    线性求逆元

    扩展欧几里得求逆元

    •先行知识:扩展欧几里得

    exgcd求的是 $ax+by=gcd(a,b)$  的一组解

    1)首先看当b==0,也就是$gcd(a,b)=gcd(a,0)=a$时

    $ax+by=a$

    得$x=1$

    2)我们设

    $ax_{1}+by_{1}=gcd(a,b) $ ①

    $bx_{2}+(a$%$b)y_{2}=gcd(b,a$%$b)$ ②

    由于 $gcd(a,b)=gcd(b,a$%$b)$ 

    所以①②左边相等

    $ax_{1}+by_{1}=bx_{2}+(a$%$b)y_{2}$

    $ax_{1}+by_{1}=(a-lfloor frac{a}{b} floorcdot b)y_{2}$

    $ax_{1}+by_{1}=ay_{2}+(x_{2}-lfloor frac{a}{b} floorcdot y2)b$

     得到

    $x_{1}=y_{2}$

    $y_{1}=x_{2}-lfloor frac{a}{b} floor cdot y_{2}$

    也就是说我们根据x2,y2便可推导出x1,y1的值,只要将a,b换成b,a%b即可,和gcd算法类似这是一个递归的过程

    既然是递归,那我们就要找一个出口,恰好①情况,当b变为0时,我们就可以退出了。

    当a,b互质也就是 $gcd(a,b)=1$时

    $ax+by=gcd(a,b)=1$

    即为$ax=1-by$

    所以$ax (mod b)equiv (1-by)(mod b)equiv1(mod b)$

    所以$axequiv1(mod b)$,x为$a mod b$的逆元

    同理可得y为$b mod a$的逆元

    •代码

     1 ll exgcd(ll a,ll b,ll &x,ll &y)
     2 {
     3     if(b==0)
     4     {
     5         x=1,y=0;
     6         return a;
     7     }
     8     ll r=exgcd(b,a%b,y,x),temp;
     9     y -= (a/b)*x;
    10 
    11     return r;
    12 }
    13 
    14 ll inv(ll a,ll b)
    15 {
    16     ll r=exgcd(a,b,x,y);
    17     while(x<0)
    18         x+=b;
    19     return x;
    20 }
    exgcd求逆元

    费马小定理求逆元

    •先行知识:费马小定理

    假如p是质数,且gcd(a,p)=1,那么 $a^{p-1}≡1(mod p)$,

    即:假如a是整数,p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1。

    费马小定理求逆元的先行条件是p是素数

    $a^{p-1}equiv 1(mod p)$

    即 $acdot a^{p-2}equiv 1(mod p)$

    所以a关于p的逆元就是 $a^{p-2}$

    一般利用快速幂求解

    •代码

     1 ll qpow(ll a,ll b,ll p)
     2 {
     3     ll res=1;
     4     while(b)
     5     {
     6         if(b&1)
     7             res=res*a%p;
     8         a=a*a%p;
     9         b>>=1;
    10     }
    11     return res;
    12 }
    13 ll inv=qpow(a,p-2,p);
    费马小定理求逆元
  • 相关阅读:
    apache mina框架
    架构学习笔记
    接口抽象类
    继承是共用,不是复制
    线程安全的单例模式还需要对成员变量的set get方法设置锁么
    受检查异常要求try catch,new对象时,就会在堆中创建内存空间,创建的空间包括各个成员变量类型所占用的内存空间
    myeclipse 写java代码提示 dead code 原因
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FileUtils
    android内存优化发展——使用软引用
    cocos2dx3.1.1+cocosstudio+lua问题总结
  • 原文地址:https://www.cnblogs.com/MMMinoz/p/11384877.html
Copyright © 2020-2023  润新知