Expressing a fraction as a natural number under modulo ‘m’

Given two integers A and B where A is not divisible by B, the task is to express A / B as a natural number modulo m where m = 1000000007.
Note: This representation is useful where we need to express Probability of an event, Area of Curves and polygons etc.

Examples:

Input: A = 2, B = 6
Output: 333333336

Input: A = 4, B = 5
Output: 600000005



Approach: We know that, A / B can be written as A * (1 / B) i.e. A * (B ^ -1).

It is known that the modulo(%) operator satisfies the relation:

(a * b) % m = ( (a % m) * (b % m) ) % m

So, we can write:

(b ^ -1) % m = (b ^ m-2) % m (Fermat's little theorem)

Therefore the result will be:

( (A mod m) * ( power(B, m-2) % m) ) % m

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
#define m 1000000007
  
// Function to return the GCD of given numbers
int gcd(int a, int b)
{
    if (a == 0)
        return b;
    return gcd(b % a, a);
}
  
// Recursive function to return (x ^ n) % m
ll modexp(ll x, ll n)
{
    if (n == 0) {
        return 1;
    }
    else if (n % 2 == 0) {
        return modexp((x * x) % m, n / 2);
    }
    else {
        return (x * modexp((x * x) % m, (n - 1) / 2) % m);
    }
}
  
// Function to return the fraction modulo mod
ll getFractionModulo(ll a, ll b)
{
    ll c = gcd(a, b);
  
    a = a / c;
    b = b / c;
  
    // (b ^ m-2) % m
    ll d = modexp(b, m - 2);
  
    // Final answer
    ll ans = ((a % m) * (d % m)) % m;
  
    return ans;
}
  
// Driver code
int main()
{
    ll a = 2, b = 6;
  
    cout << getFractionModulo(a, b) << endl;
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
  
import java.io.*;
  
class GFG {
      
  
  
static long m  = 1000000007;
  
// Function to return the GCD of given numbers
 static long gcd(long a, long b)
{
    if (a == 0)
        return b;
    return gcd(b % a, a);
}
  
// Recursive function to return (x ^ n) % m
static long modexp(long x, long n)
{
    if (n == 0) {
        return 1;
    }
    else if (n % 2 == 0) {
        return modexp((x * x) % m, n / 2);
    }
    else {
        return (x * modexp((x * x) % m, (n - 1) / 2) % m);
    }
}
  
// Function to return the fraction modulo mod
 static long getFractionModulo(long a, long b)
{
    long c = gcd(a, b);
  
    a = a / c;
    b = b / c;
  
    // (b ^ m-2) % m
    long  d = modexp(b, m - 2);
  
    // Final answer
    long ans = ((a % m) * (d % m)) % m;
  
    return ans;
}
  
// Driver code
  
    public static void main (String[] args) {
        long a = 2, b = 6;
  
    System.out.println(getFractionModulo(a, b));
    }
}
// This code is contributed by inder_verma

chevron_right


Python3

# Python3 implementation of the approach
m = 1000000007

# Function to return the GCD
# of given numbers
def gcd(a, b):

if (a == 0):
return b
return gcd(b % a, a)

# Recursive function to return (x ^ n) % m
def modexp(x, n):

if (n == 0) :
return 1

elif (n % 2 == 0) :
return modexp((x * x) % m, n // 2)

else :
return (x * modexp((x * x) % m,
(n – 1) / 2) % m)

# Function to return the fraction modulo mod
def getFractionModulo(a, b):

c = gcd(a, b)

a = a // c
b = b // c

# (b ^ m-2) % m
d = modexp(b, m – 2)

# Final answer
ans = ((a % m) * (d % m)) % m

return ans

# Driver code
if __name__ == “__main__”:

a = 2
b = 6

print ( getFractionModulo(a, b))

# This code is contributed by ita_c

C#

filter_none

edit
close

play_arrow

link
brightness_4
code

//C#  implementation of the approach
  
using System;
  
public class GFG{
      
  
static long m = 1000000007;
  
// Function to return the GCD of given numbers
static long gcd(long a, long b)
{
    if (a == 0)
        return b;
    return gcd(b % a, a);
}
  
// Recursive function to return (x ^ n) % m
static long modexp(long x, long n)
{
    if (n == 0) {
        return 1;
    }
    else if (n % 2 == 0) {
        return modexp((x * x) % m, n / 2);
    }
    else {
        return (x * modexp((x * x) % m, (n - 1) / 2) % m);
    }
}
  
// Function to return the fraction modulo mod
static long getFractionModulo(long a, long b)
{
    long c = gcd(a, b);
  
    a = a / c;
    b = b / c;
  
    // (b ^ m-2) % m
    long d = modexp(b, m - 2);
  
    // Final answer
    long ans = ((a % m) * (d % m)) % m;
  
    return ans;
}
  
// Driver code
      
    static public void Main (){
          
        long a = 2, b = 6;
        Console.WriteLine(getFractionModulo(a, b));
    }
}

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the approach
  
// Function to return the GCD of
// given numbers
function abc($a, $b)
{
    if ($a == 0)
        return $b;
    return abc($b % $a, $a);
}
  
// Recursive function to return (x ^ n) % m
function modexp($x, $n)
{
    $m = 1000000007;
    if ($n == 0) 
    {
        return 1;
    }
    else if ($n % 2 == 0)
    {
        return modexp(($x * $x) % $m, $n / 2);
    }
    else 
    {
        return ($x * modexp(($x * $x) % $m
                        ($n - 1) / 2) % $m);
    }
}
  
// Function to return the fraction
// modulo mod
function getFractionModulo($a, $b)
{
    $m = 1000000007;
    $c = abc($a, $b);
      
    $a = $a / $c;
    $b = $b / $c;
  
    // (b ^ m-2) % m
    $d = modexp($b, $m - 2);
  
    // Final answer
    $ans = (($a % $m) * ($d % $m)) % $m;
  
    return $ans;
}
  
// Driver code
$a = 2;
$b = 6;
  
echo(getFractionModulo($a, $b)) ;
  
// This code is contributed 
// by Shivi_Aggarwal
?>

chevron_right


Output:

333333336


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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.