正木です。

すみません再度訂正です:

class Integer
  def iroot(m)
    raise "argument is negative" if self < 0
    return 0 if self == 0
    return 1 if (i = bitlength - 1) < m
    j = (i + m).div(2 * m)
    x = ((self >> (j * m)).iroot(m) + 1) << j
    while x > y = div(x ** (m - 1))
      x += (y - x).div(m)
    end
    x
  end
end