除法取模与逆元
来源:互联网 发布:python和c语言 编辑:程序博客网 时间:2024/06/09 06:48
逆元:
对于正整数a和m,如果ax≡1(mod m),(即ax%m=1),那么把这个同余方程中x的最小正整数解叫做 a模m的逆元。
一个数有逆元的充分必要条件是gcd(a,m)=1,此时逆元唯一存在
除法取模
a/b mod m等价于a*b’mod m (b’是b模m的逆元)
下面是几种求逆元的方法
1.扩展欧几里得
代码如下
#include<stdio.h> #define ll long long ll exgcd(ll b,ll m,ll& x,ll& y){ if(!m){ x=1; y=0; return x; } else{ exgcd(m,b%m,y,x); y-=x*(b/m); } return x; } int main(){ ll b,m,x,y; while(scanf("%lld%lld",&b,&m)!=EOF){ //b有逆元的前提gcd(b,m)=1 x=exgcd(b,m,x,y); x=(x%m+m)%m; printf("%lld\n",x);//x即为b的逆元b' } return 0; }
2.费马小定理
在模m为素数的条件下有 b^(m-1)=1(mod m);
则 b模m的逆元b’ =b^(m-2)
用快速幂求即可。
代码如下
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<vector>#include<cmath>#include<string>#define LL long long using namespace std;LL b,m;LL pow(LL x,LL n){ LL res=1; while(n>0){ if(n&1) res=(res*x); x=(x*x); n>>=1; } return res;}int main(){ while(cin>>b>>m){ cout<<pow(b,m-2)%m<<endl; } return 0;}
3.求逆元的一般公式
a/b mod m=a mod (m*b) /b
注意:实际上a mod (m*b)/b这种的对于所有的都适用,不区分互不互素,而费马小定理和扩展欧几里得算法求逆元是有局限性的,它们都会要求与互素,如果a与m不互素,那就没有逆元,这个时候需要a mod (bm)/b来搞(此时就不是逆元的概念了)。但是当a与m互素的时候,bm可能会很大,不适合套这个一般公式,所以大部分时候还是用逆元来搞.
0 0
- 除法取模与逆元
- 除法取模与逆元
- 除法取模与逆元
- 除法取模与逆元/费马小定理
- 除法取模与逆元/费马小定理
- 除法取模与逆元--hdu3970 Harmonious Set
- 乘法逆元(除法取模)
- 除法取模(逆元)
- 除法取模 逆元 费马小定理
- 除法取模和逆元
- 小知♂识 除法取模 逆元♂
- hdu 5407 CRB and Candies(素数筛选法,除法取模(乘法逆元))
- HDU 5690 查找循环节 数学公式快速幂+乘法逆元(除法取模)
- 基础数论学习笔记-----------逆元【除法取模运算的关键】
- Kickstart Round A 2017 Problem A. Square Counting 公式、数论逆元、除法取模
- 除法运算、商、余数与取模
- 移位运算与除法、取模运算
- 取余与除法
- java swing中使用jsch做sftp文件上传
- Java开发Excel POI getPhysicalNumberOfCells 与 getLastCellNum的区别
- 数据库
- spring Cloud笔记
- Mac 隐藏文件查看及关闭
- 除法取模与逆元
- Go语言学习笔记(五)-其他类型(指针、结构体、、)
- ArrayList的add和remove方法
- Android提供了一个名为SQLiteDatabase的类
- git操作记录
- jqGrid 学习
- Android5.0之Activity的转场动画
- MySQL 不常用命令记录
- SpringMVC---实现文件上传与下载