乘法逆元的求法(5种)

若a*b≡1(mod p)

即a,b互为mod p意义下的逆元

即(x/a)%p应为x*b%p

一、扩展欧几里得求逆元

根据a*b+p*k=1

板子O(logN):

 1 #include<bits/stdc++.h>
 2 typedef long long ll;
 3 ll exgcd(ll a,ll b,ll &x,ll &y) {
 4     if(!b) {
 5         x=1,y=0;
 6         return a;
 7     }
 8     ll res=exgcd(b,a%b,y,x);
 9     y-=a/b*x;       ///x=x1,y=x1-a/b*y1   x1,y1代表下一状态
10     return res;
11 }
12 int main()
13 {
14     ll a,p,x,y;  ///扩展欧几里得计算a的逆元(mod p)
15     scanf("%lld%lld",&a,&p);
16     ll d=exgcd(a,p,x,y);
17     printf(d==1?"%lld":"-1",(x+p)%p);///最大公约数不为1,逆元不存在,输出-1
18     return 0;
19 }

二、费马小定理求逆元(p为素数)

p为素数,则有$a^{p-1}=1(mod p)$

则$a^{p-2}*a=1(mod p)$

即$a^{p-2}$为a mod p意义下的逆元

板子O(logp):

 1 #include<bits/stdc++.h>
 2 typedef long long ll;
 3 ll quickpowmod(ll a,ll b,ll mod) {
 4     ll ans=1;
 5     while(b) {
 6         if(b&1) ans=(ans*a)%mod;
 7         b>>=1;
 8         a=(a*a)%mod;
 9     }
10     return ans;
11 }
12 int main()
13 {
14     ll a,p;  ///费马小定理计算a的逆元(mod p)
15     scanf("%lld%lld",&a,&p);
16     ll inva=quickpowmod(a,p-2,p);
17     printf("%lld",inva);
18     return 0;
19 }

三、欧拉定理求逆元(a,p互素)

a,p互素,则有$a^{\varphi (p) }=1(mod p)$

则$a^{\varphi (p) -1}*a=1(mod p)$

即$a^{\varphi (p) -1}$为a mod p意义下的逆元

板子(logp):

 1 #include<bits/stdc++.h>
 2 typedef long long ll;
 3 ll get_euler(ll x) {
 4     ll ans=x;
 5     for(ll i=2;i*i<=x;i++)
 6         if(x%i==0) {
 7             ans=ans/i*(i-1);
 8             while(ans%i==0) ans/=i;
 9         }
10     if(ans>1) ans=ans/x*(x-1);
11     return ans;
12 }
13 ll quickpowmod(ll a,ll b,ll mod) {
14     ll ans=1;
15     while(b) {
16         if(b&1) ans=(ans*a)%mod;
17         b>>=1;
18         a=a*a%mod;
19     }
20     return ans;
21 }
22 int main()
23 {
24     ll a,p,x,y;
25     scanf("%lld%lld",&a,&p);    ///a与p互素
26     ll inva=quickpowmod(a,get_euler(p)-1,p);
27     printf("%lld",inva);
28     return 0;
29 }

四、递推求逆元

设p是模数,i是待求的逆元,我们求的是$i^{-1}$在mod p意义下的值

$p=k * i + r $,令 r < i,则k=p/i,r=p%i

$k * i + r ≡0 (mod p)$

$k * r^{-1} + i^{-1} ≡0 (mod p)$

$ i^{-1} ≡ - k * r^{-1} (mod p)$

$ i^{-1} ≡ - \frac {p} {i} * inv( p mod i )  (mod p) $

1 LL inv[mod+5];
2 void getInv(LL mod)
3 {
4     inv[1]=1;
5     for(int i=2;i<mod;i++)
6         inv[i]=(mod-mod/i)*inv[mod%i]%mod;
7 }

  • 适用范围:mod数是不大的素数而且多次调用,比如卢卡斯定理。

五、递归求逆元

1 LL get_inv(int i) {
2     if(i==1) return 1;
3     return (mod-mod/i)*(inv[mod%i])%mod;
4 }

参考博客:https://blog.csdn.net/xiaoming_p/article/details/79644386

原文地址:https://www.cnblogs.com/wuliking/p/11247707.html

时间: 2024-10-11 14:55:29

乘法逆元的求法(5种)的相关文章

乘法逆元及求法

在开始之前我们先介绍3个定理: 1.乘法逆元(在维基百科中也叫倒数,当然是 mod p后的,其实就是倒数不是吗?): 如果ax≡1 (mod p),且gcd(a,p)=1(a与p互质),则称a关于模p的乘法逆元为x. 2.费马小定理(定义来自维基百科): 假如a是一个整数,p是一个质数,那么是p的倍数,可以表示为 如果a不是p的倍数,这个定理也可以写成 3. 扩展欧几里得 (定义来自维基百科): 已知整数a.b,扩展欧几里得算法可以在求得a.b的最大公约数的同时,能找到整数x.y(其中一个很可能

乘法逆元及其应用

满足 a * k ≡ 1 (mod p) 的k 叫做 a关于p的乘法逆元.另一种表达方法是 k ≡ a-1 (mod p) 逆元在密码学中有广泛应用,AES密码体系的字节替代就是运用了逆元.(不知道说的smg) 应用: 我们知道(a+b)%p=(a%p+b%p)%p (a*b)%p=(a%p)*(b%p)%p 而求(a/b)%p时,可能会因为a是一个很大的数,不能直接算出来,却又不能(a/b)%p=(a%p/b%p)%p. 但是可以通过 k ≡ b-1 (mod p)  a / b = a *

乘法逆元

定义:当(a,p)=1时,存在ax≡1(mod p),则x叫作a在模p意义下的乘法逆元. 求法: 1.当p为质数时,由费马小定理,得ap-1≡1(mod p),即(a·ap-2)≡1(mod p),则a在模p意义下的乘法逆元是ap-2,直接用快速幂可求得. 2.当p不为质数时,用扩展欧几里得算法求a的逆元. 代码: 1 int exgcd(int a,int b,int &x, int &y) 2 { 3 int d=a; 4 if(b!=0){ 5 d=exgcd(b,a%b,y,x);

浅谈模质数意义下的乘法逆元

原文链接(更好的阅读体验) 参考文章www.luogu.org/blog/zyxxs/post-xiao-yi-jiang-tan-qian-tan-sheng-fa-ni-yuan 什么是乘法逆元 若整数\(b,m\)互质,并且\(b|a\),若存在一个整数\(x\),使得\(a / b \equiv a \ast x (mod \text{ } m)\),称\(x\)为 \(b\)的模\(m\)乘法逆元. 乘法逆元的用处 有时候,我们需要求\(a/b \text{ } mod \text{

HDU 1576 -- A/B (总结乘法逆元的几种求法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7264    Accepted Submission(s): 5774 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%99

求乘法逆元的几种方法

(数学渣,下面的文字可能有误,欢迎指教)乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减乘与模运算的顺序交换不会影响结果,但是除法不行.有的题目要求结果mod一个大质数,如果原本的结果中有除法,比如除以a,那就可以乘以a的逆元替代. 在mod p的运算中,a存在乘法逆元当且仅当a与p互质.一般题目给的是一个大质数,所以只要a不是p的倍数,就以求乘法逆元. 目前了解到的求法有三种:1.扩展

乘法逆元求法

原创建时间:2018-08-05 08:24:19 数论中的重要内容 注意:本文只讨论模数为质数的情况,因为当模数为合数时,不一定所有数都有逆元 定义 在\(\bmod\ p\)的意义下,我们把\(x\)的乘法逆元写作\(x^{-1}\).乘法逆元有这样一条性质: \[x \times x^{-1} \equiv 1\ (\bmod\ p)\] 乘法逆元有什么用呢? 模意义下的除法运算! 除法运算对于模运算来说并不是「封闭」的,所以我们可以把除法转化成乘法 费马小定理求法 前置知识:「快速幂」

Codeforces 543D Road Improvement(树形DP+乘法逆元)

题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和HDU2196是一种类型的树形DP,因为它们都要分别求各个点的答案.然后解法也不难想: dp0[u]表示只考虑以u结点为根的子树的方案数 dp1[u]表示u结点往上走,倒过来,以它父亲为根那部分的方案数 有了这两部分的结果,对于各个点u的答案就是dp0[u]*(dp1[u]+1).这两部分求法如下,画

BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的染色方案视为等价的,求等价类计数. 分析 给出置换求等价类计数,用Burnside引理:等价类计数=(每一个置换不动点的和)/置换数.(不知道的建议去看白书) 其中不动点是指一个染色方案经过置换以后染色与之前完全相同. 1.求不动点个数. 不动点的话同一个循环内的每一个点的颜色必须相同(否则不同颜色