乘法逆元怎么计算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了乘法逆元怎么计算相关的知识,希望对你有一定的参考价值。

乘法逆元的计算方法如下:

1、费马小定理

由费马小定理ap-1≡1,变形得 a*ap-2≡1(mod p),答案已经很明显了:若a,p互质,因为a*ap-2≡1(mod p)且a*x≡1(mod p),则x=ap-2(mod p),用快速幂可快速求之。

2、扩展欧几里得

我们都知道模就是余数,比如12%5=12-5*2=2,18%4=18-4*4=2。(/是程序运算中的除)

那么ax≡1 (mod p)即ax-yp=1。把y写成+的形式就是ax+py=1,为方便理解下面我们把p写成b就是ax+by=1。就表示x是a的模b乘法逆元,y是b的模a乘法逆元。然后就可以用扩展欧几里得求了。

乘法逆元的定义:若存在正整数a,b,p, 满足ab = 1(mod p), 则称a 是b 的乘法逆元, 或称b 是a 的乘法逆元。

参考技术A 1、费马小定理

由费马小定理ap-1≡1,变形得 a*ap-2≡1(mod p),答案已经很明显了:若a,p互质,因为a*ap-2≡1(mod p)且a*x≡1(mod p),则x=ap-2(mod p),用快速幂可快速求之

乘法逆元入门

乘法逆元入门(四种方法及补充)

前言

在一些题目中,因为数据量会特别大甚至超过long long,所以会要求最后结果mod一个数,实际上就是让你在计算过程中就要不断mod。

对于加法: ( a + b ) % m = ( a % m + b % m ) % m (a+b)\\%m = (a\\%m+b\\%m)\\%m (a+b)%m=(a%m+b%m)%m
对于减法: ( a − b ) % m = ( a % m − b % m ) % m (a-b)\\%m = (a\\%m-b\\%m)\\%m (ab)%m=(a%mb%m)%m
对于乘法: ( a ∗ b ) % m = ( a % m ∗ b % m ) % m (a*b)\\%m = (a\\%m*b\\%m)\\%m (ab)%m=(a%mb%m)%m

但是这个规则在除法不适用:简单例子比如 ( 30 7 ) % 2 (\\frac307)\\%2 (730)%2

我们一般遇到除法 (a/b)%MOD的时候,会将除法变为乘法,用到了“逆元”的思想。

逆元

当求解公式:(a/b)%m 时,因b可能会过大,会出现爆精度的情况,所以需变除法为乘法:

设c是b的逆元,则有b*c≡1(mod m);

(a/b)%m = (a/b)*1%m = (a/b)*b*c%m = a*c(mod m);

例如 b = 10 , m = 3 b=10,m=3 b=10,m=3时, c = 4 c=4 c=4

a = 20 , ( 20 / 10 ) % 3 = 2 , ( 20 ∗ 4 ) % 3 = 2 a=20, (20/10)\\%3=2 ,(20*4)\\%3=2 a=20,(20/10)%3=2,(204)%3=2
a = 40 , ( 40 / 10 ) % 3 = 1 , ( 40 ∗ 4 ) % 3 = 1 a=40, (40/10)\\%3=1 ,(40*4)\\%3=1 a=40,(40/10)%3=1,(404)%3=1

现在我们要求 ( a / b ) % m (a/b)\\%m (a/b)%m,可以找到一个 c c c使得 ( a / b ) % m = ( a ∗ c ) % m (a/b)\\%m=(a*c)\\%m (a/b)%m=(ac)%m.

费马小定理

如果 p p p是一个质数,而整数 a a a不是 p p p的倍数,则有 a p − 1 ≡ 1 ( m o d ) p a^p-1 ≡ 1(mod)p ap11(mod)p

所以可得: a p − 2 ≡ a − 1 ( m o d p ) a^p-2≡a^-1(mod p) ap2a1modp

换成代码如下:

(a/b)%m
(a*pow(b,m-2))%m

这里还需要快速幂来配合计算:

ll quick_pow(ll x,ll n,ll m)

	ll res = 1;
	while(n > 0)
	
		if(n & 1)
            res = res * x % m;
		x = x * x % m;
		n >>= 1;
	
	return res;
  
ll inv(ll a)

    return quick_pow(a, mod - 2, mod);

递归

当m是质数,inv(a) = (m - m / a) * inv(m % a) % m,暴力反向递归

ll inv2(ll a,ll m)//代入a%m m

    return a==1?1:(m-m/a)*inv2(m%a,m)%m;

线性递推

求关于一个m的多个逆元,道理差不多:

ll m=3;
ll inv[m+5];
void inv3(ll m)

    inv[1]=1;
    for(int i=2;i<m;i++)
        inv[i]=(m-m/i)*inv[m%i]%m;

参考Link


加油!

感谢!

努力!

以上是关于乘法逆元怎么计算的主要内容,如果未能解决你的问题,请参考以下文章

mod 运算与乘法逆元

乘法逆元模板

『数论』乘法逆元

HDU1576 A/B(乘法逆元)

关于乘法逆元的世界

[洛谷P3811]模板乘法逆元