乘法逆元是数论中重要的内容,也是 ACM 中常用到的数论算法之一。所以,如何高效的求出乘法逆元是一个值得研究的问题。

这里我们只讨论当模数为素数的情况,因为如果模数不为素数,则不一定每个数都有逆元。

定义

在  mod p的意义下我们把 xx 的乘法逆元写作 x ^ {-1}x​−1​​。
乘法逆元有如下的性质:

乘法逆元的一大应用是模意义下的除法,除法在模意义下并不是封闭的,但我们可以根据上述公式,将其转化为乘法。

费马小定理

要求 pp 为素数。

上述公式可变形为

由乘法逆元的定义,a ^ {p - 2}a​p−2​​ 即为 aa 的乘法逆元。

使用快速幂计算 a ^ {p - 2}a​p−2​​,总时间复杂度为 O(\log a)O(loga)。

代码

inline int pow(const int n, const int k) {long long ans = 1;for (long long num = n, t = k; t; num = num * num % MOD, t >>= 1) if (t & 1) ans = ans * num % MOD;return ans;
}
inline int inv(const int num) {return pow(num, MOD - 2);
}

扩展欧几里得

扩展欧几里得(EXGCD)算法可以在 O(\log \max(a, b))O(logmax(a,b)) 的时间内求出关于 xx、yy 的方程

的一组整数解

当 bb 为素数时,\gcd(a, b) = 1gcd(a,b)=1,此时有

时间复杂度为 O(\log a)O(loga)。

代码

void exgcd(const int a, const int b, int &g, int &x, int &y) {if (!b) g = a, x = 1, y = 0;else exgcd(b, a % b, g, y, x), y -= x * (a / b);
}
inline int inv(const int num) {int g, x, y;exgcd(num, MOD, g, x, y);return ((x % MOD) + MOD) % MOD;
}

递推法

代码

inv[1] = 1;
for (int i = 2; i <= MAXN; i++) inv[i] = ((-(MOD / i) * inv[MOD % i]) % MOD + MOD) % MOD;

下面是ACdreamers关于递推求解逆元的推导过程(个人觉得他的更好)

其实有些题需要用到的所有逆元,这里为奇质数。那么如果用快速幂求时间复杂度为

如果对于一个1000000级别的素数,这样做的时间复杂度是很高了。实际上有的算法,有一个递推式如下

它的推导过程如下,设,那么

对上式两边同时除,进一步得到

再把替换掉,最终得到

初始化,这样就可以通过递推法求出模奇素数的所有逆元了。

另外的所有逆元值对应中所有的数,比如,那么对应的逆元是

乘法逆元的几种计算方法相关推荐

  1. 求乘法逆元的几种方法

    (数学渣,下面的文字可能有误,欢迎指教) 乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减 ...

  2. 乘法逆元的三种求解方法

    目录 乘法逆元小结 逆元的定义 求解逆元的方法 1. 快速幂 测试代码 2.拓展欧几里得 测试代码 3.线性算法 例题 AC代码 乘法逆元小结 参考自:点击此处 乘法逆元,一般用于求(a / b)(m ...

  3. java求乘法逆元的代码_求乘法逆元的几种方法

    (数学渣,下面的文字可能有误,欢迎指教) 乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减 ...

  4. 乘法逆元总结 3种基本方法

    逆元 逆元(inverse element)是在取模意义下,不能直接除以一个数,而要乘以它的逆元:a*b ≡\equiv≡ 1 (mod p) , 那么a和b互为模p意义下的逆元,比如要计算(x/a) ...

  5. 计蒜客 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B coin(求乘法逆元)

    Bob has a not even coin, every time he tosses the coin, the probability that the coin's front face u ...

  6. 乘法逆元3种方法总结[最全]

    建议大家可以先去看看这篇博文 (https://www.cnblogs.com/dupengcheng/p/5487362.html) 乘法逆元:ax≡1 (mod p) 这个等式用中文描述就是 a乘 ...

  7. zoj-3624(Count Path Pair)组合数+乘法逆元

    题意:给你4个点A(0,0),B(p,0),C(m,q),D(m,n)问:A-->D&& B-->C在不相交的情况下有多少种方法 此题在比赛中题目理解错了,英语水平还是太弱 ...

  8. 逆元~(乘法逆元及其应用)

    数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 先来引入求余概念 (a +  b) % p = (a%p +  b%p) %p  (对) (a  -  b) % p = (a%p  -  b ...

  9. 数论练习1 ( 曹冲养猪 + [POJ 2891]Strange Way to Express Integers + 乘法逆元【带证明】)

    虽然作业还没有做完,但是我还是放不下它,对此,我只想说: 今天你对作业爱理不理,明天它就让你补到飞起 DP先放放,我们要雨露均沾 练习上手:乘法逆元 题目 题解 代码实现 曹冲养猪?(互质的中国剩余定 ...

最新文章

  1. 使用plsql连接远程oracle数据库配置
  2. centos普通用户设置sudo权限
  3. 迭代最近点(Iterative Closest Point, ICP)算法及matlab实现
  4. Python3 文件操作
  5. Oracle中joint,oracle support
  6. 使用expdp导出时评估所需存储容量大小
  7. 学习Python第二天
  8. 单一工作流的执行➕回滚框架初步想法(基于事件驱动模式)
  9. ArrayList 和LinkedList
  10. 庆祝我的第一个WebGis完成-c#+MapXtreme2004
  11. js时间戳转化成日期格式
  12. 平衡树(模板+文艺平衡树)
  13. 【Keil5】关于keli5使用ST-link下载的配置方法
  14. 论文写作之WPS安装Mathtype插件编写数学公式
  15. 【java】汽车租赁系统_结课作业
  16. SQLServer用COMPUTE 和 COMPUTE BY 汇总数据
  17. win7计算机序列号怎么查,怎么查看win7序列号
  18. 【​观察】一部《天龙八部》,缘起“六脉神剑”
  19. 强力数据恢复精灵 v1.9.0
  20. 亮紫色晶体meso四(4-氨基苯基)卟啉TAPP/TAPPPt/TAPPCo/TAPPCd/TAPPZn/TAPPPd/TAPPCu/TAPPNi/TAPPFe/TAPPMn金属配合物-齐岳供应

热门文章

  1. bootstrap fileinput上传组件和form表单一起提交
  2. 使用hibernate4出现HHH000424
  3. 有序列表、无序列表、定义列表
  4. NoSuchMethodException: init [class android.content.Context, interface android.util.AttributeSet...
  5. 解释型语言-shell
  6. 数据分析——因子模型聚类分析
  7. 腾讯优图开源深度学习框架ncnn,主打手机端,同类cpu框架最快
  8. ActionContext介绍
  9. 满屋研选获1亿元B轮融资,华创资本领投,五岳资本、金地集团、治平资本等跟投... 1
  10. c和java共同点_java和c语言有什么共同点?