乘法逆元 求解及应用

乘法逆元定义

假设a,x,b为整数,b>1,且有$ax \equiv 1(\mod b)$成立

那么a,x互为膜b的逆元

通俗一些,即两数乘积膜p等于1,则他们互为b的逆元

************************

逆元算法求解

扩展欧几里得

既然已有同余式$ax \equiv 1(\mod b)$

那么我们可以将其转化为$ax+by=1$

可以用扩展欧几里得算法求出其最小非负整数解即为a在膜b意义下的逆元

不会扩展欧几里得算法看这里

扩展欧几里得 推导及应用

void exgcd(int a,int b,int &x,int &y)
{
    if(b==0){x=1;y=0;return a;}
    int gcd=exgcd(b,a%b,x,y);
    int tp=x;
    x=y; y=tp-a/b*y;
    return gcd;
}
int x,y;
exgcd(a,b,x,y);
inv=(x%b+b)%b;

该算法对于b是否为素数无限制

单次逆元的计算效率不错

****************

费马小定理

p 为素数, a为正整数,且a,p互质,则有$a^{p-1}\equiv1(\mod p)$

对于$a^{p-1}\equiv1(\mod p)$

我们变形为$a*a^{p-2}\equiv1(\mod p)$

那么$x=a^{p-2}$%$p$即为我们所要求的逆元

该算法可直接用快速幂计算

复杂度为log级别,效率高

不支持计算p不为素数的情况

***************************************

线性算法

首先有$1^{-1}≡1(\mod p)$

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

再将这个式子放到膜 p意义下得 $ki+r≡0(\mod p)$

两边同时乘上$i^{-1}$,$r^{-1}$得

$kr^{-1}+i^{-1}≡0(\mod p) $

$ i^{-1}≡-kr^{-1}(\mod p) $

$ i^{-1}≡-\lfloor p/i \rfloor*(p \mod i)^{-1}(\mod p)$

于是我们得到一个线性递推算法

inv[1]=1;
for(int i=2;i<=n;++i)
inv[i]=(ll)(p-p/i)*inv[p%i]%p;

该算法复杂度O(n)

适用于需要求解一整组逆元的时候

*******************

逆元应用

对于(a/b)%p这样的式子

显然不适用取膜运算律

所以我们将其改为**(a*inv[b])%p**

好像也没什么其他神奇的用处了= =

原文地址:https://www.cnblogs.com/niiick/p/8971278.html

时间: 2024-08-05 10:47:48

乘法逆元 求解及应用的相关文章

COJ 1163 乘法逆元的求解

乘法逆元就是求一个 a/b = c(mod m)在已知a%m , b%m 的条件下 求c的解 1 #include <cstdio> 2 #include <cstring> 3 4 using namespace std; 5 #define ll long long 6 const int N = 100005; 7 int val[N]; 8 9 ll ex_gcd(ll a , ll b , ll &x , ll &y) 10 { 11 if(b == 0)

数论学习之乘法逆元

用法:用于除法取模 思路:扩欧 要求:b.p互质 设k为b的乘法逆元: 则在求解除法取模问题时: 有(a/b)%p =>(a*k)%p 当b很大时,用除法会出现精度问题..so 乘法逆元: 如果b*k ≡ 1 (mod p) 则称k是b关于p的乘法逆元 我们可以通过求 b 关于 p 的乘法逆元 k,将 a 乘上 k 再模 p,即 (a * k) mod p.其结果与(a / b) mod p等价. 证: 因为 b * k ≡ 1 (mod p) 则有 b * k = p* x+1 得到 k =

HDU1576 A/B(乘法逆元)

这题大概是,整数模9973乘法群?然后存在乘法逆元. 于是题目要求$A \div B \pmod {9973} $其实就相当于求$A \times B^{-1}\pmod {9973} $. 只要求出B的逆元就OK了. 计算模n下的乘法逆元可以用用扩展欧几里得算法求解,即解下面的线性同余方程: $$ Ax \equiv 1 \pmod {n} $$ 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 #de

Light OJ 1067 Combinations (乘法逆元)

Description Given n different objects, you want to take k of them. How many ways to can do it? For example, say there are 4 items; you want to take 2 of them. So, you can do it 6 ways. Take 1, 2 Take 1, 3 Take 1, 4 Take 2, 3 Take 2, 4 Take 3, 4 Input

求乘法逆元的几种方法

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

2016&quot;百度之星&quot; - 资格赛(Astar Round1)-(模拟+线段树+乘法逆元)

Problem A Accepts: 1351 Submissions: 9951 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串.现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值.一个字符串的哈希值,由以下公式计算得到: H

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

深入浅出乘法逆元

1.模的运算律 2.定义 3.求解 3.1费马小定理 3.2扩展欧几里得算法 3.3线性求解 深入浅出乘法逆元 模的运算律 先来一波模运算律表: 运算律 内容 交换律 \((a+b)\%p=(b+a)\%p\)\((a\times b)\%p=(b\times a)\%p\) 结合律 \(((a+b)\%p+c)\%p=(a+(b+c)\%p)\%p\)\(((a\times b)\%p\times c)\%p=(a\times (b\times c)\%p)\%p\) 分配率 \(((a+b)

关于乘法逆元的世界

引子 经过几天的努力,终于将逆元这个大难题给攻克了--心情激动的一时无法平复.下面就简单介绍一下关于逆元的知识,来记录自己的成果,也希望能够帮助到别人.某些地方可能理解的不够深入,还请多多包涵. 定义 逆元,又称数论倒数,如果a*x≡1 (mod p),且gcd(a,p)=1(a与p互质),则称a关于模p的乘法逆元为x.(来自维基百科) 怎么说呢,逆元其实就是一个相当于倒数的东西,只不过是多模了一个p而已.要说它有什么用,那么请回忆一下倒数有什么用吧.没错,在上小学时,老师就教导过我们,除以一个