求乘法逆元
定义:即已知 b 与 m 互质 且 b|a 则求一个x 使得 a/b\equiv a*x\mod m
[注] 简单定义 即 b*x \equiv 1 \mod m 且 b 与 m 互质 则 x 为 b 的逆元
1. 当m为质数时
求解过程如下 :
由费马小定理可知
b^{m-1} \equiv 1 \mod m
而
a/b\equiv a*x \mod m
联立以上两式,得:
a/b*b^{m-1}\equiv a*x \mod m
即为
a*b^{m-2} \equiv a*x \mod m
而b|a,且b与m互质,因此对于b来说,一定存在一个a也与m互质,故而a可以在两边同时约去(感谢yxc大佬)
因此
x\equiv b^{m-2} \mod m
无解条件 即 b与m不互质时无解,而m为质数,所以b只能为m的倍数,此时无解,也就是b\%m==0
2.当m不是质数时,则需要用扩展欧几里得求逆元
3.逆元的作用
当 a,b 很大时 求 a/b \mod p 的值
而 a/b \mod p \not= ((a \mod p)/(b \mod p) )\mod p
因此可以借助逆元转化为乘法,再算,设b的逆元为b^{-1}
则 a/b \mod p=a*b^{-1}\mod p = ((a \mod p)*(b^{-1} \mod p) )\mod p
当m为质数时,求解逆元的C++代码如下
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int qmi(int a, int b, int p){//快速幂
int res = 1%p;
while(b){
if(b&1) res = (LL)res*a%p;
a = (LL)a*a%p;
b>>=1;
}
return res;
}
int main(){
int n,a,p;
cin>>n;
while(n--){
cin>>a>>p;//p是质数 求 a的逆元(mod p意义下)
if(a%p) cout<<qmi(a,p-2,p)<<endl;
else cout<<"impossible"<<endl;
}
return 0;
}
想问一下,题目求的不是 逆元吗,为什么最终答案是 逆元再去 mod p
因为逆元是在取模意义下的啊
我不是很懂,逆元题目中的定义不就是 b^(p-2)吗,为什么会多出来个mod p
同余意义下 b 的逆元 x 为:
x\equiv b^{p-2} \mod p
因为(ab)mod p == (amodp)(bmodp)modp
呃呃呃,第二行是a/b==a*x(mod m) 吧,,,
另外能解释下为什么a和m互质所以两边的a可以被消去呢?
谢谢大佬!
这是一个除法性质 可以搜到 ab 同余于 ac (mod m) 若a 与m互质则 b 同余于 c (mod m)
请问根据模运算乘法的性质不可以得出来吗?
(a1)\ mod\ m=[(a\ mod\ m)(1\ mod\ m)]mod\ m
(abx)\ mod\ m=[(a\ mod\ m)(bx\ mod\ m)]mod\ m
然后约掉(a mod m)
ax同余1(mod p) 等价于ax➕py=1
为啥b|a 且b与m互质能得到a也与m互质,这个地方有点不懂
orz,讲的非常的清楚,逻辑很清晰,感谢!!
y总好像都没讲同余的事。你这个题解是写的最好的。
想问一下,题目求的不是 逆元吗,为什么最终答案是 逆元再去 mod p