正木です。

訂正です:

class Integer
  def iroot(m)
    raise "argument is negative" if self < 0
    return 0 if self == 0
    return 1 if self < 2 ** m
    j = (bitlength + 1).div(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