with Characters_and_Numbers; use Characters_and_Numbers; with Standard_Complex_Numbers; use Standard_Complex_Numbers; with Standard_Natural_Vectors; package body Matrix_Indeterminates is procedure Initialize_Symbols ( n,d : in natural ) is begin Symbol_Table.Init(n*d); for i in 1..n loop for j in 1..d loop declare s : Symbol := X_ij(i,j); begin Symbol_Table.Add(s); end; end loop; end loop; end Initialize_Symbols; function X_ij ( i,j : natural ) return Symbol is res : Symbol; begin res(1) := 'x'; res(2) := Convert_Hexadecimal(i); res(3) := Convert_Hexadecimal(j); for i in 4..res'last loop res(i) := ' '; end loop; return res; end X_ij; function Monomial ( n,d,i,j : natural ) return Poly is res : Poly; t : Term; begin t.cf := Create(1.0); t.dg := new Standard_Natural_Vectors.Vector'(1..n*d => 0); t.dg((i-1)*d+j) := 1; res := Create(t); Clear(t.dg); return res; end Monomial; procedure Reduce_Symbols ( locmap : in Matrix ) is d : constant natural := locmap'length(2); begin for i in reverse locmap'range(1) loop for j in reverse locmap'range(2) loop if locmap(i,j) /= 2 then Symbol_Table.Remove(X_ij(i,j)); end if; end loop; end loop; end Reduce_Symbols; procedure Clear_Symbols is begin Symbol_Table.Clear; end Clear_Symbols; end Matrix_Indeterminates;