1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
#############################################################################
##
#W matgrp.gi Bettina Eick
##
## This file contains the header functions to handle the 3- and
## 4-dimensional almost crystallographic integral matrix groups.
##
#############################################################################
##
#F AlmostCrystallographicDim3( type, param )
##
InstallGlobalFunction( AlmostCrystallographicDim3,
function( type, param )
local g, G, info;
# type is integer or string
if IsString( type ) then
g := Int( type );
elif IsInt( type ) then
g := type;
else
g := false;
fi;
if not g in [1..17] then
Error("type does not define a valid ac-group type");
fi;
# check parameters
if IsBool( param ) then
param := List( [1..ACDim3Param[g]], x -> Random(Integers) );
if param[1] = 0 then param[1] := Random(Integers)^2 + 1; fi;
elif IsInt( param ) then
param := List( [1..ACDim3Param[g]], x -> param );
elif Length( param ) <> ACDim3Param[g] then
Error("parameter should be a list of length ", ACDim3Param[g] );
fi;
# get group
if Length( param ) = 4 then
G := ACDim3Funcs[g](param[1], param[2], param[3], param[4]);
elif Length(param) = 2 then
G := ACDim3Funcs[g](param[1], param[2] );
elif Length(param) = 1 then
G := ACDim3Funcs[g](param[1]);
fi;
# set some information
info := rec( dim := 3, type := g, param := param );
SetAlmostCrystallographicInfo( G, info );
SetIsAlmostCrystallographic( G, true );
SetDimensionOfMatrixGroup( G, 4 );
SetFieldOfMatrixGroup( G, Rationals );
SetSize( G, infinity );
return G;
end );
#############################################################################
##
#F AlmostCrystallographicDim4( type, param )
##
InstallGlobalFunction( AlmostCrystallographicDim4,
function( type, param )
local g, G, info;
# type is integer or string
if IsString( type ) then
g := Position( ACDim4Types, type );
elif IsInt( type ) then
g := type;
else
g := false;
fi;
if not g in [1..95] then
Error("type does not define a valid ac-group type");
fi;
# check parameters
if IsBool( param ) then
param := List( [1..ACDim4Param[g]], x -> Random(Integers) );
if param[1] = 0 then param[1] := Random(Integers)^2 + 1; fi;
elif IsInt( param ) then
param := List( [1..ACDim4Param[g]], x -> param );
elif Length( param ) <> ACDim4Param[g] then
Error("parameter should be a list of length ", ACDim4Param[g] );
fi;
# get group
if Length(param) = 7 then
G := ACDim4Funcs[g]( param[1], param[2], param[3], param[4],
param[5], param[6], param[7]);
elif Length(param) = 6 then
G := ACDim4Funcs[g]( param[1], param[2], param[3], param[4],
param[5], param[6]);
elif Length(param) = 5 then
G := ACDim4Funcs[g]( param[1], param[2], param[3], param[4],
param[5]);
elif Length(param) = 4 then
G := ACDim4Funcs[g]( param[1], param[2], param[3], param[4]);
elif Length(param) = 3 then
G := ACDim4Funcs[g]( param[1], param[2], param[3]);
fi;
# set some information
info := rec( dim := 4, type := g, param := param );
SetAlmostCrystallographicInfo( G, info );
SetIsAlmostCrystallographic( G, true );
SetDimensionOfMatrixGroup( G, 5 );
SetFieldOfMatrixGroup( G, Rationals );
SetSize( G, infinity );
return G;
end );
#############################################################################
##
#F AlmostCrystallographicGroup( dim, type, param )
##
InstallGlobalFunction( AlmostCrystallographicGroup,
function( dim, type, param )
if dim = 3 then
return AlmostCrystallographicDim3( type, param );
elif dim = 4 then
return AlmostCrystallographicDim4( type, param );
else
Error("dimension must be 3 or 4");
fi;
end );
#############################################################################
##
#F IsAlmostCrystallographic( <G> )
##
InstallMethod( IsAlmostCrystallographic, "for groups", true,
[IsGroup ], 0,
function( G )
if HasAlmostCrystallographicInfo( G ) then
return true;
else
Print("sorry - cannot check this property \n");
return fail;
fi;
end );
|