func is_Hermitian (Array m, Array t) -> Bool { m == t } func mat_mult (Array a, Array b, Number ε = -3) { var p = [] for r, c in (^a ~X ^b[0]) { for k in (^b) { p[r][c] := 0 += (a[r][k] * b[k][c]) -> round!(ε) } } return p } func mat_trans (Array m) { var r = [] for i,j in (^m ~X ^m[0]) { r[j][i] = m[i][j] } return r } func mat_ident (Number n) { ^n -> map {|i| [i.of(0)..., 1, (n - i - 1).of(0)...] } } func is_Normal (Array m, Array t) -> Bool { mat_mult(m, t) == mat_mult(t, m) } func is_Unitary (Array m, Array t) -> Bool { mat_mult(m, t) == mat_ident(m.len) } func say_it (Array a) { a.each {|b| b.map { "%9s" % _ }.join(' ').say } } [ [ [ 1, 1+1i, 2i], [1-1i, 5, -3], [0-2i, -3, 0] ], [ [1, 1, 0], [0, 1, 1], [1, 0, 1] ], [ [0.707 , 0.707, 0], [0.707i, -0.707i, 0], [0 , 0, 1i] ] ].each { |m| say "\nMatrix:" say_it(m) var t = mat_trans(m.map{.map{.conj}}) say "\nTranspose:" say_it(t) say "Is Hermitian?\t#{is_Hermitian(m, t)}" say "Is Normal?\t#{is_Normal(m, t)}" say "Is Unitary?\t#{is_Unitary(m, t)}" }