![]() |
VOOZH | about |
Given a number 'n' and a prime p, find if square root of n under modulo p exists or not. A number x is square root of n under modulo p if (x*x)%p = n%p.
Examples :
Input: n = 2, p = 5 Output: false There doesn't exist a number x such that (x*x)%5 is 2 Input: n = 2, p = 7 Output: true There exists a number x such that (x*x)%7 is 2. The number is 3.
A Naive Method is to try every number x where x varies from 2 to p-1. For every x, check if (x * x) % p is equal to n % p.
Output :
Yes
Time Complexity of this method is O(p).
Space Complexity: O(1) since only constant variables being used
This problem has a direct solution based on Euler's Criterion.
Euler's criterion states that
Square root of n under modulo p exists if and only if n(p-1)/2 % p = 1 Here square root of n exists means is, there exist an integer x such that (x * x) % p = 1
Below is implementation based on above criterion. Refer Modular Exponentiation for power function.
Output :
Yes
How does this work?
If p is a prime, then it must be an odd number and (p-1) must be an even, i.e., (p-1)/2 must be an integer. Suppose a square root of n under modulo p exists, then there must exist an integer x such that, x2 % p = n % p or, x2 ? n mod p Raising both sides to power (p-1)/2, (x2)(p-1)/2 ? n(p-1)/2 mod p xp-1 ? n(p-1)/2 mod p Since p is a prime, from Fermat's theorem, we can say that xp-1 ? 1 mod p Therefore, n(p-1)/2 ? 1 mod p
Time Complexity: O(logp)
Auxiliary Space: O(1)
You may like to see below:
Find Square Root under Modulo p | Set 1 (When p is in form of 4*i + 3)