module Powers def **(n) if n == 0 return unity end if n > 0 m = self else n = -n m = self.inverse end z = x = m n -= 1 while (n & 1 != 0 and z *= x; (n >>= 1) != 0) x = x * x end z # if n == 1 # m # else # q , r = n.divmod 2 # x = m ** q # x = x * x # x = x * m if r > 0 # x # end end end