<!-- 
  HAPPRIME - poincare.xml.in
  Function documentation template file for HAPprime
  Paul Smith

  Copyright (C)  2007-2008
  Paul Smith
  National University of Ireland Galway

  $Id: functions.xml.in 200 2008-02-05 14:29:47Z pas $
-->

<!-- ********************************************************** -->
<Chapter  Label="Poincare">
  <Heading>Poincaré series</Heading>
    The Poincaré series for the mod-&p; cohomology ring <M>H^*(G, \mathbb{F})</M>
    is the infinite series
    <Display>
      a_0 + a_1x + a_2x^2 + a_3x^3 + ...
    </Display>
    where <M>a_k</M> is the dimension of the vector space <M>H^k(G, \mathbb{F})</M>.
    The Poincaré function is a rational function <M>P(x)/Q(x)</M> which is
    equal to the Poincaré series. 
    
    <Section>
      <Heading>Computing the Poincaré series using spectral sequences</Heading>
      
      &HAPprime; can calculate a provably-correct Poincaré series for the
      mod-&p; cohomology ring of a small &p;-group using spectral sequences, 
      without having to compute the actual cohomology ring. The limiting sheet of a
      Lyndon-Hochschild-Serre spectral sequence for a group &G; will be a ring 
      with the same additive structure as the cohomology ring for &G;, and thus 
      the same Poincaré series. This is implemented in the &HAPprime; 
      function <Ref Oper="PoincareSeriesLHS" BookName="HAPprime"/>. See
      the documentation for that function in the user guide for more details.
    </Section>
    
    <Section>
      <Heading>Computing the Poincaré series using a minimal resolution</Heading>
      Given a resolution <M>R</M> of length <M>n</M>
      for a group &G;, the &HAP; function
      <Ref Func="PoincareSeries" BookName="HAP"/> calculates a quotient of
      polynomials such that the coefficient of <M>x^k</M> equals the dimension of
      <M>H^k(G, \mathbb{F})</M> for <M>k = 1</M> to <M>k = n</M>. Given a
      sufficiently long resolution <M>R</M>, this quotient should equal the 
      true Poincaré series. The function can also automatically find a suitable
      value for <M>n</M> by trying resolutions of increasing length until a
      consistent estimate is found for the Poincaré series. This is likely to be
      correct, but we have no proof that this will always be the case.
      <P/>
      The function 
      <Ref Oper="ExtendResolutionPrimePowerGroupAutoMem" BookName="HAPprime"/> 
      allows &HAPprime; to provide a simplified implementation for calculating
      Poincaré series in the case where <M>n</M> is not specified (since
      extending existing resolutions is difficult in
      &HAP;). The &HAPprime; function <Ref Oper="PoincareSeriesAutoMem"  BookName="HAPprime Datatypes"/> is a 
      replacement for &HAP;'s <Ref Func="PoincareSeries" BookName="HAP"/>
      in the case where &G; is a &p;-group and the optimal <M>n</M> is not
      known. 
      <P/>
      By using the &HAPprime; resolution-calculation functions,
      <Ref Oper="PoincareSeriesAutoMem" BookName="HAPprime Datatypes"/> saves memory when storing resolution,
      and switches to the <C>GF</C> algorithm when memory is low. As a result, it
      can calculate the Poincaré series for groups that would be impossible
      using &HAP; without having about five times the memory available to the
      machine.
    
    <!-- ********************************************************** -->
    <#Include Label="PoincareSeriesAutoMem_DTmanPoincare">
    </Section>
    
    <Section Label="PoincareExample">
      <Heading>Example Poincaré series computations</Heading>
      
        This example compares the time taken by 
        <Ref Func="PoincareSeries" BookName="HAP"/> and 
        <Ref Oper="PoincareSeriesAutoMem" BookName="HAPprime Datatypes"/>, and shows that the times are
        roughly comparable:
<!--
gap> G := SmallGroup(64, 210);;
gap> # Compute the Poincare series using HAP
gap> P1 := PoincareSeries(G);time;
gap> # Compute the Poincare series using HAPprime
gap> P2 := PoincareSeriesAutoMem(G);time;
gap> P1 = P2;
-->
<Log><![CDATA[
gap> G := SmallGroup(64, 210);;
gap> # Compute the Poincare series using HAP
gap> P1 := PoincareSeries(G);time;
(x_1^4+x_1^2+x_1+1)/(-x_1^7+3*x_1^6-5*x_1^5+7*x_1^4-7*x_1^3+5*x_1^2-3*x_1+1)
51355
gap> # Compute the Poincare series using HAPprime
gap> P2 := PoincareSeriesAutoMem(G);time;
(x_1^4+x_1^2+x_1+1)/(-x_1^7+3*x_1^6-5*x_1^5+7*x_1^4-7*x_1^3+5*x_1^2-3*x_1+1)
39774
gap> P1 = P2;
true]]></Log>

      The &HAPprime; function <Ref Oper="PoincareSeriesLHS" BookName="HAPprime"/>
      uses an alternative approach to compute Poincaré series which are 
      guaranteed to be correct. In many cases it is also faster, as we
      see if we compute the Poincaré series for the same group using this
      function:
<!--
gap> G := SmallGroup(64, 210);;
gap> P3 := PoincareSeriesLHS(G);time;
-->
<Log><![CDATA[
gap> G := SmallGroup(64, 210);;
gap> P3 := PoincareSeriesLHS(G);time;
(x_1^4+x_1^2+x_1+1)/(-x_1^7+3*x_1^6-5*x_1^5+7*x_1^4-7*x_1^3+5*x_1^2-3*x_1+1)
3564]]></Log>
      
    </Section>
    
    <Section>
      <Heading>The Poincaré series of groups of order 64 and 128</Heading>
    
      Using &HAPprime;, on a dual-processor AMD Opteron 250 machine, we have 
      calculated the Poincaré series for all of the groups of order 64 using 
      the resolution-based technique. Most
      computed within a few seconds using only a few Mb of memory. With a 
      maximum of 1Gb of memory available to &GAP;, four groups 
      (numbers 4, 60, 242 and 266 from the &GAP; <K>SmallGroup</K> library)
      needed to switch to using <Ref Oper="ExtendResolutionPrimePowerGroupGF" BookName="HAPprime"/>.
      Calculating the Poincaré series of the most difficult group,
      <C>SmallGroup(64, 60)</C>, took 24 days, computing a resolution whose last
      term was <M>M_{16} = (\mathbb{F}G)^{2445}</M>. The complete list of the
      Poincaré series for all groups of order 64 is available
      on the &HAPprime; website 
      <URL>http://www.maths.nuigalway.ie/~pas/CHA/HAPprime/HAPprimeindex.html</URL>
      <P/>
      There is an on-going programme of calculating the Poincaré series for
      the groups of order 128. To date, using the same constraints as for the
      groups of order 64 above, we have computed the Poincaré series for
      about half of them. For latest details, again please see the
      &HAPprime; website.
    </Section>
      

</Chapter>

