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 basicfp.gi GAP Library Alexander Hulpke ## #Y Copyright (C) 2009, The GAP group ## ## This file contains the methods for the construction of the basic fp group ## types. ## ############################################################################# ## #M AbelianGroupCons( <IsFpGroup and IsFinite>, <ints> ) ## InstallMethod( AbelianGroupCons, "fp group", true, [ IsFpGroup and IsFinite, IsList ], 0, function( filter, ints ) local f,g,i,j,rels,gfam,fam; if Length(ints)=0 or not ForAll( ints, x -> IsInfinity(x) or (IsInt(x) and x >= 0) ) then Error( "<ints> must be a list of integers" ); fi; f := FreeGroup(IsSyllableWordsFamily, Length(ints)); g := GeneratorsOfGroup(f); rels:=[]; for i in [1..Length(ints)] do for j in [1..i-1] do Add(rels,Comm(g[i],g[j])); od; if IsPosInt(ints[i]) then Add(rels,g[i]^ints[i]); fi; od; g:=f/rels; if ForAll(ints,IsPosInt) then SetSize( g, Product(ints) ); fi; fam:=FamilyObj(One(f)); gfam:=FamilyObj(One(g)); gfam!.redorders:=ints; SetFpElementNFFunction(gfam,function(x) local u,e,i,j,n; u:=UnderlyingElement(x); e:=ExtRepOfObj(u); # syllable form # bring in correct order and reduction n:=ListWithIdenticalEntries(Length(gfam!.redorders),0); for i in [1,3..Length(e)-1] do j:=e[i]; if IsPosInt(gfam!.redorders[j]) then n[j]:=n[j]+e[i+1] mod gfam!.redorders[j]; else n[j]:=n[j]+e[i+1]; fi; od; e:=[]; for i in [1..Length(gfam!.redorders)] do if n[i]<>0 then Add(e,i); Add(e,n[i]); fi; od; return ObjByExtRep(fam,e); end); SetReducedMultiplication(g); SetIsAbelian( g, true ); return g; end ); ############################################################################# ## #M CyclicGroupCons( <IsFpGroup>, <n> ) ## InstallOtherMethod( CyclicGroupCons, "fp group", true, [ IsFpGroup,IsObject ], 0, function( filter, n ) local f,g,fam,gfam; if n=infinity then return FreeGroup("a"); elif not IsPosInt(n) then TryNextMethod(); fi; f:=FreeGroup( IsSyllableWordsFamily, "a" ); g:=f/[f.1^n]; SetSize(g,n); fam:=FamilyObj(One(f)); gfam:=FamilyObj(One(g)); SetFpElementNFFunction(gfam,function(x) local u,e; u:=UnderlyingElement(x); e:=ExtRepOfObj(u); # syllable form if Length(e)=0 or (e[2]>=0 and e[2]<n) then return u; elif e[2] mod n=0 then return One(f); else e:=[e[1],e[2] mod n]; return ObjByExtRep(fam,e); fi; end); SetReducedMultiplication(g); return g; end ); ############################################################################# ## #M DihedralGroupCons( <IsFpGroup and IsFinite>, <n> ) ## InstallMethod( DihedralGroupCons, "fp group", true, [ IsFpGroup and IsFinite, IsInt and IsPosRat ], 0, function( filter, n ) local f,rels,g; if n mod 2 = 1 then TryNextMethod(); elif n = 2 then return CyclicGroup( IsFpGroup, 2 ); fi; f := FreeGroup( IsSyllableWordsFamily, "r", "s" ); rels:= [f.1^(n/2),f.2^2,f.1^f.2*f.1]; g := f/rels; SetReducedMultiplication(g); SetSize(g,n); return g; end ); ############################################################################# ## #M QuaternionGroupCons( <IsFpGroup and IsFinite>, <n> ) ## InstallMethod( QuaternionGroupCons, "fp group", true, [ IsFpGroup and IsFinite, IsInt and IsPosRat ], 0, function( filter, n ) local f,rels,g; if 0 <> n mod 4 then TryNextMethod(); elif n = 4 then return CyclicGroup( IsFpGroup, 4 ); fi; f := FreeGroup( IsSyllableWordsFamily, "r", "s" ); rels:= [ f.1^2/f.2^(n/4), f.2^(n/2), f.2^f.1*f.2 ]; g := f/rels; SetSize(g,n); if n <= 10^4 then SetReducedMultiplication(g); fi; return g; end ); ############################################################################# ## #M ElementaryAbelianGroupCons( <IsFpGroup and IsFinite>, <n> ) ## InstallMethod( ElementaryAbelianGroupCons, "fp group", true, [ IsFpGroup and IsFinite, IsInt and IsPosRat ], 0, function( filter, n ) if n = 1 then return CyclicGroupCons( IsFpGroup, 1 ); elif not IsPrimePowerInt(n) then Error( "<n> must be a prime power" ); fi; n:= AbelianGroupCons( IsFpGroup, Factors(n) ); SetIsElementaryAbelian( n, true ); return n; end ); ############################################################################# ## #M FreeAbelianGroupCons( <IsFpGroup>, <rank> ) ## InstallMethod( FreeAbelianGroupCons, "fp group", true, [ IsFpGroup, IsInt and IsPosRat ], 0, function( filter, rank ) return AbelianGroupCons( filter, ListWithIdenticalEntries(rank, 0) ); # TODO: Add the following if it ever moves from Polycyclic to the GAP core: #SetIsFreeAbelian( G, true ); end );