class Array { method ** (Number n { .>= 0 }) { var tmp = self var out = self.len.of {|i| self.len.of {|j| i == j ? 1 : 0 }} loop { out = (out `mmul` tmp) if n.is_odd n >>= 1 || break tmp = (tmp `mmul` tmp) } return out } } var m = [[1, 2, 0], [0, 3, 1], [1, 0, 0]] for order in (0..5) { say "### Order #{order}" var t = (m ** order) say (' ', t.join("\n ")) }