require "complex" require "matrix" local function isnormal(m, tol = 1e-14) local m1 = m:conjtranspose():matmul(m) local m2 = m:matmul(m:conjtranspose()) return m1:same(m2, tol) end local function isunitary(m, tol = 1e-14) return m:inverse():same(m:conjtranspose(), tol) end local zero = complex.of(0) local one = complex.of(1) local x = math.sqrt(2) / 2 local f = |e|-> e:format("%5.3f") local cm1 = matrix.from({ {complex.of(3), complex.of(2, 1)}, {complex.of(2, -1), complex.of(1)} }, zero) local cm2 = matrix.from({ {one, one, zero}, {zero, one, one}, {one, zero, one} }, zero) local cm3 = matrix.from({ {complex.of(x), complex.of(x), zero}, {complex.of(0, -x), complex.of(0, x), zero}, {zero, zero, complex.of(0, 1)} }, zero) for {cm1, cm2, cm3} as cm do print("Matrix: ") print(cm:mapped(f)) print("\nConjugate transpose:") print(cm:conjtranspose():mapped(f)) print($"\nHermitian : {cm:ishermitian()}") print($"Normal : {isnormal(cm)}") print($"Unitary : {isunitary(cm)}") print() end