Check if Number is Prime in DSA Python - Time & Space Complexity
We want to understand how the time to check if a number is prime grows as the number gets bigger.
Specifically, how many steps does it take to decide if a number has any divisors?
Analyze the time complexity of the following code snippet.
def is_prime(n: int) -> bool:
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
This code checks if a number n is prime by testing all numbers from 2 up to n-1 for divisibility.
- Primary operation: The for-loop that tests divisibility from 2 to n-1.
- How many times: Up to n-2 times in the worst case (when n is prime).
As the number n grows, the number of divisibility checks grows roughly the same as n.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Up to 8 checks |
| 100 | Up to 98 checks |
| 1000 | Up to 998 checks |
Pattern observation: The number of steps grows roughly in a straight line with n.
Time Complexity: O(n)
This means the time to check if a number is prime grows directly with the size of the number.
[X] Wrong: "Checking divisibility up to n/2 is enough and faster than checking up to n."
[OK] Correct: While checking up to n/2 reduces steps, it is still linear and not optimal. The best known simple method checks only up to the square root of n, which is much faster.
Understanding this time complexity helps you explain how to improve prime checks and shows you can analyze simple loops clearly.
"What if we change the loop to run only up to the square root of n? How would the time complexity change?"
Practice
prime?Solution
Step 1: Understand the definition of prime number
A prime number is a number greater than 1 that has no divisors other than 1 and itself.Step 2: Compare options with definition
Only It has exactly two distinct positive divisors: 1 and itself. correctly states this definition.Final Answer:
It has exactly two distinct positive divisors: 1 and itself. -> Option AQuick Check:
Prime number = two divisors [OK]
- Thinking even numbers are always prime
- Confusing prime with odd numbers
- Believing prime numbers have multiple divisors
n is prime?Solution
Step 1: Analyze the loop range and condition
for i in range(2, n): if n % i == 0: return False; return True checks divisibility from 2 to n-1, which is correct for prime checking.Step 2: Check the condition for returning False
If any divisor divides n evenly (remainder 0), return False; else True after loop ends.Final Answer:
for i in range(2, n): if n % i == 0: return False; return True -> Option CQuick Check:
Check divisors from 2 to n-1 for remainder 0 [OK]
- Starting loop from 1 instead of 2
- Checking for remainder not equal to zero
- Checking if remainder equals 1 instead of 0
n = 11?
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
print(is_prime(11))Solution
Step 1: Check if n is less than or equal to 1
Since 11 > 1, skip the first return False.Step 2: Loop from 2 to sqrt(11) + 1 (which is 4)
Check divisibility by 2 and 3; 11 % 2 != 0 and 11 % 3 != 0, so loop ends without returning False.Step 3: Return True after loop
No divisor found, so function returns True.Final Answer:
True -> Option AQuick Check:
11 is prime, so output is True [OK]
- Looping up to n instead of sqrt(n)
- Returning False too early
- Not handling n <= 1 case
def is_prime(n):
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
return False
else:
return TrueSolution
Step 1: Identify the problem with else inside the loop
The else causes the function to return True on first non-divisor, which is incorrect.Step 2: Fix by removing else and returning True after loop
Return True only after checking all divisors without finding any.Final Answer:
Remove the else block inside the loop to return True after loop ends -> Option DQuick Check:
Return True only after full divisor check [OK]
- Returning True too early inside loop
- Starting loop from 1
- Changing condition to wrong remainder check
n is prime efficiently. Which approach is best?Solution
Step 1: Understand the efficiency of divisor checking
Checking up to n-1 or n is slow for large n; checking only 2 and 3 misses other divisors.Step 2: Use the mathematical fact that divisors come in pairs
If n has a divisor greater than sqrt(n), it must have a corresponding divisor less than sqrt(n).Step 3: Check divisibility only up to sqrt(n)
This reduces the number of checks drastically and is the best approach.Final Answer:
Check divisibility from 2 to sqrt(n) -> Option BQuick Check:
Divisors up to sqrt(n) suffice for prime check [OK]
- Checking all numbers up to n
- Checking only 2 and 3
- Starting divisor check from 1
Ready to prove it?
Pass the test and this pattern moves unknown
