Modular Division

27 May, 2022
Given three positive numbers a, b and m. Compute a/b under modulo m. The task is basically to find a number c such that (b * c) % m = a % m.Examples: 
Input  : a  = 8, b = 4, m = 5
Output : 2

Input  : a  = 8, b = 3, m = 5
Output : 1
Note that (1*3)%5 is same as 8%5

Input  : a  = 11, b = 4, m = 5
Output : 4
Note that (4*4)%5 is same as 11%5
Following articles are prerequisites for this. Modular multiplicative inverse Extended Euclidean algorithms Can we always do modular division? The answer is “NO”. First of all, like ordinary arithmetic, division by 0 is not defined. For example, 4/0 is not allowed. In modular arithmetic, not only 4/0 is not allowed, but 4/12 under modulo 6 is also not allowed. The reason is, 12 is congruent to 0 when modulus is 6.When is modular division defined? Modular division is defined when modular inverse of the divisor exists. The inverse of an integer ‘x’ is another integer ‘y’ such that (x*y) % m = 1 where m is the modulus. When does inverse exist? As discussed here, inverse a number ‘a’ exists under modulo ‘m’ if ‘a’ and ‘m’ are co-prime, i.e., GCD of them is 1.How to find modular division? 
The task is to compute a/b under modulo m.
1) First check if inverse of b under modulo m exists or not. 
    a) If inverse doesn't exists (GCD of b and m is not 1), 
          print "Division not defined"
    b) Else return  "(inverse * a) % m" 
 
C++
C
Java
Python3
C#
Javascript
PHP
// C++ program to do modular division#include<iostream>using namespace std; // C++ function for extended Euclidean Algorithmint gcdExtended(int a, int b, int *x, int *y); // Function to find modulo inverse of b. It returns// -1 when inverse doesn'tint modInverse(int b, int m){    int x, y; // used in extended GCD algorithm    int g = gcdExtended(b, m, &x, &y);     // Return -1 if b and m are not co-prime    if (g != 1)        return -1;     // m is added to handle negative x    return (x%m + m) % m;} // Function to compute a/b under modulo mvoid modDivide(int a, int b, int m){    a = a % m;    int inv = modInverse(b, m);    if (inv == -1)       cout << "Division not defined";    else       cout << "Result of division is " << (inv * a) % m;} // C function for extended Euclidean Algorithm (used to// find modular inverse.int gcdExtended(int a, int b, int *x, int *y){    // Base Case    if (a == 0)    {        *x = 0, *y = 1;        return b;    }     int x1, y1; // To store results of recursive call    int gcd = gcdExtended(b%a, a, &x1, &y1);     // Update x and y using results of recursive    // call    *x = y1 - (b/a) * x1;    *y = x1;     return gcd;} // Driver Programint main(){    int  a  = 8, b = 3, m = 5;    modDivide(a, b, m);    return 0;} //this code is contributed by khushboogoyal499
// C program to do modular division#include <stdio.h> // C function for extended Euclidean Algorithmint gcdExtended(int a, int b, int *x, int *y); // Function to find modulo inverse of b. It returns// -1 when inverse doesn'tint modInverse(int b, int m){    int x, y; // used in extended GCD algorithm    int g = gcdExtended(b, m, &x, &y);     // Return -1 if b and m are not co-prime    if (g != 1)        return -1;     // m is added to handle negative x    return (x%m + m) % m;} // Function to compute a/b under modulo mvoid modDivide(int a, int b, int m){    a = a % m;    int inv = modInverse(b, m);    if (inv == -1)     printf ("Division not defined");    else    {      int c = (inv * a) % m ;       printf ("Result of division is %d", c) ;    }} // C function for extended Euclidean Algorithm (used to// find modular inverse.int gcdExtended(int a, int b, int *x, int *y){    // Base Case    if (a == 0)    {        *x = 0, *y = 1;        return b;    }     int x1, y1; // To store results of recursive call    int gcd = gcdExtended(b%a, a, &x1, &y1);     // Update x and y using results of recursive    // call    *x = y1 - (b/a) * x1;    *y = x1;     return gcd;} // Driver Programint main(){    int  a  = 8, b = 3, m = 5;    modDivide(a, b, m);    return 0;}
// java program to do modular division import java.io.*;import java.lang.Math; public class GFG {     static int gcd(int a,int b){        if (b == 0){            return a;        }                return gcd(b, a % b);    }         // Function to find modulo inverse of b. It returns    // -1 when inverse doesn't    // modInverse works for prime m    static int modInverse(int b,int m){        int g = gcd(b, m) ;        if (g != 1)            return -1;        else        {            //If b and m are relatively prime,            //then modulo inverse is b^(m-2) mode m            return (int)Math.pow(b, m - 2) % m;        }    }         // Function to compute a/b under modulo m    static void modDivide(int a,int b,int m){        a = a % m;        int inv = modInverse(b,m);        if(inv == -1){            System.out.println("Division not defined");        }          else{             System.out.println("Result of Division is " + ((inv*a) % m));        }    }          // Driver Program    public static void main(String[] args) {        int a = 8;        int b = 3;        int m = 5;        modDivide(a, b, m);    }} // The code is contributed by Gautam goel (gautamgoel962)
# Python3 program to do modular divisionimport math # Function to find modulo inverse of b. It returns# -1 when inverse doesn't# modInverse works for prime mdef modInverse(b,m):    g = math.gcd(b, m)    if (g != 1):        # print("Inverse doesn't exist")        return -1    else:        # If b and m are relatively prime,        # then modulo inverse is b^(m-2) mode m        return pow(b, m - 2, m)  # Function to compute a/b under modulo mdef modDivide(a,b,m):    a = a % m    inv = modInverse(b,m)    if(inv == -1):        print("Division not defined")    else:        print("Result of Division is ",(inv*a) % m) # Driver Programa = 8b = 3m = 5modDivide(a, b, m) # This code is Contributed by HarendraSingh22
using System; // C# program to do modular divisionclass GFG {   // Recursive Function  to find  // GCD of two numbers  static int gcd(int a,int b){    if (b == 0){      return a;    }            return gcd(b, a % b);  }   // Function to find modulo inverse of b. It returns  // -1 when inverse doesn't  // modInverse works for prime m  static int modInverse(int b,int m){    int g = gcd(b, m) ;    if (g != 1){      return -1;    }           else    {       //If b and m are relatively prime,      //then modulo inverse is b^(m-2) mode m      return (int)Math.Pow(b, m - 2) % m;    }  }   // Function to compute a/b under modulo m  static void modDivide(int a,int b,int m){    a = a % m;    int inv = modInverse(b,m);    if(inv == -1){      Console.WriteLine("Division not defined");    }      else{      Console.WriteLine("Result of Division is " + ((inv*a) % m));    }  }    // Driver Code  static void Main() {    int a = 8;    int b = 3;    int m = 5;    modDivide(a, b, m);  }} // The code is contributed by Gautam goel (gautamgoel962)
<script>// JS program to do modular divisionfunction gcd(a, b){    if (b == 0)        return a;    return gcd(b, a % b);} // Function to find modulo inverse of b. It returns// -1 when inverse doesn't// modInverse works for prime mfunction modInverse(b,m){    g = gcd(b, m) ;    if (g != 1)        return -1;    else    {        //If b and m are relatively prime,        //then modulo inverse is b^(m-2) mode m        return Math.pow(b, m - 2, m);    }} // Function to compute a/b under modulo mfunction modDivide(a,b,m){    a = a % m;    inv = modInverse(b,m);    if(inv == -1)        document.write("Division not defined");    else        document.write("Result of Division is ",(inv*a) % m);} // Driver Programa = 8;b = 3;m = 5;modDivide(a, b, m); // This code is Contributed by phasing17</script>
<?php// PHP program to do modular division // Function to find modulo inverse of b.// It returns -1 when inverse doesn'tfunction modInverse($b, $m){    $x = 0;    $y = 0; // used in extended GCD algorithm    $g = gcdExtended($b, $m, $x, $y);     // Return -1 if b and m are not co-prime    if ($g != 1)        return -1;     // m is added to handle negative x    return ($x % $m + $m) % $m;} // Function to compute a/b under modulo mfunction modDivide($a, $b, $m){    $a = $a % $m;    $inv = modInverse($b, $m);    if ($inv == -1)        echo "Division not defined";    else        echo "Result of division is " .                      ($inv * $a) % $m;} // function for extended Euclidean Algorithm// (used to find modular inverse.function gcdExtended($a, $b, &$x, &$y){    // Base Case    if ($a == 0)    {        $x = 0;        $y = 1;        return $b;    }     $x1 = 0;    $y1 = 0; // To store results of recursive call    $gcd = gcdExtended($b % $a, $a, $x1, $y1);     // Update x and y using results of    // recursive call    $x = $y1 - (int)($b / $a) * $x1;    $y = $x1;     return $gcd;} // Driver Code$a = 8;$b = 3;$m = 5;modDivide($a, $b, $m); // This code is contributed by mits?>
Output: 
Result of division is 1
Modular division is different from addition, subtraction and multiplication. One difference is division doesn’t always exist (as discussed above). Following is another difference.  
Below equations are valid
(a * b) % m = ((a % m) * (b % m)) % m
(a + b) % m = ((a % m) + (b % m)) % m

// m is added to handle negative numbers
(a - b + m) % m = ((a % m) - (b % m) + m) % m 

But, 
(a / b) % m may NOT be same as ((a % m)/(b % m)) % m

For example, a = 10, b = 5, m = 5. 
   (a / b) % m is 2, but ((a % m) / (b % m)) % m 
                          is not defined.
References: http://www.doc.ic.ac.uk/~mrh/330tutor/ch03.htmlThis article is contributed by Dheeraj Gupta. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
Mithun Kumar
dungeonmaster10110
khushboogoyal499
mayunitp
phasing17
gautamgoel962
Modular Arithmetic
Mathematical
Mathematical
Modular Arithmetic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays
Coin Change | DP-7
Operators in C / C++
Prime Numbers
Program to find GCD or HCF of two numbers
Find minimum number of coins that make a given value