Search code examples
pythonpython-3.xmath

Is cube root integer?


This seems to be simple but I cannot find a way to do it. I need to show whether the cube root of an integer is integer or not. I used is_integer() float method in Python 3.4 but that wasn't successful. As

x = (3**3)**(1/3.0) 
is_integer(x)    
True

but

x = (4**3)**(1/3.0) 
is_integer(x)    
False

I tried x%1 == 0,x == int(x) and isinstance(x,int) with no success.

I'd appreciate any comment.


Solution

  • For small numbers (<~1013 or so), you can use the following approach:

    def is_perfect_cube(n):
        c = int(n**(1/3.))
        return (c**3 == n) or ((c+1)**3 == n)
    

    This truncates the floating-point cuberoot, then tests the two nearest integers.

    For larger numbers, one way to do it is to do a binary search for the true cube root using integers only to preserve precision:

    def find_cube_root(n):
        lo = 0
        hi = 1 << ((n.bit_length() + 2) // 3)
        while lo < hi:
            mid = (lo+hi)//2
            if mid**3 < n:
                lo = mid+1
            else:
                hi = mid
        return lo
    
    def is_perfect_cube(n):
        return find_cube_root(n)**3 == n