逆元

逆元概念

引入逆元

数论中的 (a / b)% p 运算很不方便,而且对p同余不满足同除性,因此引入逆元将整除运算转换为整数乘法运算,会更有助于计算。

定义

若 a * x ≡ 1 (mod) b, a, b 互质,则称 x 为 a 的逆元,标记为 a -1
逆元也可认为是数论意义上的倒数。
a 模 b 意义上的逆元不唯一,一般方便计算,取(0,b - 1]范围的逆元。

用法

逆元可以用来计算(t / a)mod b 时,转化为 t * a-1 mod b
两表达式同余证明:
(t / a)mod b == ((t / a)mod b)(1 mod b) == ((t / a)mod b)(a * a-1 mod b) == t * a-1 mod b

相关知识介绍

  1. 欧拉函数

对于正整数n,欧拉函数是小于等于n的数中与n互质的数的数目。
欧拉函数又称为 φ 函数,例如φ (8) = 4, 因为1,3,5,7均和8互质。
如果n为素数,则: φ (n)= n - 1 。
φ (1) = 1
一般情况: φ ( N ) = N ∗ ( 1 − 1/ p 1 ) ∗ ( 1 − 1/ p 2 ) ∗ . . . ∗ ( 1−1 /p k )
p1,p2,…, pk 是N的所有质因数。

详解欧拉函数

  1. 欧拉定理

定理:若正整数 a, m互质,则有 a ^φ ( m ) ≡ 1 ( m o d    m )

  1. 费马小定理

费马定理是欧拉定理的特例,当模数m为素数时,欧拉定理可以简化为:a ^( m - 1 ) ≡ 1 ( m o d    m )

  1. 扩展欧几里得算法

扩展欧几里得算法用于在已知(a,b)时,求解一组(x,y),使得x * a + y * b =GCD(a,b)。

// 求x, y,使得ax + by = gcd(a, b)
int exgcd(int a, int b, int &x, int &y)
{   //如gcd是1,则x 存放a的模b意义上的逆元if (!b){x = 1; y = 0;return a;}int d = exgcd(b, a % b, y, x);y -= (a/b) * x;return d;// d is gcd
}

逆元解法

费马小定理求解

费马小定理只适用于模数是质数的情况。
由 a ^( m - 1 ) ≡ 1 ( m o d    m ) 推出 a * a ^( m - 2 ) ≡ 1 ( m o d    m )
则a ^( m - 2 )是a模m意义上的逆元。

欧拉定理求解

欧拉定理对于模数是合数和质数的情况都能求解逆元。
由a ^φ ( m ) ≡ 1 ( m o d    m )推出 a * a ^(φ ( m )-1) ≡ 1 ( m o d    m )
则a ^(φ ( m )-1)是a模m意义上的逆元。
(a ^(φ ( m )-1))% m 是最小的正整数逆元。


//欧拉函数
int phi(int p)
{int res = p;for(int i = 2; i <= p / i; i ++)if(p % i == 0){while(p % i == 0) p /= i;//update pres = res / i * (i - 1);}if(p > 1) res = res / p *(p - 1);return res;}
扩展欧几里得算法求解

由逆元定义,可转化为 a * x + b * y = gcd(a, b)= 1, 由数论相关定理及扩展欧几里得算法此方程存在解。解x即为a的逆元。
(x + b)% b 可将逆元限制在(0,b - 1 ]
此算法通用。

线性递推法求解

逆元线性算法

例题

给定 n 组 ai,pi,其中 pi 是质数,求 ai 模 pi的乘法逆元,若逆元不存在则输出 impossible。
注意:请返回在 0∼p−1之间的逆元。
乘法逆元的定义
若整数 b,m互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 a/b≡a×x(mod m),则称 x 为 b 的模 m 乘法逆元,记为 b−1(mod m)。b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,b^(m−2) 即为 b的乘法逆元。
输入格式
第一行包含整数 n
接下来 n行,每行包含一个数组 ai,pi,数据保证 pi是质数。
输出格式
输出共 n行,每组数据输出一个结果,每个结果占一行。
若 ai模 pi的乘法逆元存在,则输出一个整数,表示逆元,否则输出 impossible。
数据范围
1≤n≤105,1≤ai,pi≤2 *109
输入样例:
3
4 3
8 5
6 3
输出样例:
1
2
impossible

#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
//逆元 费马小定理
// m^k % p
int ksm(int m, int k, int p)
{int res = 1 % p, t = m;while (k){if (k&1) res = (ll)res * t % p;t = (ll)t * t % p;k >>= 1;}return res;
}
int main()
{int n;scanf("%d",&n);while(n --){int a, p;scanf("%d%d",&a,&p);//p is prime int res = ksm(a, p - 2, p);//逆元a^(p-2) % pif(a % p) printf("%d\n", res);//a,p不互质,逆元不存在 else puts("impossible");}return 0;
}
  • 欧拉定理求解逆元
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
//逆元 欧拉定理 求解 //线性筛法求欧拉函数
const int N = 1e8 + 10;
int primes[N] , cnt ;
int p[N];
bool st[N];
//快速幂
int ksm(int m, int k, int p)
{int res = 1 % p, t = m;while (k){if (k&1) res = (ll)res * t % p;t = (ll)t * t % p;k >>= 1;}return res;
}
int geteulers(int n)
{   p[1] = 1;//1的欧拉函数值是1,存在1个互质数 for(int i = 2; i <=n; i ++){if(!st[i])//没筛掉,必是质数 {primes[cnt ++] = i;p[i] = i - 1;//i is prime. euqal i - 1}for(int j = 0; primes[j] <= n / i; j ++){st[primes[j] * i] = true;if(i % primes[j] == 0){p[primes[j] * i] =  p[i] * primes[j] ;break;} p[primes[j] * i] = p[i] * (primes[j] - 1);//i,primes[j]互质 PHI(ab)= phi(a) * phi(b) } }int r = p[n];   return r;
}
int main()
{int n;scanf("%d",&n);while(n --){int a, p;scanf("%d%d",&a,&p);//p可能是合数 if(__gcd(a,p) != 1){puts("impossible");continue;}int phim = geteulers(p);//p的欧拉函数值 int res = ksm(a, phim - 1, p); printf("%d\n", res);//返回最小的正整数逆元 }return 0;
}
#include <iostream>
using namespace std;typedef long long LL;
//扩展欧几里得
//求逆元
LL exgcd(int a, int b,LL & x, LL & y)
{if(!b){x = 1 ,y = 0;return a;}LL res = exgcd(b, a % b,x,y);LL tmp = x;x = y;y = tmp - a / b * y;return res;
}
int main()
{int n;scanf("%d",&n);while(n --){int a, p;LL d , x, y;scanf("%d%d",&a,&p);d = exgcd(a,p,x,y);if(d == 1) printf("%d\n", (x + p) % p); else puts("impossible");}return 0;
}

逆元的概念及求解方法相关推荐

  1. 逆元概念及其求解方法

    逆元 引出 存在取模运算公式: (a + b) % c = (a % c + b % c) % c (a * b) % c = (a % c * b % c) % c (a - b) % c = (a ...

  2. 乘法逆元的三种求解方法

    目录 乘法逆元小结 逆元的定义 求解逆元的方法 1. 快速幂 测试代码 2.拓展欧几里得 测试代码 3.线性算法 例题 AC代码 乘法逆元小结 参考自:点击此处 乘法逆元,一般用于求(a / b)(m ...

  3. 可逆矩阵的概念 逆矩阵的求解方法总结

    可逆矩阵的概念:设A是一个n阶矩阵,如果存在n阶矩阵B,使得AB=BA=E,则称矩阵A为可逆矩阵,且B称为A的逆矩阵. 逆矩阵的求解方法总结: 1.待定系数法 利用定义进行求解,设A是一个n阶矩阵,如 ...

  4. 逆元的定义,性质,求解方法与例题

    文章目录 一.定义 二.作用及证明 作用.计算除法的模 (a/b) mod n 证明: 三.求解方法 1.扩展欧几里得算法 2.欧拉定理与费马小定理(快速幂求法) 3.线性递推(逆元打表) 四.性质( ...

  5. 重磅!一文读懂线性方程组的求解方法

    目录 1.AAA为方阵 直接法 迭代法 2.AAA为非方阵且A∈Rm×n,m>nA\in R^{m\times n},m>nA∈Rm×n,m>n 2.1. r(A)=n<mr( ...

  6. 非线性规划MATLAB求解原理,专题六--非线性规划介绍及其Matlab求解方法.ppt

    迭代法一般步骤 注意:数值求解最优化问题的计算效率取决于确定搜索方向P (k)和步长 的效率. Matlab求解方法简介 Step3: 利用(3)式或其它一维搜索的方法求 计算 然后令k:=k+1, ...

  7. 手眼标定AX=XB求解方法(文献总结)

    本人在看论文时碰到了手眼标定问题,看了几篇论文,顺便来总结一下关于公式AX=XB的解决方法和论文的内容. 在手眼标定问题中,AX=XB公式的求解方法很关键,手眼即机器人末端和相机,两者有两种组合形式: ...

  8. 整数规划问题建模技巧与求解方法总结

    1 概念 规划中的变量(部分或全部)限制为整数时,称为整数规划. 若在线性规划模型中,变量限制为整数,则称为整数线性规划. 整数线性规划模型大致可分为两类: (1)变量全限制为整数时,称纯(完全)整数 ...

  9. 卷积法求解系统的零状态响应_连续LTI系统零状态响应求解方法的分析

    连续 LTI 系统零状态响应求解方法的分析 张淑敏 [摘 要] [摘 要]零状态响应是电子技术相关课程中的一个重要概念,本文将 通过对时域分析法和(复)频域分析法求解连续 LTI 系统零状态响应的分析 ...

  10. 《C语言程序设计:问题与求解方法》——3.8节不同类型数据之间的类型转换

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.8节不同类型数据之间的类型转换,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号 ...

最新文章

  1. python检查_python设置检查点简单实现
  2. mysql concat 引号_在MySQL concat里面使用多个单引号,三引号的问题
  3. SharePoint视图过滤中People字段的局限
  4. 15原型模式(Prototype)
  5. java连接打印机访问被拒绝_java – 尝试访问spring security中的登录页面时访问被拒绝的异常...
  6. python 私有云_构建私有云伴随着哪些需求?
  7. 华为eNSP-基本配置指令
  8. 《UNIX网络编程 卷1:套接字联网API》学习笔记——基本UDP套接字编程
  9. 计算机网络由通讯子网和什么组成,计算机网络由通信子网和什么子网组成
  10. 模块三 day22 并发编程(上)
  11. python爬取快代理和西刺的国内高匿代理IP
  12. linux驱动原载-- touch pannel驱动
  13. kindle touch 花屏无反应
  14. 阿里云Redis开发规范学习总结
  15. JSON对象转换成Byte(字节)数组
  16. 给定一个十进制整数, 转成二进制形式,转成十六进制形式。
  17. 试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如“序列1序列2”模式的字符序列。其中序列1和序列2都不含字符“”,且序列2是序列1的逆序列。例如,“a+bb+a”是属该模式
  18. 推荐60多个CSS GALLERY画廊网站
  19. ArcMap实现CAD图的空间配准
  20. 淘宝运营去哪里学,可以自学吗

热门文章

  1. 【光斑PSF处理】激光光斑数据处理含matlab源码-含文档【0102期】
  2. 转:移动建站工具(一):分秒钟将Web网站移动化
  3. 美团无人配送部总经理夏华夏演讲:从技术细节看美团架构
  4. 目前世界最穷的国家是哪一个?
  5. RK3399安卓改linux,RK3399 Type-C改为MicroUSB
  6. 《割绳子》《蜡笔物理学》《Contre Jour》《顽皮鳄鱼爱洗澡》等游戏用Box2D引擎实现物理部分的方法(转)...
  7. 零基础快速入行入职软件测试工程师
  8. 基于C++的web服务器---总述篇
  9. nginx获取第三方ngixn中请求头信息以及判断是否有参数的跳转地址
  10. InnoDB一棵B+树能存多少行数据?为什么要用B+树?而不是其他树?