<Chapter><Heading> Cohomology ring structure</Heading>

<Table Align="|l|" >

<Row>
<Item>
<Index> IntegralCupProduct
</Index>
<C>IntegralCupProduct(R,u,v,p,q)
</C>
<Br/>
<C>
IntegralCupProduct(R,u,v,p,q,P,Q,N)
</C>
<P/>
(Various functions used to construct the cup product
are also <URL Text="available"> CR_functions.html</URL>.)
<P/>

Inputs a <M>ZG</M>-resolution <M>R</M>, a vector <M>u</M> representing an 
element in <M>H^p(G,Z)</M>, a vector <M>v</M> representing an element in 
<M>H^q(G,Z)</M> and the two integers <M>p,q</M> &tgt;<M> 0</M>. 
It returns a vector <M>w</M> representing the cup product <M>u\cdot v</M>
in <M>H^{p+q}(G,Z)</M>. This product is associative and 
<M>u\cdot v = (-1)pqv\cdot u</M> .  
It provides <M>H^\ast(G,Z)</M> with the structure of an 
anti-commutative graded ring. This function implements the
cup product for 
characteristic 0 only.
<P/>
The resolution <M>R</M> needs a contracting homotopy.
<P/>
To save the function from having to calculate the abelian groups
<M>H^n(G,Z)</M> additional input variables can be used in the form 
<M>IntegralCupProduct(R,u,v,p,q,P,Q,N)</M> , where 

<List>
<Item>
<M>P</M> is the output of the command <M>CR_CocyclesAndCoboundaries(R,p,true)</M>
</Item>
<Item>
<M>Q</M> is the output of the command <M>CR_CocyclesAndCoboundaries(R,q,true)</M></Item>
<Item><M>N</M> is the output of the command 
<M>CR_CocyclesAndCoboundaries(R,p+q,true)</M> .
</Item>
</List>	    
</Item>
</Row>

<Row>
<Item>
<Index> IntegralRingGenerators</Index>
<C>
IntegralRingGenerators(R,n)
</C>
<P/>

Inputs at least <M>n+1</M> terms of a <M>ZG</M>-resolution and integer 
<M>n</M>&tgt; <M>0</M>. It returns a minimal list of cohomology classes in 
<M>H^n(G,Z)</M> which, together with all cup products of lower degree 
classes, generate the group <M>H^n(G,Z)</M> .
<P/>
(Let <M>a_i</M> be the <M>i</M>-th canonical generator of the 
<M>d</M>-generator abelian group <M>H^n(G,Z)</M>. The cohomology class 
<M>n_1a_1 + ... +n_da_d</M> is represented by the integer vector 
<M>u=(n_1, ..., n_d)</M>. )
</Item>
</Row>

<Row>
<Item>
<Index> ModPCohomologyGenerators</Index>
<C>
ModPCohomologyGenerators(G,n)
</C>
<Br/>
<C>
ModPCohomologyGenerators(R)
</C>
<P/>

Inputs either a <M>p</M>-group <M>G</M> and positive integer <M>n</M>, or
else <M>n</M> terms of a minimal <M>Z_pG</M>-resolution <M>R</M> of <M>Z_p</M>.
It returns a pair whose first entry is a minimal set of homogeneous generators for 
the cohomology ring <M>A=H^*(G,Z_p)</M> modulo all elements
in degree greater than <M>n</M>. The second entry of the pair is a function <M>deg</M> which, when applied to a minimal generator, yields its degree.
<P/>
WARNING: the following rule must be applied when multiplying generators <M>x_i</M>
together. Only products of the form <M>x_1*(x_2*(x_3*(x_4*...)))</M> with <M>deg(x_i) \le deg(x_{i+1})</M> should be computed (since the 
<M>x_i</M> belong to a structure constant algebra with only a partially 
defined structure constants table).

</Item>
</Row>

<Row>
<Item>
<Index> ModPCohomologyRing</Index>
<C>
ModPCohomologyRing(G,n)
</C>
<Br/>
<C>
ModPCohomologyRing(G,n,level)
</C>
<Br/>
<C>
ModPCohomologyRing(R)
</C>
<Br/>
<C>
ModPCohomologyRing(R,level)
</C>
<P/>


Inputs either a <M>p</M>-group <M>G</M> and positive integer <M>n</M>, or 
else <M>n</M> terms of a minimal <M>Z_pG</M>-resolution <M>R</M> of <M>Z_p</M>.
It returns the cohomology ring <M>A=H^*(G,Z_p)</M> modulo all elements 
in degree greater than <M>n</M>.
<P/>
The ring is returned as a structure constant algebra <M>A</M>.
<P/>
The ring <M>A</M> is graded. It has a component <M>A!.degree(x)</M>
which is a function returning the degree of each (homogeneous) element 
<M>x</M> in <M>GeneratorsOfAlgebra(A)</M>.

<P/> An optional input variable "level"
can be set to one of the strings  "medium" or "high". These settings
determine parameters in the algorithm. The default setting is "medium".

<P/> When "level" is set to "high" the ring <M>A</M> is returned with a component <M>A!.niceBasis</M>. This component is a pair <M>[Coeff,Bas]</M>. Here
<M>Bas</M> is a list of integer lists; a "nice" basis for the vector space <M>A</M> can be constructed using the command <M>List(Bas,x->Product(List(x,i->Basis(A)[i]))</M>. 
 The coefficients of the canonical basis element <M>Basis(A)[i]</M> are stored as <M>Coeff[i]</M>.

<P/>
 If the ring <M>A</M> is computed using the setting "level"="medium" then the component <M>A!.niceBasis</M> can be added to <M>A</M> using the command
 <M> A:=ModPCohomologyRing_part_2(A) </M>.
</Item>
</Row>



<Row>
<Item>
<Index> ModPRingGenerators</Index>
<C>
ModPRingGenerators(A)
</C>
<P/>

Inputs a mod <M>p</M> cohomology ring <M>A</M> 
(created using the preceeding function). It returns a minimal 
generating set for the 
ring <M>A</M>. Each generator is homogeneous.
</Item>
</Row>


</Table>
</Chapter>


