原です。

matrix.rb で ** の定義の中で

    z = x = self
    n = other - 1
    while n != 0
      while (div, mod = n.divmod(2)
      mod == 0)
      x = x * x
      n = div
      end
      z *= x
      n -= 1
    end
    z
  end

のような部分がありますが、while を 2重にする必要はなくて、

    z = x = self
    n = other - 1
    while (n & 1 != 0 and z *= x; (n >>= 1) != 0)
      x = x * x
    end
    z

の方がわかりやすいかも。速さはほとんどど変わりませんが。

ところで、

    n = other - 1

という操作も other が2のベキのとき、無駄を作る気がしたんだけど、
一般にはそうでもないみたいですね。もっといいアルゴリズムってな
いかしら?