<Chapter><Heading>Resolutions of the ground ring</Heading>

<Table Align="|l|" >

<Row>
<Item>
<Index>ResolutionAbelianGroup</Index>
<C> ResolutionAbelianGroup(L,n)</C>
&nbsp;
<C> ResolutionAbelianGroup(G,n)</C>
<P/>

Inputs a list <M>L:=[m_1,m_2, ..., m_d]</M> of nonnegative integers, 
and a positive integer <M>n</M>. It returns <M>n</M> terms of a 
<M>ZG</M>-resolution for the abelian group <M>G=Z_L[1]+Z_L[2]+···+Z_L[d]</M> .
<P/>
If <M>G</M> is finite then the first argument can also be the abelian 
group <M>G</M> itself.
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionAlmostCrystalGroup</Index>
<C> ResolutionAlmostCrystalGroup(G,n)</C>
<P/>

Inputs a positive integer <M>n</M> and an almost crystallographic pcp group 
<M>G</M>. It returns <M>n</M> terms of a free <M>ZG</M>-resolution. 
(A group is almost crystallographic if it is nilpotent-by-finite and has no 
non-trivial finite normal subgroup. Such groups can be constructed using the 
ACLIB package.)
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionAlmostCrystalQuotient</Index>
<C> ResolutionAlmostCrystalQuotient(G,n,c)</C>
&nbsp;
<C> ResolutionAlmostCrystalQuotient(G,n,c,false)</C>
<P/>

An almost crystallographic group <M>G</M> is an extension of a finite group 
<M>P</M> by a nilpotent group <M>T</M>, and has no non-trivial finite 
normal subgroup. We define the relative lower central series by setting 
<M>T_1=T</M> and <M>T_{i+1}=[T_i,G]</M>.<P/>

This function inputs an almost crystallographic group <M>G</M> together 
with positive integers <M>n</M> and <M>c</M>. It returns <M>n</M> terms of 
a free <M>ZQ</M>-resolution <M>R</M> for the group <M>Q=G/T_c</M> .<P/>

In addition to the usual components, the resolution <M>R</M> has the 
component <M>R.quotientHomomorphism</M> which gives the quotient 
homomorphism <M>G \longrightarrow Q </M>.<P/>

If a fourth optional variable is set equal to "false" then  the function 
omits to test whether <M>Q</M> is finite and a "more canonical" 
resolution is constructed.
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionArtinGroup</Index>
<C> ResolutionArtinGroup(D,n)</C>
<P/>
Inputs a Coxeter diagram <M>D</M> and an integer  <M>n>1</M>.  It returns 
<M>n</M> terms of a free <M>ZG</M>-resolution <M>R</M> where <M>G</M> is 
the Artin monoid associated to <M>D</M>.  It is conjectured that 
<M>R</M> is also a free resolution for the Artin group <M>G</M>. 
The conjecture is known to hold in 
<URL Text="certain cases">About/aboutArtinGroups.html</URL>.<P/>

<M>G=R.group</M> is infinite and returned as a finitely presented group. 
The list <M>R.elts</M> is a partial listing of the elements of <M>G</M> 
which grows as <M>R</M> is used. Initially <M>R.elts</M> is empty and then, 
any time the boundary of a resolution generator is called, <M>R.elts</M>
is updated to include elements of <M>G</M> involved in the boundary.<P/>

The contracting homotopy on <M>R</M> has not yet been implemented! 
Furthermore, the group <M>G</M> is currently returned only as a finitely 
presented group (without any method for solving the word problem).
</Item>
</Row>

<Row>
<Item>
<Index> ResolutionAsphericalPresentation</Index>
<C> ResolutionAsphericalPresentation(F,R,n)</C>
<P/>
Inputs a free group <M>F</M>, a set <M>R</M> of words in <M>F</M> 
which constitute an aspherical presentation for a group <M>G</M>, and a 
positive integer <M>n</M>.  (Asphericity can be a difficult property to 
verify. The function <M>IsAspherical(F,R)</M> could be of help.)<P/>

The function returns n terms of a free <M>ZG</M>-resolution <M>R</M> 
which has generators in dimensions  &tlt; 3 only. 
No contracting homotopy on 
<M>R</M> will be returned.
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionBieberbachGroup (HAPcryst)</Index>
<C> ResolutionBieberbachGroup( G ) </C>
<Br/>
<C> ResolutionBieberbachGroup( G, v ) </C>
<P/>
Inputs a Bieberbach group <M>G</M> (represented using
AffineCrystGroupOnRight as 
in the GAP package Cryst). It also optionally inputs a choice of 
vector <M>v</M> in the euclidean space <M>R^n</M> 
on which <M>G</M> acts freely. The function returns <M>n+1</M> terms of 
the free <M>ZG</M>-resolution of <M>Z</M> arising as the 
cellular chain complex of the tesselation of <M>R^n</M>
by the Dirichlet-Voronoi fundamental domain determined by <M>v</M>.

<P/>
This is a HAPcryst function and is thus only available if HAPcryst is loaded.


<P/>
The function requires the use of Polymake software.
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionDirectProduct        </Index>
<C> ResolutionDirectProduct(R,S)            </C>
&nbsp;
<C> ResolutionDirectProduct(R,S,"internal")</C>
<P/>

Inputs a <M>ZG</M>-resolution <M>R</M> and <M>ZH</M>-resolution <M>S</M>. 
It outputs a <M>ZD</M>-resolution for the direct product <M>D=G x H</M>.<P/>

If <M>G</M> and <M>H</M> lie in a common group <M>K</M>, and if they 
commute and have trivial intersection, then an optional third variable 
"internal" can be used. This will force <M>D</M> to be the subgroup 
<M>GH</M> in <M>K</M>.
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionExtension        </Index>
<C> ResolutionExtension(g,R,S)            </C>
&nbsp;
<C> ResolutionExtension(g,R, S,"TestFiniteness")</C>
&nbsp;
<C> ResolutionExtension(g,R,S,"NoTest",GmapE)</C>
<P/>
Inputs a surjective group homomorphism <M>g:E \longrightarrow G</M>
 with kernel <M>N</M>. It also inputs a <M>ZN</M>-resolution <M>R</M>
 and a <M>ZG</M>-resolution <M>S</M>. It returns a <M>ZE</M>-resolution. 
 The groups <M>E</M> and <M>G</M> can be infinite.<P/>

 If an optional fourth argument is set equal to "TestFiniteness" then the 
 groups <M>N</M> and <M>G</M> will be tested to see if they are finite. If 
 they are finite then some speed saving routines will be invoked.<P/>

 If the homomorphism <M>g</M> is such that the GAP function 
 <M>PreImagesElement(g,x)</M> doesn't work, then a function <M>GmapE()</M>
 should be included as a fifth input. For any <M>x</M> in <M>G</M> this 
 function should return an element <M>GmapE(x)</M> in <M>E</M>  which 
 gets mapped onto <M>x</M> by <M>g</M>.<P/>

 The contracting homotopy on the <M>ZE</M>-resolution has not yet been 
 fully implemented for infinite groups!
</Item>
</Row>


<Row>
<Item>
<Index>ResolutionFiniteDirectProduct</Index>
<C> ResolutionFiniteDirectProduct(R,S)            </C>
&nbsp;
<C> ResolutionFiniteDirectProduct(R,S, "internal")</C>
<P/>

Inputs a <M>ZG</M>-resolution <M>R</M> and <M>ZH</M>-resolution 
<M>S</M> where <M>G</M> and <M>H</M> are finite groups. It outputs a 
<M>ZD</M>-resolution for the direct product <M>D=G×H</M>.<P/>

If <M>G</M> and <M>H</M> lie in a common group <M>K</M>, and if they 
commute and have trivial intersection, then an optional third variable 
"internal" can be used. This will force <M>D</M> to be the subgroup 
<M>GH</M> in <M>K</M>.
</Item>
</Row>


<Row>
<Item>
<Index>ResolutionFiniteExtension</Index>
<C> ResolutionFiniteExtension(gensE,gensG,R,n)</C>
&nbsp;
<C> ResolutionFiniteExtension(gensE,gensG,R,n,true)
</C>
&nbsp;
<C> ResolutionFiniteExtension(gensE,gensG,R,n,false,S) 
</C>
<P/>

Inputs: a set <M>gensE</M> of generators for a finite group 
<M>E</M>; a set <M>gensG</M> equal to the image of <M>gensE</M> in 
a quotient group <M>G</M> of <M>E</M>; a <M>ZG</M>-resolution 
<M>R</M> up to dimension at least <M>n</M>; a positive  integer <M>n</M>. 
It uses the <M>TwistedTensorProduct()</M> construction to return 
<M>n</M> terms of a <M>ZE</M>-resolution.<P/>

The function has an optional fourth argument which, when set equal to "true", 
invokes tietze reductions in the construction of a resolution for the kernel of <M>E \longrightarrow G</M>.<P/>

If a <M>ZN</M>-resolution <M>S</M> is available, where <M>N</M> is the 
kernel of the quotient <M>E \longrightarrow G</M>, then this can be incorporated into the computations using an optional fifth argument. 
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionFiniteGroup</Index>
<C> ResolutionFiniteGroup(gens,n)</C>
&nbsp;
<C> ResolutionFiniteGroup(gens,n,true)</C>
&nbsp;
<C> ResolutionFiniteGroup(gens,n,false,p)
</C><P/>

Inputs a set <M>gens</M> of generators for a finite group <M>G</M> and
a positive integer <M>n</M>. It outputs <M>n</M> terms of a
<M>ZG</M>-resolution.<P/>

The function has an optional third argument which, when set equal to
<M>true</M>, invokes tietze reductions in the construction of the
resolution. <P/>

The function has an optional fourth
argument which, when set equal to a prime <M>p</M>, records the
fact that the resolution will only be used for mod <M>p</M>
calculations. This could speed up subsequent constructions.
<P/>

</Item></Row>



<Row>
<Item>
<Index> ResolutionFiniteSubgroup</Index>
<C> ResolutionFiniteSubgroup(R,K)</C>
&nbsp;
<C> ResolutionFiniteSubgroup(R,gensG,gensK)</C>
<P/>

Inputs a <M>ZG</M>-resolution for a finite group <M>G</M> and a subgroup 
<M>K</M> of index <M>|G:K|</M>. It returns a free 
<M>ZK</M>-resolution whose <M>ZK</M>-rank is <M>|G:K|</M>
times the <M>ZG</M>-rank 
in each dimension.<P/>

Generating sets <M>gensG</M>, <M>gensK</M> for <M>G</M> and <M>K</M>
can also be input to the function (though the method does not depend on 
a choice of generators).<P/>

This <M>ZK</M>-resolution is not reduced. ie. it has more than one 
generator in dimension <M>0</M>. 
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionGraphOfGroups        </Index>
<C> ResolutionGraphOfGroups(D,n)
</C>
&nbsp;
<C> ResolutionGraphOfGroups(D,n,L) </C>
<P/>

Inputs a graph of groups <M>D</M> and a positive integer <M>n</M>. 
It returns <M>n</M> terms of a free <M>ZG</M>-resolution for 
the fundamental group <M>G</M> of <M>D</M>.<P/>

An optional third argument <M>L=[R_1 , \ldots , R_t]</M>
can be used to list (in any order) free resolutions for some/all of 
the vertex and edge groups in <M>D</M>. 
If for some vertex or edge group no resolution is listed in <M>L</M>
then the function <M>ResolutionFiniteGroup()</M> will be used to try
to construct the resolution.  <P/>

The <M>ZG</M>-resolution is usually not reduced. 
i.e. it has more than one generator in dimension 0.<P/>


The contracting homotopy on the <M>ZG</M>-resolution has 
not yet been implemented! Furthermore, the group <M>G</M>
is currently returned only as a finitely presented group 
(without any method for solving the word problem).
</Item>
</Row>


<Row>
<Item>
<Index>ResolutionNilpotentGroup        </Index>
<C> ResolutionNilpotentGroup(G,n)            </C>
&nbsp;
<C> ResolutionNilpotentGroup(G,n,"TestFiniteness")</C>
<P/>

Inputs a nilpotent group <M>G</M> and positive integer <M>n</M>. 
It returns <M>n</M> terms of a free <M>ZG</M>-resolution. 
The resolution is computed using a divide-and-conquer 
technique involving the lower central series.<P/>

This function can be applied to infinite groups <M>G</M>. 
For finite groups the function <M>ResolutionNormalSeries()</M>
probably gives better results.<P/>

If an optional third argument is set equal to 
"TestFiniteness" then the groups <M>N</M> and <M>G</M>
will be tested to see if they are finite. If they are finite then 
some speed saving routines will be invoked.<P/>

The contracting homotopy on the <M>ZE</M>-resolution has not 
yet been fully implemented for infinite groups.
</Item>
</Row>

<Row>
<Item>
<Index> ResolutionNormalSeries       </Index>
<C> ResolutionNormalSeries(L,n)            </C>
&nbsp;
<C> ResolutionNormalSeries(L,n,true)</C>
&nbsp;
<C> ResolutionNormalSeries(L,n,false,p)</C>
<P/>

Inputs a positive integer <M>n</M> and a list 
<M>L = [L_1 , ..., L_k]</M> of normal subgroups <M>L_i</M>
of a finite group <M>G</M> satisfying <M>G = L_1</M> &tgt; <M>L2</M>
&tgt;<M> \ldots </M>
&tgt;<M> L_k</M>. Alternatively, <M>L = [gensL_1, ... gensL_k]</M>
can be a list of generating sets for the <M>L_i</M>
(and these  particular generators will be used in the 
construction of resolutions). It returns a <M>ZG</M>-resolution 
by repeatedly using the function <M>ResolutionFiniteExtension()</M>.<P/>

The function has an optional third argument which, if set equal to true, 
invokes tietze reductions in the construction of resolutions.<P/>

The function has an optional fourth argument which, 
if set equal to p &tgt; 0, 
produces a resolution which is only valid for mod <M>p</M> calculations.
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionPrimePowerGroup        </Index>
<C> ResolutionPrimePowerGroup(P,n) </C>
&nbsp;
<C> ResolutionPrimePowerGroup(G,n,p)</C>
<P/>

Inputs a <M>p</M>-group <M>P</M> and integer <M>n</M>&tgt;<M>0</M>. 
It uses GAP's standard linear algebra functions over the field <M>F</M>
of p elements
to construct a free <M>FP</M>-resolution for mod <M>p</M>
calculations only. The resolution is minimal - 
meaning that the number of generators of <M>R_n</M>
equals the rank of <M>H_n(P,F)</M>.
<P/>

The function can also be used to obtain a free non-minimal <M>FG</M>-resolution
of a small group <M>G</M> of non-prime-power order. In this case the prime <M>p</M> must be entered as
the third input variable. (In the non-prime-power case the algorithm is naive and not very good.)
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionSmallFpGroup        </Index>
<C> ResolutionSmallFpGroup(G,n)            </C>
&nbsp;
<C> ResolutionSmallFpGroup(G,n,p)
</C>
<P/>

Inputs a small finitely presented group <M>G</M> and an integer 
<M>n</M>&tgt;<M>0</M>. It returns <M>n</M> terms of a <M>ZG</M>-resolution 
which, in dimensions 1 and 2, corresponds to the 
given presentation for <M>G</M>. 
The method returns no contracting homotopy for the resolution.<P/>

The function has an optional fourth argument which, 
when set equal to a prime <M>p</M>, 
records the fact that the resolution will only be used for mod <M>p</M>
calculations. This could speed up subsequent constructions.
<P/>

This function was written by Irina Kholodna.
</Item>
</Row>

<Row>
<Item>
<Index>ResolutionSubgroup</Index>
<C> ResolutionSubgroup(R,K)</C>
<P/>

Inputs a <M>ZG</M>-resolution for an (infinite) group <M>G</M> and a 
subgroup <M>K</M> of finite index <M>|G:K|</M>. It returns a free 
<M>ZK</M>-resolution whose <M>ZK</M>-rank is <M>|G:K|</M> times 
the <M>ZG</M>-rank in each dimension.<P/>

If <M>G</M> is finite then the function 
<M>ResolutionFiniteSubgroup(R,G,K)</M> will probably work better. 
In particular, resolutions from this function 
probably won't work with the function <M>EquivariantChainMap()</M>.

This <M>ZK</M>-resolution is not reduced. i.e. 
it has more than one generator in dimension 0. 
</Item>
</Row>


<Row>
<Item>
<Index>ResolutionSubnormalSeries        </Index>
<C> ResolutionSubnormalSeries(L,n)            </C>
<P/>

Inputs a positive integer n and a list <M>L = [L_1 , \ldots , L_k]</M>
of  subgroups <M>L_i</M> of a finite group <M>G=L_1</M> such that 
<M>L_1</M> &tgt; <M>L2 \ldots </M> &tgt; <M>L_k</M> is a subnormal series in 
<M>G</M> (meaning that each <M>L_{i+1}</M> must be normal in <M>L_i</M>). 
It returns a <M>ZG</M>-resolution by repeatedly using the function 
<M>ResolutionFiniteExtension()</M>.<P/>

If <M>L</M> is a series of normal subgroups in <M>G</M>
then the function <M>ResolutionNormalSeries(L,n)</M>
will possibly work more efficiently.
</Item>
</Row>

<Row>
<Item>
<Index> TwistedTensorProduct</Index>
<C> 
TwistedTensorProduct(R,S,EhomG,GmapE,NhomE,NEhomN,EltsE,Mult,InvE)</C>
<P/>

Inputs a <M>ZG</M>-resolution <M>R</M>, a <M>ZN</M>-resolution 
<M>S</M>, and other data relating to a short exact sequence 
<M>1 \longrightarrow N \longrightarrow
E \longrightarrow
G \longrightarrow 1</M>.
It uses a perturbation technique of CTC Wall to construct a 
<M>ZE</M>-resolution <M>F</M>. Both <M>G</M> and <M>N</M> 
could be infinite. The "length" of <M>F</M> is equal to the 
minimum of the "length"s of <M>R</M> and <M>S</M>. 
The resolution <M>R</M> needs no contracting homotopy if no such homotopy 
is requied for <M>F</M>. 
</Item>
</Row>
</Table>
</Chapter>

