45 lines
1.1 KiB
Text
45 lines
1.1 KiB
Text
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
|