求乘法逆元

由于在计算除法时,mod 运算不能直接加在除数被除数后,因此需要将 n / a (mod b )转化为 n * x (mod b ),以便于进行模运算。求 x 的过程就称为求逆元。

对于 a 、b (a 与 b 互素)满足 n / a ≡ n * x (mod b ),则称 x 为 a 模 b 的逆元;

一般有两种求逆元的方式:扩展欧几里得求逆元和欧拉-费马定理求逆元;

1、扩展欧几里得求逆元:

见(欧几里得与扩展欧几里得);

http://www.cnblogs.com/cenariusxz/p/4323872.html

2、欧拉-费马定理求逆元(通过矩阵快速幂实现):

根据欧拉函数 φ(x) 表示小于自变量 x 并与 x 互素的自然数的个数;

根据欧拉定理(基本是用完全剩余系累加推出来的)

a 与 x 互素时:

a φ(x)≡ 1 (mod x)

即 a * a φ(x)-1≡ 1 (mod x)

所以 :

  a φ(x)-1 即为 a 模 x 的逆元;

而费马小定理求的则是欧拉函数的特殊情况:

当 x 为素数时,φ(x)= x - 1 ;

因此当 a 与 x 互素且 x 为素数时:

  a x - 2 即为 a 模 x 的逆元;

时间: 2024-11-07 13:40:46

求乘法逆元的相关文章

求乘法逆元的几种方法

(数学渣,下面的文字可能有误,欢迎指教)乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减乘与模运算的顺序交换不会影响结果,但是除法不行.有的题目要求结果mod一个大质数,如果原本的结果中有除法,比如除以a,那就可以乘以a的逆元替代. 在mod p的运算中,a存在乘法逆元当且仅当a与p互质.一般题目给的是一个大质数,所以只要a不是p的倍数,就以求乘法逆元. 目前了解到的求法有三种:1.扩展

hdu1576(扩展gcd求乘法逆元)

A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7509    Accepted Submission(s): 5969 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个T

费马小定理 求乘法逆元

//P3811 [模板]乘法逆元 #include<bits/stdc++.h> using namespace std; inline void write(long long X) { if(X<0) {X=~(X-1); putchar('-');} if(X>9) write(X/10); putchar(X%10+'0'); } long long qpow(long long n,long long m,long long mod) { long long ans=1;

求乘法逆元模板(扩展欧几里得)

void exgcb(LL a,LL b,LL &d,LL &x,LL &y){ if(!b){d=a;x=1;y=0;return;} exgcb(b,a%b,d,y,x);y-=x*(a/b); } LL ny(LL a,LL b){ ///求a关于b的逆元(要求a,b互质) LL d,x,y; exgcb(a,b,d,x,y); return d==1?(x+b)%b:-1; }

【codevs 1200】【NOIP 2012】同余方程 拓展欧几里德求乘法逆元模板题

模板,,, #include<cstdio> using namespace std; void exgcd(long long a,long long b,long long &x,long long &y){ if (b==0) {x=1; y=0;} else {exgcd(b,a%b,x,y); int t=y; y=x-a/b*y; x=t;} } int main(){ long long a,b,x,y; scanf("%lld %lld\n"

新学一个 求乘法逆元的方法。

inv[x] = ( Mod - Mod / x ) * inv[Mod%x] % Mod 设Mod=px+q.  inv[x]=r px+q = 0  (mod  Mod) pxr+qr = 0 (mod Mod) p + qr = 0 (mod Mod) r=-p/q= -p*inv[q] = -(Mod/x)*inv[Mod % x] = (Mod - Mod/x) * inv[Mod % x].

乘法逆元...Orz

最近打的几场比赛,都出现了有关逆元的题目,今天就整理了一下... 求乘法逆元的几种方法:http://www.cnblogs.com/james47/p/3871782.html 博文转载链接:http://blog.csdn.net/acdreamers/article/details/8220787 今天我们来探讨逆元在ACM-ICPC竞赛中的应用,逆元是一个很重要的概念,必须学会使用它. 对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元. 逆元一般用扩展欧几里得算法来求

数论学习之乘法逆元

用法:用于除法取模 思路:扩欧 要求:b.p互质 设k为b的乘法逆元: 则在求解除法取模问题时: 有(a/b)%p =>(a*k)%p 当b很大时,用除法会出现精度问题..so 乘法逆元: 如果b*k ≡ 1 (mod p) 则称k是b关于p的乘法逆元 我们可以通过求 b 关于 p 的乘法逆元 k,将 a 乘上 k 再模 p,即 (a * k) mod p.其结果与(a / b) mod p等价. 证: 因为 b * k ≡ 1 (mod p) 则有 b * k = p* x+1 得到 k =

数论--乘法逆元

乘法逆元 定义: 满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元. 为什么要有乘法逆元呢?当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元. 我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k) mod p.其结果与(a/b) mod p等价. 证:(其实很简单...) 根据b*k≡1 (mod p)有b*k=p*x+1. k=(p*x+1)/b. 把k代入(a*k) mod p,得: (a*(p*x+1)/b) mod p