# File lib/facets/more/quaternion.rb, line 475
  def ** other
    # q1^q2 = exp((log q1)*q2)
    if other.kind_of?(Quaternion); ((self.log)*other).exp
    elsif other.kind_of?(Complex); ((self.log)*other).exp
    elsif other.kind_of?(Integer);
      if other==0; return One;
      elsif other>0;
        x = self; q = x; n = other - 1
        while n != 0
          while (d, m = n.divmod(2); m == 0); x = x*x; n = d; end
          q *= x; n -= 1
        end
        return q
      else return self.inverse**(-other)
      end
    elsif Quaternion::generic?(other); ((self.log)*other).exp
    else x, y = other.coerce(self); x ** y
    end;
  end