Modular Multiplicative Inverse(模乘逆元)

2024-04-09 00:18

本文主要是介绍Modular Multiplicative Inverse(模乘逆元),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

计算模乘逆元原理上有四种方法:

1.暴力算法

2.扩展欧几里得算法

3.费尔马小定理

4.欧拉定理

模乘逆元定义:满足 ab≡1(mod m),称b为a模乘逆元。以下是有关概念以及四种方法及程序。

文章出处:Modular Multiplicative Inverse

The modular multiplicative inverse of an integer a modulo m is an integer x such thata^{-1} \equiv x \pmod{m}.

That is, it is the multiplicative inverse in the ring of integers modulo m. This is equivalent toax \equiv aa^{-1} \equiv 1 \pmod{m}.

1. Brute Force
We can calculate the inverse using a brute force approach where we multiply a with all possible valuesx and find ax such thatax \equiv 1 \pmod{m}. Here’s a sample C++ code:

int modInverse(int a, int m) {a %= m;for(int x = 1; x < m; x++) {if((a*x) % m == 1) return x;}
}

2. Using Extended Euclidean Algorithm
We have to find a number x such that a·x = 1 (mod m). This can be written as well as a·x = 1 + m·y, which rearranges into a·x – m·y = 1. Since x and y need not be positive, we can write it as well in the standard form, a·x + m·y = 1.

Iterative Method

/* This function return the gcd of a and b followed bythe pair x and y of equation ax + by = gcd(a,b)*/
pair<int, pair<int, int> > extendedEuclid(int a, int b) {int x = 1, y = 0;int xLast = 0, yLast = 1;int q, r, m, n;while(a != 0) {q = b / a;r = b % a;m = xLast - q * x;n = yLast - q * y;xLast = x, yLast = y;x = m, y = n;b = a, a = r;}return make_pair(b, make_pair(xLast, yLast));
}int modInverse(int a, int m) {return (extendedEuclid(a,m).second.first + m) % m;
}

Recursive Method

/* This function return the gcd of a and b followed bythe pair x and y of equation ax + by = gcd(a,b)*/
pair<int, pair<int, int> > extendedEuclid(int a, int b) {if(a == 0) return make_pair(b, make_pair(0, 1));pair<int, pair<int, int> > p;p = extendedEuclid(b % a, a);return make_pair(p.first, make_pair(p.second.second - p.second.first*(b/a), p.second.first));
}int modInverse(int a, int m) {return (extendedEuclid(a,m).second.first + m) % m;
}

3. Using Fermat’s Little Theorem
Fermat’s little theorem states that if m is a prime and a is an integer co-prime to m, then ap − 1 will be evenly divisible by m. That is a^{m-1} \equiv 1 \pmod{m}. or a^{m-2} \equiv a^{-1} \pmod{m}. Here’s a sample C++ code:

/* This function calculates (a^b)%MOD */
int pow(int a, int b, int MOD) {
int x = 1, y = a;while(b > 0) {if(b%2 == 1) {x=(x*y);if(x>MOD) x%=MOD;}y = (y*y);if(y>MOD) y%=MOD;b /= 2;}return x;
}int modInverse(int a, int m) {return pow(a,m-2,m);
}

4. Using Euler’s Theorem
Fermat’s Little theorem can only be used if m is a prime. If m is not a prime we can use Euler’s Theorem, which is a generalization of Fermat’s Little theorem. According to Euler’s theorem, if a is coprime to m, that is, gcd(a, m) = 1, then a^{\varphi(m)} \equiv 1 \pmod{m}, where where φ(m) is Euler Totient Function. Therefore the modular multiplicative inverse can be found directly: a^{\varphi(m)-1} \equiv a^{-1} \pmod{m}. The problem here is finding φ(m). If we know φ(m), then it is very similar to above method.

vector<int> inverseArray(int n, int m) {vector<int> modInverse(n + 1,0);modInverse[1] = 1;for(int i = 2; i <= n; i++) {modInverse[i] = (-(m/i) * modInverse[m % i]) % m + m;}return modInverse;
}





这篇关于Modular Multiplicative Inverse(模乘逆元)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886731

相关文章

hdu4828(卡特兰数+逆元)

这题的前几个数据分别为1,2,5,14,32......................然后确定这是个卡特兰数列 下面来介绍下卡特兰数,它的递推式为f[i+1] = f[i]*(4*n - 6)/n,其中f[2] = f[3] =1;f[4] = 2;f[5] = 14;f[6] = 32.................................. 但是这题的n太大了,所以要用到逆元,

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

排列数+时间戳+逆元取模

前言:这个题目是真的难,不会做,看了题解才发现是咋回事 题目地址 最主要的就是为啥是除以3,c之前需要完成a 和 b,d 和 e 对我们的答案没有影响,所以我们要除以 A(3,3) ,但是 a 和 b 的排列没有要求,所以乘以 A( 2 , 2 ) 抵消得到 3 #include<bits/stdc++.h>using i64 = long long;using u64 =

Codeforces Round #295 (Div. 1) C. Pluses everywhere (组合数学+乘法逆元)

这题可以这样想:       对于当前第i位来说,该位若在个位上出现,那么第i位和第i+1位中间肯定有一个“+”,剩下的k-1个“+”分布在剩下的n-2个空隙中,所以出现的总次数是C(n-2,k)。同理,在十位上出现的总次数是C(n-3,k)。于是每个数字的贡献值就可以求出来了,累加即可。       所以大体思路是遍历所有可能出现的位数,从个位开始,分成两部分计算,一部分用前缀和计算出前面所

CVPR2021-PhySG: Inverse Rendering with Spherical Gaussians for Physics-based Material Editing and Re

作者:Zhang kai + Prof. Noah Snavely Cornell University, Department of Computer Science 光照:natural, static illumination 对象:specular objects 视点:multi-view 相机类型:RGB 时间:no 问题:multi-view inverse render

数论 —— 逆元与同余式定理

【同余模公式】 (A+B)%M = (A%M+B%M) % M(A*B)%M = (A%M*B%M) % M(A/B)%M = (A*C)%M = (A%M*C%M) % M,其中 B*C≡1(mod M),B、M 互质,C 称为 B 的逆元 (A/B)%M 的推导:(A/B)%M = (A/B) * 1 % M = (A/B)*B*C % M = (A*C) % M 【威尔逊定理】 若

TF-IDF(Term Frequency-Inverse Document Frequency)

TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用于信息检索和文本挖掘的统计方法,用以评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。它的重要性随着词语在文本中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF算法主要应用于关键词抽取、文档相似度计算和文本挖掘等领域。 以下是TF-IDF算法的

TF-IDF(Term Frequency-Inverse Document Frequency)算法

TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于文本挖掘和信息检索的统计方法,主要用于评估一个单词在一个文档或一组文档中的重要性。它结合了词频(TF)和逆文档频率(IDF)两个指标。以下是详细解释: 1. 词频(TF,Term Frequency) 词频表示一个单词在一个文档中出现的频率。假设我们有一个单词 ( t ) 和一个文档 (

同余式,乘法逆元,费马小定理

同余式 同余式是 数论 的基本概念之一,设m是给定的一个正整数,a、b是整数,若满足m| (a-b),则称a与b对模m 同余 ,记为a≡b (mod m),或记为a≡b (m)。 这个式子称为模m的同余式,若m∤ (a-b),则称a、b对模m不同余 同余概念又常表达为: 1.a=b+km (k∈Z); 2.a和b被m除时有相同的 余数  乘法逆元 乘法逆元的定义:在数学领域,对于群G