逆元的概念及求解方法
逆元
逆元概念
引入逆元
数论中的 (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
相关知识介绍
- 欧拉函数
对于正整数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的所有质因数。详解欧拉函数
- 欧拉定理
定理:若正整数 a, m互质,则有 a ^φ ( m ) ≡ 1 ( m o d m )
- 费马小定理
费马定理是欧拉定理的特例,当模数m为素数时,欧拉定理可以简化为:a ^( m - 1 ) ≡ 1 ( m o d m )
- 扩展欧几里得算法
扩展欧几里得算法用于在已知(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;
}
逆元的概念及求解方法相关推荐
- 逆元概念及其求解方法
逆元 引出 存在取模运算公式: (a + b) % c = (a % c + b % c) % c (a * b) % c = (a % c * b % c) % c (a - b) % c = (a ...
- 乘法逆元的三种求解方法
目录 乘法逆元小结 逆元的定义 求解逆元的方法 1. 快速幂 测试代码 2.拓展欧几里得 测试代码 3.线性算法 例题 AC代码 乘法逆元小结 参考自:点击此处 乘法逆元,一般用于求(a / b)(m ...
- 可逆矩阵的概念 逆矩阵的求解方法总结
可逆矩阵的概念:设A是一个n阶矩阵,如果存在n阶矩阵B,使得AB=BA=E,则称矩阵A为可逆矩阵,且B称为A的逆矩阵. 逆矩阵的求解方法总结: 1.待定系数法 利用定义进行求解,设A是一个n阶矩阵,如 ...
- 逆元的定义,性质,求解方法与例题
文章目录 一.定义 二.作用及证明 作用.计算除法的模 (a/b) mod n 证明: 三.求解方法 1.扩展欧几里得算法 2.欧拉定理与费马小定理(快速幂求法) 3.线性递推(逆元打表) 四.性质( ...
- 重磅!一文读懂线性方程组的求解方法
目录 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( ...
- 非线性规划MATLAB求解原理,专题六--非线性规划介绍及其Matlab求解方法.ppt
迭代法一般步骤 注意:数值求解最优化问题的计算效率取决于确定搜索方向P (k)和步长 的效率. Matlab求解方法简介 Step3: 利用(3)式或其它一维搜索的方法求 计算 然后令k:=k+1, ...
- 手眼标定AX=XB求解方法(文献总结)
本人在看论文时碰到了手眼标定问题,看了几篇论文,顺便来总结一下关于公式AX=XB的解决方法和论文的内容. 在手眼标定问题中,AX=XB公式的求解方法很关键,手眼即机器人末端和相机,两者有两种组合形式: ...
- 整数规划问题建模技巧与求解方法总结
1 概念 规划中的变量(部分或全部)限制为整数时,称为整数规划. 若在线性规划模型中,变量限制为整数,则称为整数线性规划. 整数线性规划模型大致可分为两类: (1)变量全限制为整数时,称纯(完全)整数 ...
- 卷积法求解系统的零状态响应_连续LTI系统零状态响应求解方法的分析
连续 LTI 系统零状态响应求解方法的分析 张淑敏 [摘 要] [摘 要]零状态响应是电子技术相关课程中的一个重要概念,本文将 通过对时域分析法和(复)频域分析法求解连续 LTI 系统零状态响应的分析 ...
- 《C语言程序设计:问题与求解方法》——3.8节不同类型数据之间的类型转换
本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.8节不同类型数据之间的类型转换,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号 ...
最新文章
- python检查_python设置检查点简单实现
- mysql concat 引号_在MySQL concat里面使用多个单引号,三引号的问题
- SharePoint视图过滤中People字段的局限
- 15原型模式(Prototype)
- java连接打印机访问被拒绝_java – 尝试访问spring security中的登录页面时访问被拒绝的异常...
- python 私有云_构建私有云伴随着哪些需求?
- 华为eNSP-基本配置指令
- 《UNIX网络编程 卷1:套接字联网API》学习笔记——基本UDP套接字编程
- 计算机网络由通讯子网和什么组成,计算机网络由通信子网和什么子网组成
- 模块三 day22 并发编程(上)
- python爬取快代理和西刺的国内高匿代理IP
- linux驱动原载-- touch pannel驱动
- kindle touch 花屏无反应
- 阿里云Redis开发规范学习总结
- JSON对象转换成Byte(字节)数组
- 给定一个十进制整数, 转成二进制形式,转成十六进制形式。
- 试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如“序列1序列2”模式的字符序列。其中序列1和序列2都不含字符“”,且序列2是序列1的逆序列。例如,“a+bb+a”是属该模式
- 推荐60多个CSS GALLERY画廊网站
- ArcMap实现CAD图的空间配准
- 淘宝运营去哪里学,可以自学吗
热门文章
- 【光斑PSF处理】激光光斑数据处理含matlab源码-含文档【0102期】
- 转:移动建站工具(一):分秒钟将Web网站移动化
- 美团无人配送部总经理夏华夏演讲:从技术细节看美团架构
- 目前世界最穷的国家是哪一个?
- RK3399安卓改linux,RK3399 Type-C改为MicroUSB
- 《割绳子》《蜡笔物理学》《Contre Jour》《顽皮鳄鱼爱洗澡》等游戏用Box2D引擎实现物理部分的方法(转)...
- 零基础快速入行入职软件测试工程师
- 基于C++的web服务器---总述篇
- nginx获取第三方ngixn中请求头信息以及判断是否有参数的跳转地址
- InnoDB一棵B+树能存多少行数据?为什么要用B+树?而不是其他树?