A non-negative integer is a perfect square when it equals some integer k multiplied by itself: n = k × k.
Remember
n is a perfect square ⇔ ∃ integer k ≥ 0 such that k² = n
Examples:
0 = 0²
1 = 1²
9 = 3²
16 = 4²
10 → no integer square root
n
√n idea
Perfect square?
16
4 × 4
Yes
25
5 × 5
Yes
10
between 3² and 4²
No
0
0 × 0
Yes
Approach
How to Check a Perfect Square in Python
Four clear steps — then pick an integer loop or an isqrt-and-verify check.
Reject negatives (this tutorial treats only n >= 0).
Try candidate roots i = 0, 1, 2, … while i * i <= n.
If some i * i == n, return true; if you pass n, return false.
Or compute root = math.isqrt(n) and verify root * root == n.
Method
Idea
Time
Best for
Integer loop
Compare i * i with n
O(√n)
Interviews without floating point
isqrt + verify
Square the integer root back
O(1)
Short production-style checks
Pseudocode
Pseudocode
function is_perfect_square(n):
if n < 0: return false
i = 0
while i * i <= n:
if i * i == n:
return true
i = i + 1
return false
Reference
Cheat Sheet
Keep these facts handy while writing the program.
Topic
Detail
Definition
n = k² for some integer k ≥ 0
Zero
0 is a perfect square
Negatives
Not perfect squares here
Loop stop
While i * i <= n
isqrt verify
root * root == n
Classic checks
16 yes; 10 no; 25 yes
Try it
Live Preview
Enter an integer to see the nearest integer root and the perfect-square check.
Whole numbers only. Negatives are not perfect squares here. Tap a chip or type a value.
Result
n = 16
root = 4
4 × 4 = 16
16 is a perfect square
Trace
Worked Walkthrough — n = 16
Try successive integer squares until you match or pass 16.
Calculation
i = 0 → 0² = 0
i = 1 → 1² = 1
i = 2 → 2² = 4
i = 3 → 3² = 9
i = 4 → 4² = 16 ← equal to n
16 is a perfect square
isqrt path:
math.isqrt(16) = 4
4 * 4 == 16 → same answer
Code
Python Programs
Start with the integer loop so you never rely on floating point. Use isqrt-and-verify when you want a short, clear check.
Example 1 — Integer Loop
Increase i while i * i <= n and look for an exact match.
python
def is_perfect_square(n):
if n < 0:
return False
i = 0
while i * i <= n:
if i * i == n:
return True
i += 1
return False
number = 16
if is_perfect_square(number):
print(f"{number} is a perfect square")
else:
print(f"{number} is not a perfect square")
Output
16 is a perfect square
How It Works
Negatives return False immediately.
The loop condition i * i <= n stops once squares go past n.
Each step checks whether i * i equals n.
For 16, i = 4 matches and the function returns True.
If no match appears before the loop ends, the answer is False.
Example 2 — isqrt + Verify
Take the integer square root, then square it back to confirm an exact match.
python
import math
def is_perfect_square(n):
if n < 0:
return False
root = math.isqrt(n)
return root * root == n
print(is_perfect_square(16)) # True
print(is_perfect_square(10)) # False
print(is_perfect_square(0)) # True
print(is_perfect_square(-4)) # False
Output
True
False
True
False
How It Works
Same non-negative rule as Example 1.
math.isqrt(n) returns the largest integer root with root * root <= n.
Squaring root again and comparing with n confirms an exact square.
For 10, root is 3 and 9 != 10, so the result is false.
Prefer this over math.sqrt so you stay in integers end to end.
Edge Cases & Pitfalls
Check these before calling the solution done.
0
Zero counts
0 = 0². Do not special-case it as false.
Negatives
Not squares here
Return False for n < 0 in this beginner definition.
Floats
Avoid bare math.sqrt
If you use math.sqrt, always verify by squaring the truncated root. Prefer math.isqrt.
isqrt
Always verify
isqrt alone gives a floor root — square it back to confirm equality.
Analysis
Time and Space Complexity
Program
Time
Extra space
Integer loop
O(√n)
O(1)
isqrt + verify
O(1)
O(1)
Both are fine for interviews. Prefer the loop when you must avoid library math discussion.
Remember
Key Takeaways
Definition:n = k² for some integer k ≥ 0.
Loop: test i * i while i * i <= n.
isqrt: then verify root * root == n.
Test set: 0 → yes; 16 → yes; 10 → no; -4 → no.
One line: find an integer root whose square equals n — by looping or by verifying math.isqrt.
Frequently Asked Questions
A non-negative integer that equals some integer multiplied by itself. Examples: 0, 1, 4, 9, 16, 25.
Loop with i*i until you match or pass n, or take math.isqrt(n) and verify root*root == n.
Yes. 0 = 0 × 0.
isqrt returns an exact integer floor root. If you use math.sqrt, always square the truncated root back and compare — never trust the float alone.
A loop up to √n is O(√n). The isqrt-and-verify method is O(1) for practical interview sizes (constant-time math call plus a few ops).