Python Program for Number of solutions to Modular Equations
Last Updated : 27 Jul, 2023
Given A and B, the task is to find the number of possible values that X can take such that the given modular equation (A mod X) = B holds good. Here, X is also called a solution of the modular equation.
Examples:
Input : A = 26, B = 2
Output : 6
Explanation
X can be equal to any of {3, 4, 6, 8,
12, 24} as A modulus any of these values
equals 2 i. e., (26 mod 3) = (26 mod 4)
= (26 mod 6) = (26 mod 8) =Output:2 Input : 21 5
Output : 2
Explanation
X can be equal to any of {8, 16} as A modulus
any of these values equals 5 i.e. (21 mod
8) = (21 mod 16) = 5
If we carefully analyze the equation A mod X = B its easy to note that if (A = B) then there are infinitely many values greater than A that X can take. In the Case when (A < B), there cannot be any possible value of X for which the modular equation holds. So the only case we are left to investigate is when (A > B).So now we focus on this case in depth. Now, in this case we can use a well known relation i.e.
Dividend = Divisor * Quotient + Remainder
We are looking for all possible X i.e. Divisors given A i.e Dividend and B i.e., remainder. So,
We can say,
A = X * Quotient + BLet Quotient be represented as Y
∴ A = X * Y + B
A - B = X * Y∴ To get integral values of Y,
we need to take all X such that X divides (A - B)∴ X is a divisor of (A - B)
Python Program for Number of solutions to Modular Equations
So, the problem reduces to finding the divisors of (A - B) and the number of such divisors is the possible values X can take. But as we know A mod X would result in values from (0 to X - 1) we must take all such X such that X > B. Thus, we can conclude by saying that the number of divisors of (A - B) greater than B, are the all possible values X can take to satisfy A mod X = B
Python3 # Python Program to find number of possible # values of X to satisfy A mod X = B import math # Returns the number of divisors of (A - B) # greater than B def calculateDivisors (A, B): N = A - B noOfDivisors = 0 a = math.sqrt(N) for i in range(1, int(a + 1)): # if N is divisible by i if ((N % i == 0)): # count only the divisors greater than B if (i > B): noOfDivisors +=1 # checking if a divisor isnot counted twice if ((N / i) != i and (N / i) > B): noOfDivisors += 1; return noOfDivisors # Utility function to calculate number of all # possible values of X for which the modular # equation holds true def numberOfPossibleWaysUtil (A, B): # if A = B there are infinitely many solutions # to equation or we say X can take infinitely # many values > A. We return -1 in this case if (A == B): return -1 # if A < B, there are no possible values of # X satisfying the equation if (A < B): return 0 # the last case is when A > B, here we calculate # the number of divisors of (A - B), which are # greater than B noOfDivisors = 0 noOfDivisors = calculateDivisors; return noOfDivisors # Wrapper function for numberOfPossibleWaysUtil() def numberOfPossibleWays(A, B): noOfSolutions = numberOfPossibleWaysUtil(A, B) #if infinitely many solutions available if (noOfSolutions == -1): print ("For A = " , A , " and B = " , B , ", X can take Infinitely many values" , " greater than " , A) else: print ("For A = " , A , " and B = " , B , ", X can take " , noOfSolutions , " values") # main() A = 26 B = 2 numberOfPossibleWays(A, B) A = 21 B = 5 numberOfPossibleWays(A, B) # Contributed by _omg
Output:
For A = 26 and B = 2, X can take 6 values
For A = 21 and B = 5, X can take 2 values
Time Complexity of the above approach is nothing but the time complexity of finding the number of divisors of (A - B) ie O(√(A - B)) Please refer complete article on Number of solutions to Modular Equations for more details!
Method 2:
The new approach for solving the problem of finding the number of possible values of X to satisfy A mod X = B involves:
- Checking for special cases where the solution is either infinite or non-existent.
- Calculating the difference between A and B, and finding all its divisors.
- Counting the number of divisors that are greater than B.
- Returning the count of such divisors as the number of possible values of X.
Python3 # function to calculate the number of possible values for X def numberOfPossibleWays(A, B): # if A and B are equal, there are no possible values for X if A == B: return -1 # if A is less than B, X cannot be greater than B elif A < B: return 0 else: count = 0 diff = A - B sqrt_diff = int(diff ** 0.5) # iterate over the range of square root of difference for i in range(1, sqrt_diff + 1): # check if i is a factor of the difference if diff % i == 0: # if i is greater than B, increment the count if i > B: count += 1 # check if the quotient is greater than B and not equal to i, then increment the count if diff // i != i and diff // i > B: count += 1 return count # test case 1 A = 26 B = 2 print("For A =", A, "and B =", B, ", X can take", numberOfPossibleWays(A, B), "values") # test case 2 A = 21 B = 5 print("For A =", A, "and B =", B, ", X can take", numberOfPossibleWays(A, B), "values") # Contributed by adityasha4x71
OutputFor A = 26 and B = 2 , X can take 6 values For A = 21 and B = 5 , X can take 2 values
Time Complexity: O(sqrt(A-B)), because the loop iterates from 1 to the square root of A-B.
Auxiliary Space: O(1)
Similar Reads
Python Program to find the Quotient and Remainder of two numbers Given two numbers n and m. The task is to find the quotient and remainder of two numbers by dividing n by m. Examples: Input: n = 10 m = 3 Output: Quotient: 3 Remainder 1 Input n = 99 m = 5 Output: Quotient: 19 Remainder 4 Method 1: Naive approach The naive approach is to find the quotient using the
2 min read
Python | Program to count number of lists in a list of lists Given a list of lists, write a Python program to count the number of lists contained within the list of lists. Examples: Input : [[1, 2, 3], [4, 5], [6, 7, 8, 9]] Output : 3 Input : [[1], ['Bob'], ['Delhi'], ['x', 'y']] Output : 4 Method #1 : Using len() Python3 # Python3 program to Count number #
5 min read
Python Program to Count Non-Bouncy numbers If any number is represented in such a way that when we are reading it from left to right each ith Digit is greater or equal than i-1th digit is known as an increasing number. And if digits of any number are decreasing from left to right it's known as decreasing number.` Example: Increasing Number ?
2 min read
Python3 Program to Count rotations divisible by 4 Given a large positive number as string, count all rotations of the given number which are divisible by 4. Examples: Input: 8Output: 1Input: 20Output: 1Rotation: 20 is divisible by 4 02 is not divisible by 4Input : 13502Output : 0No rotation is divisible by 4Input : 43292816Output : 55 rotations are
2 min read
Python Program to Find Numbers Divisible by Another Number We are given a list of numbers and a number. We have to find all the numbers in the list that are divisible by the given single number. Examples:Input: list=[8, 14, 21, 36, 43], num=3Output: 21, 36, 57Input: list=[2, 17, 25, 31, 48, 55], num=5Output: 25, 55In this article, we will discuss the differ
3 min read