逆元相关知识 kevin_xcw
来源:互联网 发布:vmware 端口转发 编辑:程序博客网 时间:2024/06/07 09:17
逆元相关知识
乘法逆元(mod 在C++里是%)
定义:
满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元。
为什么要有乘法逆元呢?
当我们要求(a/b)%p的值,且a,b都很大,无法直接求得a/b的值,必须在之前mod时(因为(a/b)%p不等于(a%p)/(b%p)),我们就要用到乘法逆元。
我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k)%p。其结果与(a/b)%p等价。
前提a和p互质,才能用乘法逆元:
因为a*k≡1 (mod p)等价于ax+by=1,要使其有解,gcd(a,b)必须等于1。
证:(其实很简单。。。)
- 根据b*k≡1 (mod p)有b*k=p*x+1。
- k=(p*x+1)/b。
- 把k代入(a*k)%p,得:
- (a*(p*x+1)/b)%p
- =((a*p*x)/b+a/b)%p
- =[((a*p*x)/b)%p +(a/b)]%p
- =[(p*(a*x)/b)%p +(a/b)]%p
- //p*[(a*x)/b]%p=0
- 所以原式等于:(a/b)%p
根据欧几里德算法
代码如下:
void Exgcd(int a,int b,int &x,int &y){if(!b) x=1,y=0;else Exgcd(b,a%b,y,x),y-=a/b*x;}int main(){ cin>>a>>b>>p;//(a/b)%p Exgcd(b,p,x,y); int ni=(x+p)%p;//防止出现负数 printf("%d就是逆元\n",ni); return 0;}
线性求逆元
求i的逆元。
可得p%i+(p/i)*i=p
- 令a=p%i,b=p/i;
- a+b*i=p
- a+b*i≡0(mod p)
- b*i≡-a(mod p)
- i^-1=-b/a
所以i的逆元:-(p/i)*(p%i)^-1
这样就可以O(n)求出所以逆元了
代码如下:
(因为1^(-1)=1,所以初始化inv[1]=1)for(inv[1]=1,i=2;i<=n;i++) inv[i]=(p-p/i)*inv[p%i]%p;所以最后O(1)出答案。
本人也是初学,请大家多多包含,也希望对大家有用
阅读全文
0 0
- 逆元相关知识 kevin_xcw
- 元数据相关知识
- 逆元相关
- 逆元相关
- Python中字典、列表、元组相关知识持续整理-namedtuple
- 有关lookrotate相关的数学四元数的知识(更新待定)
- C++字符串处理 kevin_xcw
- 洛谷 P1582 倒水 kevin_xcw
- 机器学习元知识
- hdu-5668- Circle 逆元+卡特兰数知识模板
- 友元相关
- 洛谷 P1091 合唱队形 kevin_xcw
- BZOJ 1002: [FJOI2007]轮状病毒 kevin_xcw
- 关于数论乘法逆元及相关知识点
- 友元的有关知识
- 相关reactjs的相关知识
- OPC的相关知识
- ActiveX控件相关知识~
- HDOJ 2008 数值统计
- MATLAB导入json数据
- 287. Find the Duplicate Number
- PMBOK笔记 第1章 引论(5)
- 机器学习基石作业1-Pocket_PLA 的c++实现
- 逆元相关知识 kevin_xcw
- 编程规范(经常遇到的)-好习惯
- 易宝CTO陈斌:互联网技术促进传统产业升级(GIIC演讲实录)
- Spring事务超时时间可能存在的错误认识
- Mac系统下Android Studio的Github使用
- HDOJ 2009 求数列的和
- 格拉姆施密特求正交基
- Tensorflow分批量读取tfrecords
- 【C++】C++封装、继承、多态小结