GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#############################################################################
##
## GaussFQI.gi GaussForHomalg package Simon Goertzen
##
## Copyright 2007-2008 Lehrstuhl B für Mathematik, RWTH Aachen
##
## Homalg Table for Z / p^n * Z in GAP with the Gauss package
##
#############################################################################
####################################
#
# constructor functions and methods:
#
####################################
## <#GAPDoc Label="CreateHomalgTable">
## <ManSection>
## <Func Arg="R" Name="CreateHomalgTable"/>
## <Returns>a &homalg; table</Returns>
## <Description>
## This returns the &homalg; table of what will become the
## &homalg; ring <A>R</A> (at this point <A>R</A> is just a &homalg;
## object with some properties for the method selection of <C>CreateHomalgTable</C>).
## This method includes the needed functions stored in the global
## variables <C>CommonHomalgTableForGaussTools</C> and
## <C>CommonHomalgTableForGaussBasic</C>, and can add some more
## to the record that will become the &homalg; table.
## </Description>
## </ManSection>
## <#/GAPDoc>
InstallMethod( CreateHomalgTable,
"for Z / p^n * Z",
[ IsRing and IsFinite ],
function( R )
local RP, RP_default, RP_specific, component;
if IsBound( HOMALG_MATRICES.PreferDenseMatrices ) and HOMALG_MATRICES.PreferDenseMatrices = true then
RP := rec( );
else
RP := ShallowCopy( CommonHomalgTableForGaussTools );
fi;
RP_default := ShallowCopy( CommonHomalgTableForGaussBasic );
RP_specific := rec(
## Must be defined if other functions are not defined
## <#GAPDoc Label="RowReducedEchelonForm">
## <ManSection>
## <Func Arg="M, [U]" Name="RowReducedEchelonForm"/>
## <Returns>a &homalg; matrix <A>N</A></Returns>
## <Description>
## If one argument is given, this returns the triangular basis
## (reduced row echelon form) of the &homalg; matrix <A>M</A>,
## again as a &homalg; matrix.
## In case of two arguments, still only the triangular basis of <A>M</A> is
## returned, but the transformation matrix is stored in the void
## &homalg; matrix <A>U</A> as a side effect.
## The matrices satisfy <M>N = U * M</M>.
## </Description>
## </ManSection>
## <#/GAPDoc>
RowReducedEchelonForm := #compute the reduced row echelon form N of M and, if nargs=2, transformation matrix U
function( arg )
local M, R, nargs, result, N, H;
M := arg[1];
R := HomalgRing( M );
nargs := Length( arg );
if nargs > 1 and IsHomalgMatrix( arg[2] ) then
## compute N and U:
result := EchelonMatTransformation( MyEval( M ) );
N := result.vectors;
## assign U:
SetMyEval( arg[2], UnionOfRows( result.coeffs, result.relations ) );
ResetFilterObj( arg[2], IsVoidMatrix );
SetNrRows( arg[2], NrRows( M ) );
SetNrColumns( arg[2], NrRows( M ) );
SetIsInvertibleMatrix( arg[2], true );
else
## compute N only:
N := EchelonMat( MyEval( M ) ).vectors;
fi;
if N = [ ] then
H := HomalgZeroMatrix( 0, NrColumns( M ), R );
else
H := HomalgMatrix( N, R ); ## and since this is not i.g. triangular:
fi;
SetNrColumns( H, NrColumns( M ) );
if HasIsIntegralDomain( R ) and IsIntegralDomain( R ) then
SetRowRankOfMatrix( H, NrRows( H ) );
fi;
SetZeroRows( H, [] );
SetIsUpperTriangularMatrix( H, true );
return H;
end,
RowRankOfMatrixOverDomain :=
function( M )
return Rank( MyEval( M ) );
end
);
for component in NamesOfComponents( RP_default ) do
RP.(component) := RP_default.(component);
od;
for component in NamesOfComponents( RP_specific ) do
RP.(component) := RP_specific.(component);
od;
Objectify( TheTypeHomalgTable, RP );
return RP;
end );