Ask Your Question

Revision history [back]

The function you are looking for is isqrt (for "integer square root").

sage: isqrt(124)
11

Also available as a method of integers:

sage: 124.isqrt()
11

The (Edited to take comment into account.)

For square roots, the function you are looking for is isqrt (for "integer square root").

sage: isqrt(124)
11

Also available as a method of integers:

sage: 124.isqrt()
11

For n-th roots with n other than 2, one can build on @castor's answer and define:

def inthroot(a, n):
    """
    Return the integer `n`-th root of `a`, rounded towards zero.

    EXAMPLES::

        sage: a, b, c, d, e, f = 26, 27, 28, -26, -27, -28
        sage: inthroot(a, 3)
        2
        sage: inthroot(b, 3)
        3
        sage: inthroot(c, 3)
        3
        sage: inthroot(d, 3)
        -2
        sage: inthroot(e, 3)
        -3
        sage: inthroot(f, 3)
        -3
    """
    return a.nth_root(n, truncate_mode=True)[0]

The [0] at the end discards the boolean indicating whether the n-th root extraction was exact.

Alternatively, one could imagine modifying the nth_root method in src/sage/rings/integer.pyx, adding an optional argument to say whether one wants that boolean or not. The call sequence would change from the current

def nth_root(self, int n, bint truncate_mode=0):

to either

def nth_root(self, int n, bint truncate_mode=0, bint return_whether_exact=1):

or

def nth_root(self, int n, bint truncate_mode=0, bint return_whether_exact=0):

depending on whether we decide the default should be to return that boolean or not.

To check the current version of the nth_root method, do this:

sage: a = 2
sage: a.nth_root??

or look at it online, say at GitHub: