Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
| Download
GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
Project: cocalc-sagemath-dev-slelievre
Views: 418346############################################################################# ## #W basicprm.gi GAP Library Frank Celler ## ## #Y Copyright (C) 1996, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## ## This file contains the methods for the construction of the basic perm ## group types. ## ############################################################################# ## #M TrivialGroupCons( <IsPermGroup> ) ## InstallMethod( TrivialGroupCons, "perm group", [ IsPermGroup and IsFinite ], function( filter ) filter:= Group( () ); SetIsTrivial( filter, true ); return filter; end ); ############################################################################# ## #M AbelianGroupCons( <IsPermGroup>, <ints> ) ## InstallMethod( AbelianGroupCons, "perm group", true, [ IsPermGroup and IsFinite, IsList ], 0, function( filter, ints ) local grp, grps; if not ForAll( ints, IsInt ) then Error( "<ints> must be a list of integers" ); fi; if not ForAll( ints, x -> 0 < x ) then TryNextMethod(); fi; grps := List( ints, x -> CyclicGroupCons( IsPermGroup, x ) ); # the way a direct product is constructed guarantees the right # generators grp := CallFuncList( DirectProduct, grps ); SetSize( grp, Product(ints) ); SetIsAbelian( grp, true ); return grp; end ); ############################################################################# ## #M ElementaryAbelianGroupCons( <IsPermGroup>, <size> ) ## InstallMethod( ElementaryAbelianGroupCons, "perm group", true, [ IsPermGroup and IsFinite, IsPosInt ], 0,function(filter,size) local G; if size = 1 or IsPrimePowerInt( size ) then G := AbelianGroup( filter, Factors(size) ); else Error( "<n> must be a prime power" ); fi; SetIsElementaryAbelian( G, true ); return G; end); ############################################################################# ## #M AlternatingGroupCons( <IsPermGroup>, <deg> ) ## InstallMethod( AlternatingGroupCons, "perm group with degree", true, [ IsPermGroup and IsFinite, IsInt], 0, function( filter, deg ) if deg<0 then TryNextMethod();fi; return AlternatingGroupCons( IsPermGroup, [ 1 .. deg ] ); end ); ############################################################################# ## #M AlternatingGroupCons( <IsPermGroup>, <dom> ) ## InstallOtherMethod( AlternatingGroupCons, "perm group with domain", true, [ IsPermGroup and IsFinite, IsDenseList ], 0, function( filter, dom ) local alt, dl, g, l; dom := Set(dom); IsRange( dom ); if Length(dom) < 3 then alt := GroupByGenerators( [], () ); SetSize( alt, 1 ); SetMovedPoints( alt, [] ); SetNrMovedPoints( alt, 0 ); SetIsPerfectGroup( alt, true ); else if Length(dom) mod 2 = 0 then dl := dom{[ 1 .. Length(dom)-1 ]}; else dl := dom; fi; g := [ MappingPermListList( dl, Concatenation( dl{[2..Length(dl)]}, [dl[1]] ) ) ]; if 3 < Length(dom) then l := Length(dom); Add( g, (dom[l-2],dom[l-1],dom[l]) ); fi; alt := GroupByGenerators(g); if Length(dom)<5000 then SetSize( alt, Factorial(Length(dom))/2 ); fi; SetMovedPoints( alt, dom ); SetNrMovedPoints( alt, Length(dom) ); if 4 < Length(dom) then SetIsSimpleGroup( alt, true ); SetIsPerfectGroup( alt, true ); elif 2 < Length(dom) then SetIsPerfectGroup( alt, false ); fi; SetIsPrimitiveAffine( alt, Length( dom ) < 5 ); fi; SetIsAlternatingGroup( alt, true ); SetIsNaturalAlternatingGroup( alt, true ); return alt; end ); ############################################################################# ## #M AlternatingGroupCons( <IsPermGroup and IsRegular>, <deg> ) ## InstallMethod( AlternatingGroupCons, "regular perm group with degree", true, [ IsPermGroup and IsRegular and IsFinite, IsInt], 0, function( filter, deg ) if deg<0 then TryNextMethod();fi; return AlternatingGroupCons( IsPermGroup and IsRegular, [ 1 .. deg ] ); end ); ############################################################################# ## #M AlternatingGroupCons( <IsPermGroup and IsRegular>, <dom> ) ## InstallOtherMethod( AlternatingGroupCons, "regular perm group with domain", true, [ IsPermGroup and IsRegular and IsFinite, IsDenseList ], 0, function( filter, dom ) local alt; alt := AlternatingGroupCons( IsPermGroup, dom ); alt := Action( alt, AsList(alt), OnRight ); SetIsAlternatingGroup( alt, true ); return alt; end ); ############################################################################# ## #M CyclicGroupCons( <IsPermGroup and IsRegular>, <n> ) ## InstallMethod( CyclicGroupCons, "regular perm group", true, [ IsPermGroup and IsRegular and IsFinite, IsInt and IsPosRat ], 0, function( filter, n ) local g, c; g := PermList( Concatenation( [2..n], [1] ) ); c := GroupByGenerators( [g] ); SetSize( c, n ); SetIsCyclic( c, true ); if n > 1 then SetMinimalGeneratingSet (c, [g]); else SetMinimalGeneratingSet (c, []); fi; return c; end ); ############################################################################# ## #M DihedralGroupCons( <IsPermGroup>, <2n> ) ## InstallMethod( DihedralGroupCons, "perm. group", true, [ IsPermGroup, IsPosInt ], 0, function( filter, 2n ) local D, g, h; if 2n = 2 then D:= GroupByGenerators( [ (1,2) ] ); elif 2n = 4 then D := GroupByGenerators( [ (1,2), (3,4) ] ); elif 2n mod 2 = 1 then Error( "<2n> must be an even integer" ); else g:= PermList( Concatenation( [ 2 .. 2n/2 ], [ 1 ] ) ); h:= PermList( Concatenation( [ 1 ], Reversed( [ 2 .. 2n/2 ] ) ) ); D:= GroupByGenerators( [ g, h ] ); fi; return D; end ); ############################################################################# ## #M QuaternionGroupCons( <IsPermGroup>, <4n> ) ## InstallMethod( QuaternionGroupCons, "perm. group", true, [ IsPermGroup, IsPosInt ], 0, function( filter, n ) local y, z, x; if 0 <> n mod 4 then TryNextMethod(); fi; y := PermList( Concatenation( [2..n/2], [1], [n/2+2..n], [n/2+1] ) ); x := PermList( Concatenation( Cycle( y^-1, [n/2+1..n], n/2+1 ), Cycle( y^-1, [1..n/2], n/4+1 ) ) ); return Group(x,y); end ); ############################################################################# ## #M MathieuGroupCons( <IsPermGroup>, <degree> ) ## ## The returned permutation groups are compatible only in the following way. ## $M_{23}$ is the stabilizer of the point $24$ in $M_{24}$. ## $M_{21}$ is the stabilizer of the point $22$ in $M_{22}$. ## $M_{11}$ is the stabilizer of the point $12$ in $M_{12}$. ## $M_{10}$ is the stabilizer of the point $11$ in $M_{11}$. ## $M_{9}$ is the stabilizer of the point $10$ in $M_{10}$. ## InstallMethod( MathieuGroupCons, "perm group with degree", [ IsPermGroup and IsFinite, IsPosInt ], function( filter, degree ) local M; # degree 9, base 1 2, indices 9 8 if degree = 9 then M:= Group( (1,4,9,8)(2,5,3,6), (1,6,5,2)(3,7,9,8) ); SetSize( M, 72 ); # degree 10, base 1 2 3, indices 10 9 8 elif degree = 10 then M:= Group( (1,9,6,7,5)(2,10,3,8,4), (1,10,7,8)(2,9,4,6) ); SetSize( M, 720 ); # degree 11, base 1 2 3 4, indices 11 10 9 8 elif degree = 11 then M:= Group( (1,2,3,4,5,6,7,8,9,10,11), (3,7,11,8)(4,10,5,6) ); SetSize( M, 7920 ); SetIsSimpleGroup( M, true ); # degree 12, base 1 2 3 4 5, indices 12 11 10 9 8 elif degree = 12 then M:= Group( (1,2,3,4,5,6,7,8,9,10,11), (3,7,11,8)(4,10,5,6), (1,12)(2,11)(3,6)(4,8)(5,9)(7,10) ); SetSize( M, 95040 ); SetIsSimpleGroup( M, true ); # degree 21, base 1 2 3 4, indices 21 20 16 3 elif degree = 21 then M:= Group( (1,4,5,9,3)(2,8,10,7,6)(12,15,16,20,14)(13,19,21,18,17), (1,21,5,12,20)(2,16,3,4,17)(6,18,7,19,15)(8,13,9,14,11) ); SetSize( M, 20160 ); SetIsSimpleGroup( M, true ); # degree 22, base 1 2 3 4 5, indices 22 21 20 16 3 elif degree = 22 then M:= Group( (1,2,3,4,5,6,7,8,9,10,11)(12,13,14,15,16,17,18,19,20,21,22), (1,4,5,9,3)(2,8,10,7,6)(12,15,16,20,14)(13,19,21,18,17), (1,21)(2,10,8,6)(3,13,4,17)(5,19,9,18)(11,22)(12,14,16,20) ); SetSize( M, 443520 ); SetIsSimpleGroup( M, true ); # degree 23, base 1 2 3 4 5 6, indices 23 22 21 20 16 3 elif degree = 23 then M:= Group( (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23), (3,17,10,7,9)(4,13,14,19,5)(8,18,11,12,23)(15,20,22,21,16) ); SetSize( M, 10200960 ); SetIsSimpleGroup( M, true ); # degree 24, base 1 2 3 4 5 6 7, indices 24 23 22 21 20 16 3 elif degree = 24 then M:= Group( (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23), (3,17,10,7,9)(4,13,14,19,5)(8,18,11,12,23)(15,20,22,21,16), (1,24)(2,23)(3,12)(4,16)(5,18)(6,10)(7,20)(8,14)(9,21)(11,17) (13,22)(19,15) ); SetSize( M, 244823040 ); SetIsSimpleGroup( M, true ); # error else Error("degree <d> must be 9, 10, 11, 12, 21, 22, 23, or 24" ); fi; return M; end ); ############################################################################# ## #M SymmetricGroupCons( <IsPermGroup>, <deg> ) ## InstallMethod( SymmetricGroupCons, "perm group with degree", true, [ IsPermGroup and IsFinite, IsInt ], 0, function( filter, deg ) if deg<0 then TryNextMethod();fi; return SymmetricGroupCons( IsPermGroup, [ 1 .. deg ] ); end ); ############################################################################# ## #M SymmetricGroupCons( <IsPermGroup>, <dom> ) ## InstallOtherMethod( SymmetricGroupCons, "perm group with domain", true, [ IsPermGroup and IsFinite, IsDenseList ], 0, function( filters, dom ) local sym, g; dom := Set(dom); IsRange( dom ); if Length(dom) < 2 then sym := GroupByGenerators( [], () ); SetSize( sym, 1 ); SetMovedPoints( sym, [] ); SetNrMovedPoints( sym, 0 ); SetIsPerfectGroup( sym, true ); else g := [ MappingPermListList( dom, Concatenation( dom{[2..Length(dom)]}, [ dom[1] ] ) ) ]; if 2 < Length(dom) then Add( g, ( dom[1], dom[2] ) ); fi; sym := GroupByGenerators( g ); if Length(dom)<5000 then SetSize( sym, Factorial(Length(dom)) ); fi; SetMovedPoints( sym, dom ); SetNrMovedPoints( sym, Length(dom) ); fi; SetIsPrimitiveAffine( sym, Length( dom ) < 5 ); SetIsSymmetricGroup( sym, true ); SetIsNaturalSymmetricGroup( sym, true ); return sym; end ); ############################################################################# ## #M SymmetricGroupCons( <IsPermGroup and IsRegular>, <deg> ) ## InstallMethod( SymmetricGroupCons, "regular perm group with degree", true, [ IsPermGroup and IsRegular and IsFinite, IsInt], 0, function( filter, deg ) if deg<0 then TryNextMethod();fi; return SymmetricGroupCons( IsPermGroup and IsRegular, [ 1 .. deg ] ); end ); ############################################################################# ## #M SymmetricGroupCons( <IsPermGroup and IsRegular>, <dom> ) ## InstallOtherMethod( SymmetricGroupCons, "regular perm group with domain", true, [ IsPermGroup and IsRegular and IsFinite, IsDenseList ], 0, function( filter, dom ) local alt; alt := SymmetricGroupCons( IsPermGroup, dom ); alt := Action( alt, AsList(alt), OnRight ); SetIsSymmetricGroup( alt, true ); return alt; end ); ############################################################################# ## #E