ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

乘法逆元

2021-11-30 22:00:24  阅读:178  来源: 互联网

标签:pmod dfrac ll times 逆元 乘法 equiv


逆元

定义:若 \(ax\equiv 1\pmod b\) 且 \(a\) 与 \(b\) 互质,那么我们就能定义 \(x\) 为 \(a\) 的逆元,记为 \(a^{-1}\) ,所以我们也能称 \(x\) 为 \(a\) 在 \(\pmod b\) 意义下的倒数,此时我们对于 \(\dfrac{a}{b}~\pmod p\),我们就可以求出 \(b\) 在 \(\pmod p\) 意义下的逆元,来代替 \(\dfrac{1}{b}\)

快速幂

由费马小定理:若 \(p\) 为素数,\(a\) 为正整数,且 \(a\) 、\(p\) 互质。则有 \(a^{p-1}\equiv 1\pmod p\)

所以

\[\dfrac{a}{b}=a\times b^{-1}\equiv a\times b^{p-2} \pmod p \]

所以我们用快速幂算出来 \(a\times b^{p-2}\) 就有 \(\dfrac{a}{b}\) 的逆元的值了

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
int mod;
ll power(ll k,ll p){
	ll ans=1;
	while(p){
		if(p&1) ans=ans*k%mod;
		k=k*k%mod;
		p>>=1;
	}
	return ans;
}
ll a,b;
int main(){
	scanf("%lld%lld",&a,&mod);//算a的逆元
	printf("%lld",a*power(b,mod-2)%mod);
	return 0;
}

拓展欧几里得

求解 \(ax\equiv c \pmod b\) 中 \(c=1\) 的情况。我们可以转化为求解 \(ax+by=1\) 的解

所以:

ll exgcd(ll a,ll b,ll &x,ll &y){
	if(!b){
		x=1;y=0;
		return a;
	}
	else{
		ll tx,ty;
		ll d=exgcd(b,a%b,tx,ty);
		x=ty;y=tx-(a/b)*ty;
		return d;
	}
}
int a,p,x,y;
int main(){
    scanf("%d%d",&a,&p);
    int d=exgcd(a,p,x,y);
    x=(x%p+p)%p;
}

线性求逆元

首先,我们设 \(p=kx+r\)

那么我们很容易发现:\(kx+r\equiv 0\pmod p\)

此时,我们左右同时乘上 \(k^{-1}r^{-1}\) 可得

\(kr^{-1}+x^{-1}\equiv 0\pmod p\)

\(\therefore x^{-1}\equiv -kr^{-1}\pmod p\)

把 \(k=\left\lfloor \dfrac{p}{x} \right\rfloor\) \(r=p \bmod x\) 代入,得

\(x^{-1}\equiv -\left\lfloor \dfrac{p}{k} \right\rfloor \times (p \bmod k)^{-1} \pmod p\)

阶乘求逆元

首先,有如下的一个关系:

\(inv_{i+1}=\dfrac{1}{(i+1)!}\)

\(inv_{i+1}*(i+1)=\dfrac{1}{i!}\times \dfrac{1}{n+1}\times (n+1)=\dfrac{1}{i!}\)

所以我们可以先求出 \(n\) 的逆元,然后逆推即可

同时,我们也可以发现 \(\dfrac{1}{i}\) 的逆元就是:\(\dfrac{1}{i!}\times (i-1)!=\dfrac{1}{n}\pmod p\)

标签:pmod,dfrac,ll,times,逆元,乘法,equiv
来源: https://www.cnblogs.com/RevolutionBP/p/15626509.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有