square root
integer part
computational mathematics
algorithm optimization
fast calculation

Fastest way to get the integer part of sqrtn?

Data Structures & Algorithms practice on Codemia

Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.

Practice algorithms

Introduction

The integer square root of n is the largest integer k such that k * k is less than or equal to n. It appears in primality checks, geometry calculations, and many search algorithms. The fastest method depends on language and runtime, but in Python the built-in math.isqrt is usually the best choice for exact integer results.

Core Sections

Use math.isqrt in Python

math.isqrt computes exact integer square roots without floating-point precision issues.

python
1import math
2
3values = [0, 1, 2, 3, 4, 10, 10**12 + 123]
4for n in values:
5    print(n, math.isqrt(n))

This is fast, precise, and handles arbitrarily large Python integers.

Why int(math.sqrt(n)) is weaker

Floating-point square root can lose precision for very large integers. Casting to int may produce off-by-one errors near perfect squares.

python
1import math
2
3n = 10**30
4approx = int(math.sqrt(n))
5exact = math.isqrt(n)
6print(approx, exact, approx == exact)

For correctness-critical code, avoid float-based conversion for large integer ranges.

Binary search approach for environments without isqrt

If your language lacks an integer square root helper, binary search is reliable.

python
1def isqrt_binary(n: int) -> int:
2    if n < 0:
3        raise ValueError("n must be non-negative")
4    lo, hi = 0, n
5    ans = 0
6    while lo <= hi:
7        mid = (lo + hi) // 2
8        sq = mid * mid
9        if sq <= n:
10            ans = mid
11            lo = mid + 1
12        else:
13            hi = mid - 1
14    return ans
15
16print(isqrt_binary(10))
17print(isqrt_binary(10**12 + 15))

Time complexity is logarithmic in n.

Newton method for high performance scenarios

Newton iteration converges quickly and can be efficient for big integers.

python
1def isqrt_newton(n: int) -> int:
2    if n < 0:
3        raise ValueError("n must be non-negative")
4    if n < 2:
5        return n
6    x = n
7    while True:
8        y = (x + n // x) // 2
9        if y >= x:
10            return x
11        x = y
12
13print(isqrt_newton(10))
14print(isqrt_newton(999999999999999999))

Always verify final value with the invariant k * k <= n < (k + 1) * (k + 1).

Microbenchmark responsibly

When measuring speed, benchmark methods with representative ranges. Tiny numbers may hide differences that matter for big inputs.

python
1import math, time
2
3nums = [10**12 + i for i in range(10000)]
4start = time.perf_counter()
5for n in nums:
6    math.isqrt(n)
7print("isqrt", time.perf_counter() - start)

Benchmark in your actual environment because interpreter version and CPU matter.

Practical recommendation

For Python 3.8 and newer, use math.isqrt unless you have a very specific constraint. Keep fallback implementations only when portability requires it. In mixed-language systems, verify behavior across boundaries so all services use the same definition for integer square root.

Cross-language equivalents

If you work beyond Python, choose native integer square root utilities when available. In Java, use binary search with long. In C plus plus, avoid floating conversion for large integers and prefer integer arithmetic loops. In Rust, use integer methods or checked arithmetic patterns.

A useful portability rule is to define one shared contract: return the greatest integer k that satisfies k * k <= n. Then keep language-specific implementation details hidden behind a small helper. This ensures consistent behavior across services and avoids off-by-one mismatches in distributed systems that share numeric logic.

Common Pitfalls

  • Using float square root and truncation for very large integers.
  • Forgetting to validate negative inputs before computing square roots.
  • Returning approximate results in code that requires exact integer bounds.
  • Benchmarking only tiny values and assuming conclusions scale.
  • Implementing custom algorithms without invariant checks.

Summary

  • math.isqrt is the fastest and safest standard approach in Python.
  • Float-based truncation can fail for large integers.
  • Binary search and Newton methods are reliable fallback algorithms.
  • Validate output invariants to guarantee correctness.
  • Measure performance with realistic input sizes before optimizing.

Related reading
Course
Intermediate
27 lessons
15 hours
DSA Fundamentals

Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.

View the course
Track what you have practised

A free account saves your progress, solutions and study plan across every problem on Codemia.

Data Structures & Algorithms practice on Codemia

Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.

Practice algorithms

All Rights Reserved.