zoukankan      html  css  js  c++  java
  • 你了解逆元吗?

    逆元是在数论中广为应用的东西
    下面一起来了解一下逆元的定义与求法吧

    定义

    对于一个数(a),存在一个数(x)使得(ax equiv1 mod m)
    则称(x和a互为模m的逆元)
    这个的意义在于:(举个栗子)
    已知(16a)%(9)的结果,计算((16a/4))%(9)(感性理解下)
    若直接用(16a)%(9/4)的话结果为(7a)%(9+4)
    但是结果应为(4a)%(9)
    (a)%(9=x)
    (7a)%(9+4equiv 7x+4)
    (4a)%(9equiv 4a)
    (7x+4-4x=3x+4),其不一定为(9)的倍数

    所以在取模意义下的除法非常可能发生错误,而乘法完全不会
    还记得小学时学除法时(adiv x=a imes frac{1}{x})
    则我们可以推知
    ((adiv x)mod m)
    =(a imes x^{-1}mod m)
    =(amod m imes x^{-1}mod m)
    这就是逆元出现的巨大价值

    实现

    有一个叫做费马小定理的东西
    它是指:当(a,pin Z^+且gcd(a,p)=1)
    (a^{p-1}equiv 1 mod p)
    所以(a imes a^{p-2}equiv 1mod p)
    (a^{p-2})为a模p的逆元
    然后对于它直接用快速幂就可以了
    代码就不放了

    还记得拓展欧几里得定理吗?(不记得||没学过的戳这里)
    它可以求解(ax+by=gcd(a,b))的解
    (a=a,b=p)
    问题变为了(ax+bp=gcd(a,p)=1)
    ((ax+bp)equiv p=axequiv p=1)
    则此时(x)的特解满足(xin[0,p))即为(a)(p)的逆元了
    (这还是比较简单的(if)你会拓欧)

    当然需要(1)(n)模同一个数的逆元时
    可以使用一种线性的方法求解
    (p=a imes i+b,)(ai+bequiv 0mod p)
    两边同乘(i^{-1} imes b^{-1}:)
    (ab^{-1}+i^{-1}equiv 0mod p)
    (i^{-1}equiv -a imes b^{-1}mod p)
    (a=[p/i],b=p)%(i)
    (i^{-1}equiv -[p/i] imes (p)%(i)^{-1}mod p)
    我们已经在前面的运算中算完了(1→i-1)的逆元
    所以(1-n)的逆元就可以线性求完了

    结语

    逆元广泛地运用在取模运算中
    非常非常多的数论题都会牵扯到逆元
    所以,加油掌握它,未来的就好解决了

    Reality&Imagine
  • 相关阅读:
    使用Wireshark 抓取数据包
    React Native 开发之 (07) 常用组件-View
    Swift开发之 (01) 语法
    React Native 开发之 (05) flexbox布局
    React Native 开发之 (06) JSX
    深入浅出Redis02 使用Redis数据库(String类型)
    React Native 开发之 (04) 例子讲解
    npm命令大全
    npm
    node.js
  • 原文地址:https://www.cnblogs.com/yang-RA-NOI/p/13445308.html
Copyright © 2011-2022 走看看