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++
#include<iostream>
using namespace std;
int gcdExtended( int a, int b, int *x, int *y);
int modInverse( int b, int m)
{
int x, y;
int g = gcdExtended(b, m, &x, &y);
if (g != 1)
return -1;
return (x%m + m) % m;
}
void 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;
}
int gcdExtended( int a, int b, int *x, int *y)
{
if (a == 0)
{
*x = 0, *y = 1;
return b;
}
int x1, y1;
int gcd = gcdExtended(b%a, a, &x1, &y1);
*x = y1 - (b/a) * x1;
*y = x1;
return gcd;
}
int main()
{
int a = 8, b = 3, m = 5;
modDivide(a, b, m);
return 0;
}
|
C
#include <stdio.h>
int gcdExtended( int a, int b, int *x, int *y);
int modInverse( int b, int m)
{
int x, y;
int g = gcdExtended(b, m, &x, &y);
if (g != 1)
return -1;
return (x%m + m) % m;
}
void 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) ;
}
}
int gcdExtended( int a, int b, int *x, int *y)
{
if (a == 0)
{
*x = 0, *y = 1;
return b;
}
int x1, y1;
int gcd = gcdExtended(b%a, a, &x1, &y1);
*x = y1 - (b/a) * x1;
*y = x1;
return gcd;
}
int main()
{
int a = 8, b = 3, m = 5;
modDivide(a, b, m);
return 0;
}
|
Java
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);
}
static int modInverse( int b, int m){
int g = gcd(b, m) ;
if (g != 1 )
return - 1 ;
else
{
return ( int )Math.pow(b, m - 2 ) % 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));
}
}
public static void main(String[] args) {
int a = 8 ;
int b = 3 ;
int m = 5 ;
modDivide(a, b, m);
}
}
|
Python3
import math
def modInverse(b,m):
g = math.gcd(b, m)
if (g ! = 1 ):
return - 1
else :
return pow (b, m - 2 , m)
def 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)
a = 8
b = 3
m = 5
modDivide(a, b, m)
|
C#
using System;
class GFG {
static int gcd( int a, int b){
if (b == 0){
return a;
}
return gcd(b, a % b);
}
static int modInverse( int b, int m){
int g = gcd(b, m) ;
if (g != 1){
return -1;
}
else
{
return ( int )Math.Pow(b, m - 2) % 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));
}
}
static void Main() {
int a = 8;
int b = 3;
int m = 5;
modDivide(a, b, m);
}
}
|
Javascript
<script>
function gcd(a, b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
function modInverse(b,m)
{
g = gcd(b, m) ;
if (g != 1)
return -1;
else
{
return Math.pow(b, m - 2, m);
}
}
function 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);
}
a = 8;
b = 3;
m = 5;
modDivide(a, b, m);
</script>
|
PHP
<?php
function modInverse( $b , $m )
{
$x = 0;
$y = 0;
$g = gcdExtended( $b , $m , $x , $y );
if ( $g != 1)
return -1;
return ( $x % $m + $m ) % $m ;
}
function 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 gcdExtended( $a , $b , & $x , & $y )
{
if ( $a == 0)
{
$x = 0;
$y = 1;
return $b ;
}
$x1 = 0;
$y1 = 0;
$gcd = gcdExtended( $b % $a , $a , $x1 , $y1 );
$x = $y1 - (int)( $b / $a ) * $x1 ;
$y = $x1 ;
return $gcd ;
}
$a = 8;
$b = 3;
$m = 5;
modDivide( $a , $b , $m );
?>
|
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.html
This 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
Please Login to comment...