47 lines
1.8 KiB
Ada
47 lines
1.8 KiB
Ada
with Ada.Text_IO; use Ada.Text_IO;
|
|
with Ada.Complex_Text_IO; use Ada.Complex_Text_IO;
|
|
with Ada.Numerics.Complex_Types; use Ada.Numerics.Complex_Types;
|
|
with Ada.Numerics.Complex_Arrays; use Ada.Numerics.Complex_Arrays;
|
|
procedure ConTrans is
|
|
subtype CM is Complex_Matrix;
|
|
S2O2 : constant Float := 0.7071067811865;
|
|
|
|
procedure Print (mat : CM) is begin
|
|
for row in mat'Range(1) loop for col in mat'Range(2) loop
|
|
Put(mat(row,col), Exp=>0, Aft=>4);
|
|
end loop; New_Line; end loop;
|
|
end Print;
|
|
|
|
function almostzero(mat : CM; tol : Float) return Boolean is begin
|
|
for row in mat'Range(1) loop for col in mat'Range(2) loop
|
|
if abs(mat(row,col)) > tol then return False; end if;
|
|
end loop; end loop;
|
|
return True;
|
|
end almostzero;
|
|
|
|
procedure Examine (mat : CM) is
|
|
CT : CM := Conjugate (Transpose(mat));
|
|
isherm, isnorm, isunit : Boolean;
|
|
begin
|
|
isherm := almostzero(mat-CT, 1.0e-6);
|
|
isnorm := almostzero(mat*CT-CT*mat, 1.0e-6);
|
|
isunit := almostzero(CT-Inverse(mat), 1.0e-6);
|
|
Print(mat);
|
|
Put_Line("Conjugate transpose:"); Print(CT);
|
|
Put_Line("Hermitian?: " & isherm'Img);
|
|
Put_Line("Normal?: " & isnorm'Img);
|
|
Put_Line("Unitary?: " & isunit'Img);
|
|
end Examine;
|
|
|
|
hmat : CM := ((3.0+0.0*i, 2.0+1.0*i), (2.0-1.0*i, 1.0+0.0*i));
|
|
nmat : CM := ((1.0+0.0*i, 1.0+0.0*i, 0.0+0.0*i),
|
|
(0.0+0.0*i, 1.0+0.0*i, 1.0+0.0*i),
|
|
(1.0+0.0*i, 0.0+0.0*i, 1.0+0.0*i));
|
|
umat : CM := ((S2O2+0.0*i, S2O2+0.0*i, 0.0+0.0*i),
|
|
(0.0+S2O2*i, 0.0-S2O2*i, 0.0+0.0*i),
|
|
(0.0+0.0*i, 0.0+0.0*i, 0.0+1.0*i));
|
|
begin
|
|
Put_Line("hmat:"); Examine(hmat); New_Line;
|
|
Put_Line("nmat:"); Examine(nmat); New_Line;
|
|
Put_Line("umat:"); Examine(umat);
|
|
end ConTrans;
|