Give a positive integer n, find modular multiplicative inverse of all integer from 1 to n with respect to a big prime number, say, ‘prime’.
The modular multiplicative inverse of a is an integer ‘x’ such that.
a x ≡ 1 (mod prime)
Examples :
Input : n = 10, prime = 17 Output : 1 9 6 13 7 3 5 15 2 12 Explanation : For 1, modular inverse is 1 as (1 * 1)%17 is 1 For 2, modular inverse is 9 as (2 * 9)%17 is 1 For 3, modular inverse is 6 as (3 * 6)%17 is 1 ....... Input : n = 5, prime = 7 Output : 1 4 5 2 3
A simple solution is to one by one find modular inverse for every number.
C++
// C++ program to find modular inverse of // all numbers from 1 to n using naive // method #include<iostream> using namespace std; // A naive method to find modular // multiplicative inverse of 'a' // under modulo 'prime' int modInverse(int a, int prime) { a = a % prime; for (int x=1; x<prime; x++) if ((a*x) % prime == 1) return x; return -1; } void printModIverses(int n, int prime) { for (int i=1; i<=n; i++) cout << modInverse(i, prime) << " "; } // Driver Program int main() { int n = 10, prime = 17; printModIverses(n, prime); return 0; } |
Java
// Java program to find modular inverse of // all numbers from 1 to n using naive // method import java.io.*; class GFG { // A naive method to find modular // multiplicative inverse of 'a' // under modulo 'prime' static int modInverse(int a, int prime) { a = a % prime; for (int x = 1; x <prime; x++) if ((a * x) % prime == 1) return x; return -1; } static void printModIverses(int n, int prime) { for (int i = 1; i <= n; i++) System.out.print(modInverse(i, prime) + " "); } // Driver Program public static void main(String args[]) { int n = 10, prime = 17; printModIverses(n, prime); } } // This code is contributed by Nikita Tiwari. |
Python3
# Python 3 program to find # modular inverse of # all numbers from 1 # to n using naive # method # A naive method to find modular # multiplicative inverse of 'a' # under modulo 'prime' def modInverse(a, prime) : a = a % prime for x in range(1,prime) : if ((a*x) % prime == 1) : return x return -1 def printModIverses(n, prime) : for i in range(1,n+1) : print( modInverse(i, prime) ,end= " ") # Driver Program n = 10prime = 17 printModIverses(n, prime) # This code is contributed # by Nikita Tiwari. |
C#
// C# program to find modular inverse of // all numbers from 1 to n using naive // method using System; class GFG { // A naive method to find modular // multiplicative inverse of 'a' // under modulo 'prime' static int modInverse(int a, int prime) { a = a % prime; for (int x = 1; x <prime; x++) if ((a * x) % prime == 1) return x; return -1; } static void printModIverses(int n, int prime) { for (int i = 1; i <= n; i++) Console.Write(modInverse(i, prime) + " "); } // Driver Program public static void Main() { int n = 10, prime = 17; printModIverses(n, prime); } } // This code is contributed by vt_m. |
PHP
<?php // PHP program to find modular inverse of // all numbers from 1 to n using naive // method // A naive method to find modular // multiplicative inverse of 'a' // under modulo 'prime' function modInverse(int $a, int $prime) { $a = $a % $prime; for ( $x = 1; $x < $prime; $x++) if (($a * $x) % $prime == 1) return $x; return -1; } function printModIverses( $n, $prime) { for ( $i = 1; $i <= $n; $i++) echo modInverse($i, $prime) , " "; } // Driver Program $n = 10; $prime = 17; printModIverses($n, $prime); // This code is contributed by anuj_67. ?> |
Output:
1 9 6 13 7 3 5 15 2 12
An efficient solution is based on extended Euclid algorithm.
Extended Euclidean algorithm finds integer coefficients x and y such that:
ax + by = gcd(a, b) Let us put b = prime, we get ax + prime * y = gcd(a, prime) We know gcd(a, prime) = 1 because on of the numbers is prime. So we know ax + prime * y = 1 Since prime * y is a multiple of prime, x is modular multiplicative inverse of a. ax ≡ 1 (mod prime)
We can recursively find x using below expression (see extended Euclid algorithm for details).
The extended Euclidean algorithm updates results of gcd(a, b) using the results calculated by recursive call gcd(b%a, a). Let values of x and y calculated by the recursive call be xprev and yprev. x and y are updated using below expressions.
x = yprev - ⌊prime/a⌋ * xprev y = xprev
We use above relation to compute inverse using previously computed values.
inverse(a) = (inverse(prime % a) *
(prime - prime/a)) % prime
We use Dynamic Programming approach that uses above recursive structure.
Dynamic Approach :
dp[1] = 1,
dp[2] = dp[17%2]*(17-17/2)%17 = 9
dp[3] = dp[17%3]*(17-17/3)%17 = 6
and so on..
C++
// CPP code to find modular inverse // from 1 to n w.r.t a big prime number #include <iostream> using namespace std; // Function to calculate modular // inverse using D.P void modularInverse(int n, int prime) { int dp[n + 1]; dp[0] = dp[1] = 1; for (int i = 2; i <= n; i++) dp[i] = dp[prime % i] * (prime - prime / i) % prime; for (int i = 1; i <= n; i++) cout << dp[i] << ' '; } // Driver code int main() { int n = 10, prime = 17; modularInverse(n, prime); return 0; } |
Java
// Java code to find modular inverse // from 1 to n w.r.t a big prime number import java.io.*; class GFG { // Function to calculate modular // inverse using D.P static void modularInverse(int n, int prime) { int dp[]=new int[n + 1]; dp[0] = dp[1] = 1; for (int i = 2; i <= n; i++) dp[i] = dp[prime % i] * (prime - prime / i) % prime; for (int i = 1; i <= n; i++) System.out.print(dp[i] + " "); } // Driver Program public static void main(String args[]) { int n = 10, prime = 17; modularInverse(n, prime); } } // This code is contributed by Nikita Tiwari. |
Python3
# Python 3 code to find # modular inverse # from 1 to n w.r.t a # big prime number # Function to calculate modular # inverse using D.P def modularInverse( n, prime) : dp =[0]*(n+1) dp[0] = dp[1] = 1 for i in range( 2, n+1) : dp[i] = dp[prime % i] *(prime - prime // i) % prime for i in range( 1, n+1) : print(dp[i] ,end=" ") # Driver code n = 10prime = 17 modularInverse(n, prime) # This code is contributed # by Nikita Tiwari. |
C#
// C# code to find modular inverse // from 1 to n w.r.t a big prime number using System; class GFG { // Function to calculate modular // inverse using D.P static void modularInverse(int n, int prime) { int []dp=new int[n + 1]; dp[0] = dp[1] = 1; for (int i = 2; i <= n; i++) dp[i] = dp[prime % i] * (prime - prime / i) % prime; for (int i = 1; i <= n; i++) Console.Write(dp[i] + " "); } // Driver Program public static void Main() { int n = 10, prime = 17; modularInverse(n, prime); } } // This code is contributed by vt_m. |
PHP
<?php // PHP code to find modular // inverse from 1 to n w.r.t // a big prime number // Function to calculate // modular inverse using D.P function modularInverse($n, $prime) { $dp = array(); $dp[0] = $dp[1] = 1; for ($i = 2; $i <= $n; $i++) $dp[$i] = $dp[$prime % $i] * ($prime - intval($prime / $i)) % $prime; for ($i = 1; $i <= $n; $i++) echo ($dp[$i].' '); } // Driver code $n = 10; $prime = 17; modularInverse($n, $prime); // This code is contributed by // Manish Shaw(manishshaw1) ?> |
Output:
1 9 6 13 7 3 5 15 2 12
Time Complexity : O(n)
Auxiliary Space : O(n)
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
Recommended Posts:
- Modular multiplicative inverse
- Modular Exponentiation (Power in Modular Arithmetic)
- Find the value of P and modular inverse of Q modulo 998244353
- Multiplicative order
- Print all multiplicative primes <= N
- Count of multiplicative partitions of N
- Multiplicative Congruence method for generating Pseudo Random Numbers
- How to avoid overflow in modular multiplication?
- Modular Division
- Using Chinese Remainder Theorem to Combine Modular equations
- Find modular node in a linked list
- Number of solutions to Modular Equations
- Trick for modular division ( (x1 * x2 .... xn) / b ) mod (m)
- Modular exponentiation (Recursive)
- Modular Exponentiation of Complex Numbers
- Modular Multiplication
- Modular Addition
- Modular Arithmetic
- Chinese Remainder Theorem | Set 2 (Inverse Modulo based Implementation)
- Adjoint and Inverse of a Matrix
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

