RosettaCodeData/Task/Conjugate-transpose/Pluto/conjugate-transpose.pluto
2026-04-30 12:34:36 -04:00

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