Given two numbers a and b find all x such that a % x = b

30 Mar, 2021
Given two numbers a and b find all x such that a % x = b.
Examples:  
Input : a = 21, b = 5
Output : 2
The answers of the Modular Equation are
8 and 16 since 21 % 8 = 21 % 16 = 5 .
Here 3 cases arises :
If ( a < b ) then there will be no answer .If ( a = b ) then all the numbers greater than a are the answer so there will be infinite solutions possible.If ( a > b ) Suppose x is an answer to our equation. Then x divides (a – b). Also since a % x = b then b < x. These conditions are necessary and sufficient as well. So the answer is number of divisors of a – b which are strictly greater than b which can be solved in O(sqrt( a-b )). Here only one case arises which we have to deal separately when (a-b) is perfect square then we will add its square root two times so we have to subtract one times, if this case arises.
If ( a < b ) then there will be no answer .
If ( a = b ) then all the numbers greater than a are the answer so there will be infinite solutions possible.
If ( a > b ) Suppose x is an answer to our equation. Then x divides (a – b). Also since a % x = b then b < x. These conditions are necessary and sufficient as well. So the answer is number of divisors of a – b which are strictly greater than b which can be solved in O(sqrt( a-b )). Here only one case arises which we have to deal separately when (a-b) is perfect square then we will add its square root two times so we have to subtract one times, if this case arises.
C++
Java
Python3
C#
PHP
Javascript
// C++ program to find x such that a % x is equal// to b.#include <bits/stdc++.h>using namespace std; void modularEquation(int a, int b){    // if a is less than b then no solution    if (a < b) {        cout << "No solution possible " << endl;        return;    }     // if a is equal to b then every number    // greater than a will be the solution    // so its infinity    if (a == b) {        cout << "Infinite Solution possible " << endl;        return;    }     // all resultant number should be greater than    // b and (a-b) should be divisible by resultant    // number     // count variable store the number of values    // possible    int count = 0;    int n = a - b;    int y = sqrt(a - b);    for (int i = 1; i <= y; ++i) {        if (n % i == 0) {             // checking for both divisor and quotient            // whether they divide ( a-b ) completely            // and greater than b .            if (n / i > b)                count++;            if (i > b)                count++;        }    }     // Here y is added twice in the last iteration    // so 1 y should be decremented to get correct    // solution    if (y * y == n && y > b)        count--;     cout << count << endl;} // Driver codeint main(){    int a = 21, b = 5;    modularEquation(a, b);    return 0;}
// Java program to find x such that// a % x is equal to b.import java.io.*;class GFG {     static void modularEquation(int a, int b){    // if a is less than b then no solution    if (a < b) {        System.out.println("No solution possible ");        return;    }     // if a is equal to b then every number    // greater than a will be the solution    // so its infinity    if (a == b) {        System.out.println("Infinite Solution possible ");        return;    }     // all resultant number should be greater    // than b and (a-b) should be divisible    // by resultant number     // count variable store the number of    // values possible    int count = 0;    int n = a - b;    int y = (int)Math.sqrt(a - b);    for (int i = 1; i <= y; ++i) {        if (n % i == 0) {             // checking for both divisor and            // quotient whether they divide            // ( a-b ) completely and            // greater than b .            if (n / i > b)                count++;            if (i > b)                count++;        }    }     // Here y is added twice in the last    // iteration so 1 y should be decremented    // to get correct solution    if (y * y == n && y > b)        count--;     System.out.println(count);} // Driver codepublic static void main(String[] args){    int a = 21, b = 5;    modularEquation(a, b);}} // This code is contributed by Prerna Saini
# Python3 program to find x such# that a % x is equal to b. import mathdef modularEquation(a, b) :         # if a is less than b then no solution    if (a < b) :        print("No solution possible ")        return         # if a is equal to b then every number    # greater than a will be the solution    # so its infinity    if (a == b) :        print("Infinite Solution possible ")        return         # all resultant number should be    # greater than b and (a-b) should    # be divisible by resultant number      # count variable store the number    # of values possible    count = 0    n = a - b    y = (int)(math.sqrt(a - b))    for i in range(1, y+1) :        if (n % i == 0) :                         # checking for both divisor            # and quotient whether they            # divide ( a-b ) completely            # and greater than b .            if (n / i > b) :                count = count + 1            if (i > b) :                count = count  + 1                        # Here y is added twice in the    # last iteration so 1 y should be    # decremented to get correct    # solution    if (y * y == n and y > b) :        count = count - 1      print (count)  # Driver codea = 21b = 5modularEquation(a, b) # This code is contributed by Nikita Tiwari.
// C# program to find x such that// a % x is equal to b.using System; class GFG {     static void modularEquation(int a, int b){    // if a is less than b then no solution    if (a < b) {        Console.WriteLine("No solution possible ");        return;    }     // if a is equal to b then every number    // greater than a will be the solution    // so its infinity    if (a == b) {        Console.WriteLine("Infinite Solution possible ");        return;    }     // all resultant number should be greater    // than b and (a-b) should be divisible    // by resultant number     // count variable store the number of    // values possible    int count = 0;    int n = a - b;    int y = (int)Math.Sqrt(a - b);    for (int i = 1; i <= y; ++i) {        if (n % i == 0) {             // checking for both divisor and            // quotient whether they divide            // ( a-b ) completely and            // greater than b .            if (n / i > b)                count++;            if (i > b)                count++;        }    }     // Here y is added twice in the last    // iteration so 1 y should be decremented    // to get correct solution    if (y * y == n && y > b)        count--;     Console.WriteLine(count);} // Driver codepublic static void Main(){    int a = 21, b = 5;    modularEquation(a, b);}} //This code is contributed by vt_m.
<?php// PHP program to find x// such that a % x is equal// to b. function modularEquation($a, $b){         // if a is less than b    // then no solution    if ($a < $b)    {        echo "No solution possible " ;        return;    }     // if a is equal to b    // then every number    // greater than a will    // be the solution    // so its infinity    if ($a == $b)    {        echo "Infinite Solution possible ";        return;    }     // all resultant number    // should be greater than    // b and (a-b) should be    // divisible by resultant    // number     // count variable store    // the number of values    // possible    $count = 0;    $n = $a - $b;    $y = sqrt($a - $b);    for ( $i = 1; $i <= $y; ++$i)    {        if ($n % $i == 0) {             // checking for both            // divisor and quotient            // whether they divide            // ( a-b ) completely            // and greater than b .            if ($n / $i > $b)                $count++;            if ($i > $b)                $count++;        }    }     // Here y is added twice    // in the last iteration    // so 1 y should be    // decremented to get correct    // solution    if ($y * $y == $n && $y > $b)        $count--;     echo $count ;}     // Driver Code    $a = 21;    $b = 5;    modularEquation($a, $b); // This code is contributed by anuj_67.?>
<script> // Javascript program to find x// such that a % x is equal// to b.function modularEquation(a, b){         // If a is less than b    // then no solution    if (a < b)    {        document.write("No solution possible ");        return;    }     // If a is equal to b then every    // number greater than a will    // be the solution so its infinity    if (a == b)    {        document.write("Infinite Solution possible ");        return;    }     // All resultant number should be    // greater than b and (a-b) should be    // divisible by resultant number     // Count variable store the number    // of values possible    let count = 0;    let n = a - b;    let y = Math.sqrt(a - b);    for(let i = 1; i <= y; ++i)    {        if (n % i == 0)        {                         // checking for both            // divisor and quotient            // whether they divide            // ( a-b ) completely            // and greater than b .            if (n / i > b)                count++;            if (i > b)                count++;        }    }     // Here y is added twice    // in the last iteration    // so 1 y should be    // decremented to get correct    // solution    if (y * y == n && y > b)        count--;     document.write(count);} // Driver Codelet a = 21;let b = 5; modularEquation(a, b); // This code is contributed by _saurabh_jaiswal. </script>
Output: 
2
 
vt_m
sanskar27jain
_saurabh_jaiswal
Modular Arithmetic
number-theory
Mathematical
Technical Scripter
number-theory
Mathematical
Modular Arithmetic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Operators in C / C++
Prime Numbers
Find minimum number of coins that make a given value
Minimum number of jumps to reach end
Algorithm to solve Rubik's Cube
Modulo 10^9+7 (1000000007)
The Knight's tour problem | Backtracking-1
Modulo Operator (%) in C/C++ with Examples
Program for factorial of a number