%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%A  matring.tex                 GAP documentation            Martin Schoenert
%%
%A  @(#)$Id: matring.tex,v 3.4 1993/02/19 10:48:42 gap Exp $
%%
%Y  Copyright 1990-1992,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
%%
%%  This file describes matrix rings and their implementation.
%%
%H  $Log: matring.tex,v $
%H  Revision 3.4  1993/02/19  10:48:42  gap
%H  adjustments in line length and spelling
%H
%H  Revision 3.3  1993/02/12  16:42:07  felsch
%H  examples adjusted to line length 72
%H
%H  Revision 3.2  1993/02/05  10:20:35  felsch
%H  example fixed
%H
%H  Revision 3.1  1992/04/06  00:13:41  martin
%H  initial revision under RCS
%H
%%
\Chapter{Matrix Rings}

A *matrix ring* is a ring  of square matrices  (see chapter  "Matrices").
In {\GAP} you can define matrix rings of matrices over each of the fields
that {\GAP} supports, i.e., the  rationals,  cyclotomic extensions of the
rationals,  and  finite fields (see chapters  "Rationals", "Cyclotomics",
and "Finite Fields").

You define a matrix ring in {\GAP} by calling 'Ring' (see "Ring") passing
the generating matrices as arguments.

|    gap> m1 := [ [ Z(3)^0, Z(3)^0,   Z(3) ],
    >            [   Z(3), 0*Z(3),   Z(3) ],
    >            [ 0*Z(3),   Z(3), 0*Z(3) ] ];;
    gap> m2 := [ [   Z(3),   Z(3), Z(3)^0 ],
    >            [   Z(3), 0*Z(3),   Z(3) ],
    >            [ Z(3)^0, 0*Z(3),   Z(3) ] ];;
    gap> m := Ring( m1, m2 );
    Ring( [ [ Z(3)^0, Z(3)^0, Z(3) ], [ Z(3), 0*Z(3), Z(3) ],
      [ 0*Z(3), Z(3), 0*Z(3) ] ],
    [ [ Z(3), Z(3), Z(3)^0 ], [ Z(3), 0*Z(3), Z(3) ],
      [ Z(3)^0, 0*Z(3), Z(3) ] ] )
    gap> Size( m );
    2187 |

However, currently {\GAP} can only compute with finite matrix rings  with
a multiplicative neutral element (a *one*).  Also computations with large
matrix  rings are not  done  very  efficiently.  We  hope to improve this
situation in  the future, but currently you should be careful  not to try
too large matrix rings.

Because matrix  rings are  just a special case  of  domains all  the  set
theoretic  functions such as 'Size' and 'Intersection'  are applicable to
matrix  rings  (see chapter  "Domains"  and  "Set  Functions  for  Matrix
Rings").

Also  matrix rings are of  course rings,  so  all ring functions such  as
'Units' and 'IsIntegralRing' are applicable to matrix rings (see  chapter
"Rings" and "Ring Functions for Matrix Rings").

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Set Functions for Matrix Rings}

All set  theoretic functions described in  chapter  "Domains"  use  their
default function for matrix rings  currently.   This  means, for example,
that the size of a  matrix ring is  computed by computing the set of  all
elements  of the  matrix  ring  with an  orbit-like  algorithm.  Thus you
should not try to work with too large matrix rings.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Ring Functions for Matrix Rings}
\index{IsUnit!for matrix rings}

As already mentioned in the introduction of this chapter matrix rings are
after all rings.  All ring functions such as 'Units' and 'IsIntegralRing'
are thus applicable  to matrix rings.  This  section  describes how these
functions are implemented for matrix rings.  Functions not mentioned here
inherit the default group methods described in the respective sections.

\vspace{5mm}
'IsUnit( <R>, <m> )'

A  matrix  is a  unit in  a  matrix  ring  if its  rank  is maximal  (see
"RankMat").

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%E  Emacs . . . . . . . . . . . . . . . . . . . . . local Emacs variables
%%
%%  Local Variables:
%%  mode:               outline
%%  outline-regexp:     "\\\\Chapter\\|\\\\Section"
%%  fill-column:        73
%%  eval:               (hide-body)
%%  End:
%%



