求乘法逆元的几种方法
(数学渣,下面的文字可能有误,欢迎指教)
乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广。记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p)
加减乘与模运算的顺序交换不会影响结果,但是除法不行。有的题目要求结果mod一个大质数,如果原本的结果中有除法,比如除以a,那就可以乘以a的逆元替代。
在mod p的运算中,a存在乘法逆元当且仅当a与p互质。一般题目给的是一个大质数,所以只要a不是p的倍数,就以求乘法逆元。
目前了解到的求法有三种:
1.扩展欧几里得。aa^-1≡ 1(mod p),可以转换为aa^-1 + py = 1,即是扩展欧几里得所能解的ax + by = gcd(a, b)。最常用的解法。
int x, y;
int extgcd(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 tmp = x;x = y;y = tmp - (a/b) * y;return gcd;
}/*
求解ax+by=gcd(a,b),亦即ax≡1(mod b)。函数返回值是a,b的最大公约数,而x即a的逆元。
注意a, b不能写反了。
*/
2.由费马小定理a^(p-1)≡ 1(mod p)(p为素数),稍作变形即是 aa^(p-2)≡ 1(mod p),是不是发现了,a^(p-2)即是a的逆元,这个可以用快速幂来求。
3.网上看到的一个很厉害的o(n)的递推,求前n个逆元,不知道是怎么推出来的,但是可以简单地证明一下正确性(要求所mod p为素数)。
首先,1的逆元是1,没什么疑问。
假设前i个数的逆元已经求出,那么
i^-1 = (p%i)^-1 * (p - [p/i]) % p。其中[]表示去尾取整。
(p%i)^-1其实就是(p-[p/i]i)^-1,然后我们左右乘以i,
ii^-1 = (p-[p/i]i)^-1 * ((i-1)p + p-[p/i]i) % p,
其实就是ii^-1 = k^-1 * ((i-1)p + k) % p = 0 + 1 = 1,这样就证完了=。=
//字体真糟糕。。
int[] inv = new int[MAXN];
inv[1] = 1;
for (int i = 2; i<MAXN; i++)inv[i] = inv[MOD%i]*(MOD-MOD/i)%MOD;
今天我们来探讨逆元在ACM-ICPC竞赛中的应用,逆元是一个很重要的概念,必须学会使用它。
对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。
逆元一般用扩展欧几里得算法来求得,如果为素数,那么还可以根据费马小定理得到逆元为。
推导过程如下
求现在来看一个逆元最常见问题,求如下表达式的值(已知)
当然这个经典的问题有很多方法,最常见的就是扩展欧几里得,如果是素数,还可以用费马小定理。
但是你会发现费马小定理和扩展欧几里得算法求逆元是有局限性的,它们都会要求与互素。实际上我们还有一
种通用的求逆元方法,适合所有情况。公式如下
现在我们来证明它,已知,证明步骤如下
逆元详解: http://blog.csdn.net/acdreamers/article/details/8220787
求乘法逆元的几种方法相关推荐
- java求乘法逆元的代码_求乘法逆元的几种方法
(数学渣,下面的文字可能有误,欢迎指教) 乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减 ...
- 计蒜客 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B coin(求乘法逆元)
Bob has a not even coin, every time he tosses the coin, the probability that the coin's front face u ...
- 乘法逆元通俗易懂的理解方法
最近,发现数论真的很重要,基本上一套题必出一个数论的题.故接下来,要好好的看一看数论了. 乘法逆元我觉得其本质:就是数论里的倒数. 由上图你会发现:其取模的运算不满足除法的分配律,那么如何求除法的模运 ...
- 乘法逆元 java_java写的三个求乘法逆元的算法
java写的三个求乘法逆元的算法: 第一个是著名的扩展欧拉算法 第二个是网上发现的一个牛人写的算法 第三个是我这个菜鸟补充的一个最垃圾的算法 在对较小的数进行运算的时候,后两种算法都比第一个快,第三个 ...
- c语言数组最大可定义多少位_C语言求数组的最大值三种方法
/* 黄哥Python培训 黄哥所写*/#include int maxValue(int* arr, int n);int maxRecursionValue(int* arr, int n);in ...
- 金字塔型php的9x9乘法口诀表,python中打印金字塔和九九乘法表的几种方法
# 打印九九乘法表 for i in range(1,10): for j in range(1,i+1): # x=i*j # print(i,'*',j,'=',x,end=' ') print( ...
- c语言实现求最大公约数的三种方法
一.最大公约数 最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也 ...
- matlab求pi值的三种方法
https://www.icourse163.org/learn/CSU-1002475002?tid=1450231442#/learn/content?type=detail&id=121 ...
- 表格法轻松理解扩展欧几里得算法以及利用其求乘法逆元
文章目录 扩展欧几里得算法 求乘法逆元 扩展欧几里得算法 具体算法的原理参见扩展欧几里得算法求乘法逆元,本文仅以表格的形式展现计算过程,浅显易懂.下面通过例子进行说明. 例:求1234和4321的最大 ...
最新文章
- CentOS下安装ZooKeeper
- Java基础篇:String、StringBuffer、StringBuilder
- LTE各场景下的密钥处理
- iOS CoreAnimation
- Redis总结集群方式之主从复制
- python中str转unicode_python将unicode和str互相转化的实现
- nginx php 5.5 安装,Nginx1.5与PHP5.5安装文档
- java三大特性之—封装
- 光学三原色与色的三原色
- 2017 linux wine 迅雷,wine 迅雷下载安装(wine 迅雷极速版)【Linux上用迅雷7】
- linux man 命令 详解
- 基于matlab山脊线,教你如何利用水文,分析提取山脊线山谷线
- Java-用类描述人之间的血缘关系
- 折腾:如何让你的老电脑快起来
- 音乐播放时跳动的音符
- pfx格式是什么文件
- Java程序员秋招面经大合集(BAT美团网易小米华为中兴等)
- HDFS块副本的冗余度构建流程
- 2018福大软工实践第四次作业
- GEE哨兵二号去云不成功的原因(代码修改)