From 3a992b9729795d219133842fd50e708685a27de1 Mon Sep 17 00:00:00 2001
From: grahamknockillaree
Date: Thu, 24 Oct 2024 13:15:05 +0100
Subject: [PATCH] version 1.66
---
PackageInfo.g | 4 +-
README.md | 12 +-
date | 2 +-
doc/Undocumented.xml | 31 +-
doc/newFunctors.xml | 4 +-
doc/newHomology.xml | 2 +-
doc/newNewCellComplexes.xml | 2 +-
doc/newNewResolutions.xml | 6 +-
lib/ArithmeticGroups/crystGbasis.gi | 5 +-
lib/ArithmeticGroups/crystGcomplex.gi | 64 +-
.../crystGcomplex.original.tuan | 971 ++++++++++++++++++
lib/ArithmeticGroups/freeZGRes.gi | 2 +-
lib/Congruence/bianchi.gi | 9 +-
read.KEEP | 10 +-
read.g | 10 +-
tutorial/mybib.xml | 20 +
tutorial/tutex/7.3.txt | 13 +
tutorial/tutex/7.4.txt | 18 +
tutorial/tutex/7.5.txt | 37 +
tutorial/tutorialSimplicialComplexes.xml | 2 +-
tutorial/tutorialSteenrod.xml | 71 +-
version | 2 +-
www/download/downloadContent.html | 14 +-
www/home/content.html | 4 +-
www/home/hap.pdf | Bin 136565 -> 136951 bytes
25 files changed, 1259 insertions(+), 56 deletions(-)
create mode 100644 lib/ArithmeticGroups/crystGcomplex.original.tuan
create mode 100644 tutorial/tutex/7.3.txt
create mode 100644 tutorial/tutex/7.4.txt
create mode 100644 tutorial/tutex/7.5.txt
diff --git a/PackageInfo.g b/PackageInfo.g
index a2cd5dd0..67c35c64 100644
--- a/PackageInfo.g
+++ b/PackageInfo.g
@@ -8,8 +8,8 @@ SetPackageInfo( rec(
PackageName := "HAP",
Subtitle := "Homological Algebra Programming",
- Version := "1.65",
- Date := "29/07/2024",
+ Version := "1.66",
+ Date := "24/10/2024",
License := "GPL-2.0-or-later",
SourceRepository := rec(
diff --git a/README.md b/README.md
index b18b53d6..f95474f4 100644
--- a/README.md
+++ b/README.md
@@ -32,12 +32,12 @@ Please send your bug reports to graham.ellis(at)nuigalway.ie .
On a Linux machine with GAP (and optionally Polymake) installed, the HAP
library can be loaded as follows:
-* First download the file hap1.65.tar.gz to the subdirectory "pkg/" of GAP. (If
+* First download the file hap1.66.tar.gz to the subdirectory "pkg/" of GAP. (If
you don't have access to this, then create a directory "pkg" in your home
directory and download the file there.)
-* Change to directory "pkg/" and type "gunzip hap1.65.tar.gz" followed by
-"tar -xvf hap1.65.tar" .
+* Change to directory "pkg/" and type "gunzip hap1.66.tar.gz" followed by
+"tar -xvf hap1.66.tar" .
* Start GAP. (If you have created "pkg" in your home directory then start GAP
with the command "gap -l 'path/homedir;' " where path/homedir is the path to
@@ -46,12 +46,12 @@ your home directory.)
* In GAP type " LoadPackage("HAP"); " .
* Help on HAP can be found on the HAP home page (a version of which is
-included in directory "pkg/Hap1.65/www" of this distribution).
+included in directory "pkg/Hap1.66/www" of this distribution).
* Performance can be significantly improved by using a compiled version of the
HAP library. A compiled version can be created by the following steps.
-1. Change to the directory "pkg/Hap1.65/" .
+1. Change to the directory "pkg/Hap1.66/" .
2. Edit the file "compile" so that: PKGDIR is equal to the path to the
directory "pkg" where your GAP packages are stored; GACDIR is equal to the
path to the directory where the GAP compiler "gac" is stored.
@@ -60,4 +60,4 @@ path to the directory where the GAP compiler "gac" is stored.
The next time HAP is loaded a compiled version will be loaded.
* Should you want to return to an uncompiled version, change to the directory
-"pkg/Hap1.65/" and type "./uncompile".
+"pkg/Hap1.66/" and type "./uncompile".
diff --git a/date b/date
index 01efbf5e..a2c6fdf6 100644
--- a/date
+++ b/date
@@ -1 +1 @@
-29 July 2024
+24 October 2024
diff --git a/doc/Undocumented.xml b/doc/Undocumented.xml
index 39675682..cd00ed43 100644
--- a/doc/Undocumented.xml
+++ b/doc/Undocumented.xml
@@ -299,12 +299,14 @@
CrystFinitePartOfMatrixExamples:
PositionCanonicalExamples:
diff --git a/doc/newFunctors.xml b/doc/newFunctors.xml
index c6de9651..62f58324 100644
--- a/doc/newFunctors.xml
+++ b/doc/newFunctors.xml
@@ -1,9 +1,9 @@
Functors Inputs a ZH-resolution R, a group G containing H as a subgroup, and a list EltsG of elements of G. It returns the free ZG-resolution (R \otimes_{ZH} ZG). The returned resolution S has S!.elts:=EltsG. This is a resolution of the ZG-module (Z \otimes_{ZH} ZG). (Here \otimes_{ZH} means tensor over ZH.) Examples:
- Inputs either a ZG-resolution X=R, or an equivariant chain map X = (F:R \longrightarrow S). It returns the cochain complex or cochain map obtained by applying HomZG( _ , Z) where Z is the trivial module of integers (characteristic 0). Examples:../tutorial/chap1.html1 , ../tutorial/chap7.html2 , ../tutorial/chap10.html3 , ../tutorial/chap13.html4 , ../www/SideLinks/About/aboutCohomologyRings.html5 , ../www/SideLinks/About/aboutSpaceGroup.html6 , ../www/SideLinks/About/aboutIntro.html7 , ../www/SideLinks/About/aboutTorAndExt.html8
+ Inputs either a ZG-resolution X=R, or an equivariant chain map X = (F:R \longrightarrow S). It returns the cochain complex or cochain map obtained by applying HomZG( _ , Z) where Z is the trivial module of integers (characteristic 0). Examples:../tutorial/chap1.html1 , ../tutorial/chap7.html2 , ../tutorial/chap8.html3 , ../tutorial/chap10.html4 , ../tutorial/chap13.html5 , ../www/SideLinks/About/aboutCohomologyRings.html6 , ../www/SideLinks/About/aboutSpaceGroup.html7 , ../www/SideLinks/About/aboutIntro.html8 , ../www/SideLinks/About/aboutTorAndExt.html9
- Inputs a ZG-resolution R and returns the cochain complex obtained by applying HomZG( _ , Z_p) where Z_p is the trivial module of integers mod p. (At present this functor does not handle equivariant chain maps.) Examples:../www/SideLinks/About/aboutSpaceGroup.html1 , ../www/SideLinks/About/aboutIntro.html2 , ../www/SideLinks/About/aboutTorAndExt.html3
+ Inputs a ZG-resolution R and returns the cochain complex obtained by applying HomZG( _ , Z_p) where Z_p is the trivial module of integers mod p. (At present this functor does not handle equivariant chain maps.) Examples:../tutorial/chap8.html1 , ../www/SideLinks/About/aboutSpaceGroup.html2 , ../www/SideLinks/About/aboutIntro.html3 , ../www/SideLinks/About/aboutTorAndExt.html4 Inputs a ZG-resolution R and a group homomorphism f:G \longrightarrow GL_n(Z) to the group of n×n invertible integer matrices. Here Z must have characteristic 0. It returns the cochain complex obtained by applying HomZG( _ , A) where A is the ZG-module Z^n with G action via f. (At present this function does not handle equivariant chain maps.) Examples:../tutorial/chap7.html1 , ../tutorial/chap13.html2 , ../www/SideLinks/About/aboutTwistedCoefficients.html3
diff --git a/doc/newHomology.xml b/doc/newHomology.xml
index 22617781..1748061e 100644
--- a/doc/newHomology.xml
+++ b/doc/newHomology.xml
@@ -5,7 +5,7 @@
Inputs a cochain complex C in characteristic 0, a positive integer n, and a prime p. It returns a list of those torsion coefficients of H^n(C) that are positive powers of p. The function uses the EDIM package by Frank Luebeck. Examples:
- Inputs a positive integer n and either a finite group X=G or a nilpotent Pcp-group X=G or a space group X=G or a list X=D representing a graph of groupsor a pair X=["Artin",D] where D is a Coxeter diagram representing an infinite Artin group G.or a pair X=["Coxeter",D] where D is a Coxeter diagram representing a finite Coxeter group G. It returns the torsion coefficients of the integral cohomology H^n(G,Z). There is an optional third argument which, when set equal to a prime p, causes the function to return the the mod p cohomology H^n(G,Z_p) as a list of length equal to its rank. This function is a composite of more basic functions, and makes choices for a number of parameters. For a particular group you would almost certainly be better using the more basic functions and making the choices yourself! Examples:../tutorial/chap7.html1
+ Inputs a positive integer n and either a finite group X=G or a nilpotent Pcp-group X=G or a space group X=G or a list X=D representing a graph of groupsor a pair X=["Artin",D] where D is a Coxeter diagram representing an infinite Artin group G.or a pair X=["Coxeter",D] where D is a Coxeter diagram representing a finite Coxeter group G. It returns the torsion coefficients of the integral cohomology H^n(G,Z). There is an optional third argument which, when set equal to a prime p, causes the function to return the the mod p cohomology H^n(G,Z_p) as a list of length equal to its rank. This function is a composite of more basic functions, and makes choices for a number of parameters. For a particular group you would almost certainly be better using the more basic functions and making the choices yourself! Examples:../tutorial/chap7.html1 , ../tutorial/chap8.html2 Inputs a positive integer n and either a finite group X=G or a nilpotent Pcp-group X=G or a space group X=G or a list X=D representing a graph of groupsor a pair X=["Artin",D] where D is a Coxeter diagram representing an infinite Artin group G.or a pair X=["Coxeter",D] where D is a Coxeter diagram representing a finite Coxeter group G. It returns the torsion coefficients of the integral homology H_n(G,Z). There is an optional third argument which, when set equal to a prime p, causes the function to return the mod p homology H_n(G,Z_p) as a list of lenth equal to its rank. This function is a composite of more basic functions, and makes choices for a number of parameters. For a particular group you would almost certainly be better using the more basic functions and making the choices yourself! Examples:../tutorial/chap7.html1 , ../tutorial/chap13.html2 , ../www/SideLinks/About/aboutLinks.html3 , ../www/SideLinks/About/aboutParallel.html4 , ../www/SideLinks/About/aboutRosenbergerMonster.html5 , ../www/SideLinks/About/aboutFunctorial.html6 , ../www/SideLinks/About/aboutIntro.html7 , ../www/SideLinks/About/aboutTensorSquare.html8 , ../www/SideLinks/About/aboutLie.html9
diff --git a/doc/newNewCellComplexes.xml b/doc/newNewCellComplexes.xml
index a17197f0..ef46a7b5 100644
--- a/doc/newNewCellComplexes.xml
+++ b/doc/newNewCellComplexes.xml
@@ -153,7 +153,7 @@
Inputs a free \mathbb ZG-resolution R for which "filteredDimension" lies in NamesOfComponents(R), together with a prime p. (Such a resolution can be produced using TwisterTensorProduct(), ResolutionNormalSubgroups() or FreeGResolution().) It returns the filtered chain complex obtained by tensoring with the trivial module \mathbb F, the field of p elements. Examples:../tutorial/chap10.html1 , ../www/SideLinks/About/aboutPersistent.html2
- Inputs a chain complex C of free abelian groups and returns the cochain complex Hom_{\mathbb Z}(C,\mathbb Z). Inputs a free \mathbb ZG-resolution R in characteristic 0 and returns the cochain complex Hom_{\mathbb ZG}(R,\mathbb Z). Inputs an equivariant chain map F\colon R\rightarrow S of resolutions and returns the induced cochain map Hom_{\mathbb ZG}(S,\mathbb Z) \longrightarrow Hom_{\mathbb ZG}(R,\mathbb Z). Examples:../tutorial/chap1.html1 , ../tutorial/chap7.html2 , ../tutorial/chap10.html3 , ../tutorial/chap13.html4 , ../www/SideLinks/About/aboutCohomologyRings.html5 , ../www/SideLinks/About/aboutSpaceGroup.html6 , ../www/SideLinks/About/aboutIntro.html7 , ../www/SideLinks/About/aboutTorAndExt.html8
+ Inputs a chain complex C of free abelian groups and returns the cochain complex Hom_{\mathbb Z}(C,\mathbb Z). Inputs a free \mathbb ZG-resolution R in characteristic 0 and returns the cochain complex Hom_{\mathbb ZG}(R,\mathbb Z). Inputs an equivariant chain map F\colon R\rightarrow S of resolutions and returns the induced cochain map Hom_{\mathbb ZG}(S,\mathbb Z) \longrightarrow Hom_{\mathbb ZG}(R,\mathbb Z). Examples:../tutorial/chap1.html1 , ../tutorial/chap7.html2 , ../tutorial/chap8.html3 , ../tutorial/chap10.html4 , ../tutorial/chap13.html5 , ../www/SideLinks/About/aboutCohomologyRings.html6 , ../www/SideLinks/About/aboutSpaceGroup.html7 , ../www/SideLinks/About/aboutIntro.html8 , ../www/SideLinks/About/aboutTorAndExt.html9 Inputs a chain complex C of characteristic 0 and a prime integer p. It returns the chain complex C \otimes_{\mathbb Z} {\mathbb Z}_p of characteristic p. Inputs a free \mathbb ZG-resolution R of characteristic 0 and a prime integer p. It returns the chain complex R \otimes_{\mathbb ZG} {\mathbb Z}_p of characteristic p. Inputs an equivariant chain map F\colon R \rightarrow S in characteristic 0 a prime integer p. It returns the induced chain map F\otimes_{\mathbb ZG}\mathbb Z_p \colon R \otimes_{\mathbb ZG} {\mathbb Z}_p \longrightarrow S \otimes_{\mathbb ZG} {\mathbb Z}_p. Examples:../tutorial/chap1.html1 , ../tutorial/chap10.html2 , ../www/SideLinks/About/aboutArithmetic.html3 , ../www/SideLinks/About/aboutPerformance.html4 , ../www/SideLinks/About/aboutPersistent.html5 , ../www/SideLinks/About/aboutPoincareSeries.html6 , ../www/SideLinks/About/aboutDefinitions.html7 , ../www/SideLinks/About/aboutExtensions.html8 , ../www/SideLinks/About/aboutTorAndExt.html9 (Co)chain Complexes \longrightarrow Homotopy Invariants
diff --git a/doc/newNewResolutions.xml b/doc/newNewResolutions.xml
index 15c97168..e071f483 100644
--- a/doc/newNewResolutions.xml
+++ b/doc/newNewResolutions.xml
@@ -5,7 +5,7 @@
Inputs a torsion free crystallographic group G, also known as a Bieberbach group, represented using AffineCrystGroupOnRight as in the GAP package Cryst. It also optionally inputs a choice of vector v in the Euclidean space \mathbb R^n on which G acts freely. The function returns n+1 terms of the free ZG-resolution of \mathbb Z arising as the cellular chain complex of the tessellation of \mathbb R^n by the Dirichlet-Voronoi fundamental domain determined by v. No contracting homotopy is returned with the resolution. This function is part of the HAPcryst package written by Marc Roeder and thus requires the HAPcryst package to be loaded. The function requires the use of Polymake software. Examples:../tutorial/chap11.html1
- Inputs a crystallographic group G represented using AffineCrystGroupOnRight as in the GAP package Cryst together with an integer k \ge 1. The function tries to find a cubical fundamental domain in the Euclidean space \mathbb R^n on which G acts. If it succeeds it uses this domain to return k+1 terms of a free ZG-resolution of \mathbb Z. This function was written by Bui Anh Tuan. Examples:../tutorial/chap1.html1 , ../tutorial/chap11.html2
+ Inputs a crystallographic group G represented using AffineCrystGroupOnRight as in the GAP package Cryst together with an integer k \ge 1. The function tries to find a cubical fundamental domain in the Euclidean space \mathbb R^n on which G acts. If it succeeds it uses this domain to return k+1 terms of a free ZG-resolution of \mathbb Z. This function was written by Bui Anh Tuan. Examples:../tutorial/chap1.html1 , ../tutorial/chap8.html2 , ../tutorial/chap11.html3 Inputs a finite group G and an integer k \ge 1. It returns k+1 terms of a free ZG-resolution of \mathbb Z. Examples:../tutorial/chap6.html1 , ../tutorial/chap7.html2 , ../tutorial/chap8.html3 , ../tutorial/chap10.html4 , ../tutorial/chap11.html5 , ../www/SideLinks/About/aboutParallel.html6 , ../www/SideLinks/About/aboutPerformance.html7 , ../www/SideLinks/About/aboutCocycles.html8 , ../www/SideLinks/About/aboutPeriodic.html9 , ../www/SideLinks/About/aboutCohomologyRings.html10 , ../www/SideLinks/About/aboutPoincareSeries.html11 , ../www/SideLinks/About/aboutCrossedMods.html12 , ../www/SideLinks/About/aboutDefinitions.html13 , ../www/SideLinks/About/aboutSimplicialGroups.html14 , ../www/SideLinks/About/aboutExtensions.html15 , ../www/SideLinks/About/aboutSpaceGroup.html16 , ../www/SideLinks/About/aboutFunctorial.html17 , ../www/SideLinks/About/aboutGouter.html18 , ../www/SideLinks/About/aboutTopology.html19 , ../www/SideLinks/About/aboutTwistedCoefficients.html20
@@ -23,7 +23,7 @@
Algebras \longrightarrow (Co)chain Complexes Inputs a Leibniz algebra, or Lie algebra, \mathfrak{g} over a ring \mathbb K together with an integer n\ge 0. It returns the first n terms of the Leibniz chain complex over \mathbb K. The complex was implemented by Pablo Fernandez Ascariz. Examples: Resolutions \longrightarrow (Co)chain Complexes
- Inputs a chain complex C of free abelian groups and returns the cochain complex Hom_{\mathbb Z}(C,\mathbb Z). Inputs a free \mathbb ZG-resolution R in characteristic 0 and returns the cochain complex Hom_{\mathbb ZG}(R,\mathbb Z). Inputs an equivariant chain map F\colon R\rightarrow S of resolutions and returns the induced cochain map Hom_{\mathbb ZG}(S,\mathbb Z) \longrightarrow Hom_{\mathbb ZG}(R,\mathbb Z). Examples:../tutorial/chap1.html1 , ../tutorial/chap7.html2 , ../tutorial/chap10.html3 , ../tutorial/chap13.html4 , ../www/SideLinks/About/aboutCohomologyRings.html5 , ../www/SideLinks/About/aboutSpaceGroup.html6 , ../www/SideLinks/About/aboutIntro.html7 , ../www/SideLinks/About/aboutTorAndExt.html8
+ Inputs a chain complex C of free abelian groups and returns the cochain complex Hom_{\mathbb Z}(C,\mathbb Z). Inputs a free \mathbb ZG-resolution R in characteristic 0 and returns the cochain complex Hom_{\mathbb ZG}(R,\mathbb Z). Inputs an equivariant chain map F\colon R\rightarrow S of resolutions and returns the induced cochain map Hom_{\mathbb ZG}(S,\mathbb Z) \longrightarrow Hom_{\mathbb ZG}(R,\mathbb Z). Examples:../tutorial/chap1.html1 , ../tutorial/chap7.html2 , ../tutorial/chap8.html3 , ../tutorial/chap10.html4 , ../tutorial/chap13.html5 , ../www/SideLinks/About/aboutCohomologyRings.html6 , ../www/SideLinks/About/aboutSpaceGroup.html7 , ../www/SideLinks/About/aboutIntro.html8 , ../www/SideLinks/About/aboutTorAndExt.html9 Inputs a free \mathbb ZG-resolution R in characteristic 0 and a group homomorphism A\colon G \rightarrow {\rm GL}_n(\mathbb Z). The homomorphism A can be viewed as the \mathbb ZG-module with underlying abelian group \mathbb Z^n on which G acts via the homomorphism A. It returns the cochain complex Hom_{\mathbb ZG}(R,A). Examples:../tutorial/chap7.html1 , ../tutorial/chap13.html2 , ../www/SideLinks/About/aboutTwistedCoefficients.html3
@@ -51,7 +51,7 @@
When applied to a finite 2-group G this function returns a presentation for the mod-2 cohomology ring H^\ast(G,\mathbb F). The Lyndon-Hochschild-Serre spectral sequence is used to prove that the presentation is complete. When the function is applied to a 2-group G and positive integer n the function first constructs n+1 terms of a free \mathbb FG-resolution R, then constructs the finite-dimensional graded algebra A=H^{(\ast \le n)}(G,\mathbb F), and finally uses A to approximate a presentation for H^*(G,\mathbb F). For "sufficiently large" n the approximation will be a correct presentation for H^\ast(G,\mathbb F). Alternatively, the function can be applied directly to either the resolution R or graded algebra A. This function was written by Paul Smith. It uses the Singular commutative algebra package to handle the Lyndon-Hochschild-Serre spectral sequence. Examples:../tutorial/chap8.html1 , ../www/SideLinks/About/aboutIntro.html2 Group Invariants
- Inputs a group G and integer k \ge 0. The group G should either be finite or else lie in one of a range of classes of infinite groups (such as nilpotent, crystallographic, Artin etc.). The function returns the list of abelian invariants of H^k(G,\mathbb Z). If a prime p is given as an optional third input variable then the function returns the list of abelian invariants of H^k(G,\mathbb Z_p). In this case each abelian invariant will be equal to p and the length of the list will be the dimension of the vector space H^k(G,\mathbb Z_p). Examples:../tutorial/chap7.html1
+ Inputs a group G and integer k \ge 0. The group G should either be finite or else lie in one of a range of classes of infinite groups (such as nilpotent, crystallographic, Artin etc.). The function returns the list of abelian invariants of H^k(G,\mathbb Z). If a prime p is given as an optional third input variable then the function returns the list of abelian invariants of H^k(G,\mathbb Z_p). In this case each abelian invariant will be equal to p and the length of the list will be the dimension of the vector space H^k(G,\mathbb Z_p). Examples:../tutorial/chap7.html1 , ../tutorial/chap8.html2 Inputs a group G and integer k \ge 0. The group G should either be finite or else lie in one of a range of classes of infinite groups (such as nilpotent, crystallographic, Artin etc.). The function returns the list of abelian invariants of H_k(G,\mathbb Z). If a prime p is given as an optional third input variable then the function returns the list of abelian invariants of H_k(G,\mathbb Z_p). In this case each abelian invariant will be equal to p and the length of the list will be the dimension of the vector space H_k(G,\mathbb Z_p). Examples:../tutorial/chap7.html1 , ../tutorial/chap13.html2 , ../www/SideLinks/About/aboutLinks.html3 , ../www/SideLinks/About/aboutParallel.html4 , ../www/SideLinks/About/aboutRosenbergerMonster.html5 , ../www/SideLinks/About/aboutFunctorial.html6 , ../www/SideLinks/About/aboutIntro.html7 , ../www/SideLinks/About/aboutTensorSquare.html8 , ../www/SideLinks/About/aboutLie.html9
diff --git a/lib/ArithmeticGroups/crystGbasis.gi b/lib/ArithmeticGroups/crystGbasis.gi
index 8c0b18e9..d0d67267 100644
--- a/lib/ArithmeticGroups/crystGbasis.gi
+++ b/lib/ArithmeticGroups/crystGbasis.gi
@@ -103,6 +103,7 @@ local
for i in [1..Length(L)] do
B_delta:=CrystGFullBasis(G,[L[i],Sum(L[i])/2]);
if IsList(B_delta) then
+ Add(B_delta,L[i]); #Added October 2024
return B_delta;
fi;
od;
@@ -133,7 +134,7 @@ local
j:=j+1;
od;
if j=d[i]+1 then
- return [B_delta,ctr];
+ return [B_delta,ctr];
fi;
#test if center of fundamental domain is origin
@@ -147,7 +148,7 @@ local
j:=j+1;
od;
if j=d[i]+1 then
- return [B_delta,ctr];
+ return [B_delta,ctr];
fi;
fi;
od;
diff --git a/lib/ArithmeticGroups/crystGcomplex.gi b/lib/ArithmeticGroups/crystGcomplex.gi
index b161d991..cceb2d2b 100644
--- a/lib/ArithmeticGroups/crystGcomplex.gi
+++ b/lib/ArithmeticGroups/crystGcomplex.gi
@@ -6,7 +6,7 @@
## check=1 (check is for future use of implementation of Bredon
## homology)
##
-## Output: G-equivalent CW-space for group G generated by F.
+## Output: G-equivariant CW-space for group G generated by F.
##
##
InstallGlobalFunction(CrystGcomplex,
@@ -17,15 +17,20 @@ local i,x,k,combin,n,j,r,m,vect,c,
RotSubGroupList,
Dimension,SearchOrbit,pos,StabilizerOfPoint,PseudoBoundary,
RotSubGroup,
- Elts,Boundary,Stabilizer,DVF,DVFRec,Homotopy,rmult,FinalHomotopy;
+ Elts,Boundary,Stabilizer,DVF,DVFRec,Homotopy,rmult,FinalHomotopy,
+ BB,Bool,vol,cent,orb,VOL,trns,tmp,u,v,indx;
B:=basis[1];
c:=basis[2];
+ BB:=basis[3];
vect:=c-Sum(B)/2;
vect:=0*vect;
G:=AffineCrystGroup(gens);
+ if not IsStandardAffineCrystGroup(G) then
+ Print("Warning: G is not a standard affine space group.\n");
+ fi;
T:=TranslationSubGroup(G);
Bt:=T!.TranslationBasis;
S:=RightTransversal(G,T);
@@ -34,6 +39,36 @@ local i,x,k,combin,n,j,r,m,vect,c,
Append(Elts,gens);
lnth:=1000;
+#########################################ADDED OCTOBER 2024
+vol:=List(B,b->b*b);
+vol:=Product(vol);
+vol:=Sqrt(vol);
+VOL:=AbsoluteValue(Determinant(BB));
+cent:=Sum(B)*(1/2);
+orb:=OrbitStabilizerInUnitCubeOnRight(G,VectorModOne(cent)).orbit;
+Bool:=Length(orb)*vol=VOL;
+if Bool then
+
+trns:=[0*vect];
+else
+indx:=List([1..Length(B)],j->Sqrt( (BB[j]*BB[j])/(B[j]*B[j]) ) );
+indx:=indx-1;
+indx:=List(indx,a->[0..a]);
+indx:=Cartesian(indx);
+trns:=[];
+for x in indx do
+ v:=0*vect;
+ for i in [1..Length(x)] do
+ v:=v + x[i]*B[i];
+ od;
+ Add(trns,v);
+od;
+trns:=SSortedList(trns);
+
+fi;
+#########################################ADDITION DONE
+
+
if check=1 then # B is the G-full basis
L:=[];
@@ -55,6 +90,17 @@ local i,x,k,combin,n,j,r,m,vect,c,
cells:=Cartesian(w);
Append(kcells,cells*B+vect);
od;
+
+######################################Added October 2024
+tmp:=[];
+for u in kcells do
+for v in trns do
+Add(tmp, u+v);
+od;
+od;
+kcells:=tmp;
+######################################Addition done
+
### search for k-orbits
Add(L[k+1],kcells[1]);
@@ -71,6 +117,7 @@ local i,x,k,combin,n,j,r,m,vect,c,
od;
od;
+
# Cubical subdividing the fundamental region:
# slice the fundamental cell into 2^n parts to get a
# proper action of G on R^n
@@ -96,6 +143,7 @@ local i,x,k,combin,n,j,r,m,vect,c,
Append(kcells,cells*B+vect);
od;
+
### search for k-orbits
Add(L[k+1],kcells[1]);
for i in [2..Length(kcells)] do
@@ -397,6 +445,7 @@ local i,x,k,combin,n,j,r,m,vect,c,
##
StabilizerOfPoint:=function(g)
local H,stbgens,i,h,p;
+ #return OrbitStabilizerInUnitCubeOnRight(G,VectorModOne(g)).stabilizer;
g:=Flat(g);
Add(g,1);
stbgens:=[];
@@ -604,7 +653,6 @@ local i,x,k,combin,n,j,r,m,vect,c,
Homotopy:=fail;
fi;
-
###################################################################
return Objectify(HapNonFreeResolution,
rec(
@@ -620,6 +668,7 @@ local i,x,k,combin,n,j,r,m,vect,c,
stabilizer:=Stabilizer,
action:=Action,
RotSubGroup:=RotSubGroup,
+ Bool:=Bool, #####ADDED OCTOBER 2024
properties:=
[["length",100],
["characteristic",0],
@@ -641,8 +690,12 @@ end);
##
##
InstallGlobalFunction(ResolutionCubicalCrystGroup,
-function(G,n)
-local gens,B,C,R,Gram, pos, Homotopy,Cnew;
+function(GG,n)
+local G,gens,B,C,R,Gram, pos, Homotopy,Cnew;
+
+ G:=StandardAffineCrystGroup(GG); #Added October 2024. Ideally we
+ #should modify code so that this
+ #conversion is avoided.
Gram:=GramianOfAverageScalarProductFromFiniteMatrixGroup(
PointGroup(G));
if Gram=IdentityMat(DimensionOfMatrixGroup(PointGroup(G))) then
@@ -675,6 +728,7 @@ local gens,B,C,R,Gram, pos, Homotopy,Cnew;
Cnew!.homotopy:=Homotopy;
R:=FreeZGResolution(Cnew,n);
+ R!.Bool:=C!.Bool; #Added October 2024
return R;
else
return fail;
diff --git a/lib/ArithmeticGroups/crystGcomplex.original.tuan b/lib/ArithmeticGroups/crystGcomplex.original.tuan
new file mode 100644
index 00000000..cc7f92b2
--- /dev/null
+++ b/lib/ArithmeticGroups/crystGcomplex.original.tuan
@@ -0,0 +1,971 @@
+
+##########################################################################
+#0
+#F CrystGcomplex
+## Input: A set F of crystallographic matrices, a G-full basis B and
+## check=1 (check is for future use of implementation of Bredon
+## homology)
+##
+## Output: G-equivariant CW-space for group G generated by F.
+##
+##
+InstallGlobalFunction(CrystGcomplex,
+function(gens,basis,check)
+local i,x,k,combin,n,j,r,m,vect,c,
+ B,G,T,S,Bt,Action,Sign,FinalBoundary,BoundaryList,
+ L,kcells,cells,w,StabGrp,ActionRecord,lnth,PseudoRotSubGroup,
+ RotSubGroupList,
+ Dimension,SearchOrbit,pos,StabilizerOfPoint,PseudoBoundary,
+ RotSubGroup,
+ Elts,Boundary,Stabilizer,DVF,DVFRec,Homotopy,rmult,FinalHomotopy;
+
+ B:=basis[1];
+ c:=basis[2];
+ vect:=c-Sum(B)/2;
+
+ vect:=0*vect;
+
+ G:=AffineCrystGroup(gens);
+ T:=TranslationSubGroup(G);
+ Bt:=T!.TranslationBasis;
+ S:=RightTransversal(G,T);
+ n:=DimensionOfMatrixGroup(G)-1;
+ Elts:=[One(G)];
+ Append(Elts,gens);
+ lnth:=1000;
+
+ if check=1 then # B is the G-full basis
+
+ L:=[];
+ for k in [0..n] do
+ L[k+1]:=[];
+
+ ### list all centers of k-cells
+
+ kcells:=[];
+ combin:=Combinations([1..n],k);
+ for x in combin do
+ w:=[];
+ for i in [1..n] do
+ if i in x then
+ Add(w,[1/2]);
+ else Add(w,[0,1]);
+ fi;
+ od;
+ cells:=Cartesian(w);
+ Append(kcells,cells*B+vect);
+ od;
+
+ ### search for k-orbits
+ Add(L[k+1],kcells[1]);
+ for i in [2..Length(kcells)] do
+ r:=0;
+ for j in [1..Length(L[k+1])] do
+ if IsList(IsCrystSameOrbit(G,Bt,S,
+ kcells[i],L[k+1][j])) then
+ break;
+ fi;
+ r:=r+1;
+ od;
+ if r=Length(L[k+1]) then Add(L[k+1],kcells[i]);fi;
+ od;
+ od;
+
+# Cubical subdividing the fundamental region:
+# slice the fundamental cell into 2^n parts to get a
+# proper action of G on R^n
+ elif check=0 then
+ Apply(B,x->x/2);
+ L:=[];
+ for k in [0..n] do
+ L[k+1]:=[];
+
+ ### list all centers of k-cells
+
+ kcells:=[];
+ combin:=Combinations([1..n],k);
+ for x in combin do
+ w:=[];
+ for i in [1..n] do
+ if i in x then
+ Add(w,[1/2,3/2]);
+ else Add(w,[0,1,2]);
+ fi;
+ od;
+ cells:=Cartesian(w);
+ Append(kcells,cells*B+vect);
+ od;
+
+ ### search for k-orbits
+ Add(L[k+1],kcells[1]);
+ for i in [2..Length(kcells)] do
+ r:=0;
+ for j in [1..Length(L[k+1])] do
+ if IsList(IsCrystSameOrbit(G,Bt,S,
+ kcells[i],L[k+1][j])) then
+ break;
+ fi;
+ r:=r+1;
+ od;
+ if r=Length(L[k+1]) then Add(L[k+1],kcells[i]);fi;
+ od;
+ od;
+ else
+ Print("check is either 1 for B is G-full basis and 0 for proper action", "\n");
+ return fail;
+ fi;
+
+ ###################################################################
+ #1
+ #F Dimension
+ ##
+ ## Input: An integer k
+ ## Output: ZG-rank of C_k(X)
+ ##
+ Dimension:=function(k)
+ if k>n then
+ return 0;
+ fi;
+ return Length(L[k+1]);
+ end;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F pos
+ ##
+ ## Input: A matrix g
+ ## Output: If g in Elts then return the position of g, otherwise
+ ## add g to Elts and return the position.
+ ##
+ pos:=function(g)
+ local p;
+ p:=Position(Elts,g);
+ if p=fail then
+ Add(Elts,g);
+ return Length(Elts);
+ else
+ return p;
+ fi;
+ end;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F SearchOrbit
+ ##
+ ## Input: A matrix g
+ ## Output: If g in Elts then return the position of g, otherwise
+ ## add g to Elts and return the position.
+ ##
+ SearchOrbit:=function(g,k)
+ local i,p,h;
+ for i in [1..Length(L[k+1])] do
+ p:=IsCrystSameOrbit(G,Bt,S,L[k+1][i],g);
+ if IsList(p) then
+ h:=pos(p);
+ return [i,h];
+ fi;
+ od;
+ end;
+ ###################################################################
+
+# Create a record for the Action
+ ActionRecord:=[];
+ for m in [1..lnth+1] do
+ ActionRecord[m]:=[];
+ for k in [1..Dimension(m-1)] do
+ ActionRecord[m][k]:=[];
+ od;
+ od;
+
+
+ ###################################################################
+ #1
+ #F rmult
+ ##
+ ## Input: A list L, degree k, position g of an element
+ ## Output: Product of g and L by the action on right.
+ ##
+ rmult:=function(L,k,g)
+ local x,w,t,h,y,vv;
+ vv:=[];
+ for x in [1..Length(L)] do
+ w:=Elts[L[x][2]]*Elts[g];
+ L[x][1]:=Sign(k,L[x][1],pos(w))*L[x][1];
+ w:=CanonicalRightCosetElement(StabGrp[k+1]
+ [AbsInt(L[x][1])],w);
+ t:=pos(w);
+ Add(vv,[Sign(k,L[x][1],t)*L[x][1],t]);
+ od;
+ return vv;
+ end;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F Action
+ ##
+ ## Input: Degree m, position k of a generator and position g of
+ ## an element.
+ ## Output: 1 or -1.
+ ##
+ Action:=function(m,k,g)
+ local id,r,u,H,abk,ans,x,h,l,i;
+
+ abk:=AbsInt(k);
+
+ if not IsBound(ActionRecord[m+1][abk][g]) then
+ H:=StabGrp[m+1][abk];
+
+ if Order(H)=infinity then
+
+ # We are assuming that any infinite stabilizer
+ # group acts trivially.
+
+ ActionRecord[m+1][abk][g]:=1;
+ else
+ id:=CanonicalRightCosetElement(H,Identity(H));
+ r:=CanonicalRightCosetElement(H,Elts[g]^-1);
+ r:=id^-1*r;
+ u:=r*Elts[g];
+
+ if u in RotSubGroupList[m+1][abk] then
+ ans:= 1;
+ else
+ ans:= -1;
+ fi;
+
+ ActionRecord[m+1][abk][g]:=ans;
+ fi;
+ fi;
+ return ActionRecord[m+1][abk][g];
+ end;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F Action
+ ##
+ ## Input: Degree m, position k of a generator and position g of
+ ## an element.
+ ## Output: 1 or -1.
+ ##
+ PseudoBoundary:=function(k,s)
+ local f,x,bdry,i,Fnt,Bck,j,ss;
+ ss:=AbsInt(s);
+ f:=L[k+1][ss];
+ if k=0 then return [];fi;
+ #x:=f*B^-1;
+ x:=(f-vect)*B^-1;
+ bdry:=[];
+ j:=0;
+ for i in [1..n] do
+ Fnt:=StructuralCopy(x);
+ Bck:=StructuralCopy(x);
+ if not IsInt(x[i]) then
+ j:=j+1;
+ Fnt[i]:=Fnt[i]-1/2;
+ Bck[i]:=Bck[i]+1/2;
+ #Fnt:=Fnt*B;
+ #Bck:=Bck*B;
+
+ Fnt:=Fnt*B+vect;
+ Bck:=Bck*B+vect;
+ Append(bdry,[SearchOrbit(Fnt,k-1),SearchOrbit(Bck,k-1)]);
+ #Append(bdry,[SearchOrbit(Fnt,k-1),SearchOrbit(Bck,k-1)]);
+ fi;
+ od;
+ return bdry;
+ end;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F Sign
+ ##
+ ## Input: Degree m, position k of a generator and position g of
+ ## an element.
+ ## Output: 1 or -1.
+ ##
+ Sign:=function(m,k,g)
+ local x,h,p,r,c,i,y,f,s,kk,e,B1,B2,w;
+
+ kk:=AbsInt(k);
+ if m=0 then return 1;fi;
+ h:=Elts[g];
+ p:=CrystFinitePartOfMatrix(h);
+ e:=L[m+1][kk];
+ #x:=e*B^-1;
+ x:=e*B^-1;
+ r:=[];
+ for i in [1..Length(x)] do
+ if not IsInt(x[i]) then
+ Add(r,i);
+ fi;
+ od;
+ B1:=B{r};
+ B1:=B1*p;
+ e:=Flat(e);
+ Add(e,1);
+ f:=e*h;
+ Remove(f);
+ y:=f*B^-1;
+ c:=[];
+ for i in [1..Length(y)] do
+ if not IsInt(y[i]) then
+ Add(c,i);
+ fi;
+ od;
+
+ B2:=B{c};
+ s:=[];
+ for i in [1..Length(B2)] do
+ Add(s,SolutionMat(B1,B2[i]));
+ od;
+ #Print(s);
+ return SignInt(Determinant(s));
+ end;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F Boundary
+ ##
+ ## Input: degree k and position s of a generator.
+ ##
+ ## Output: the boundary d(k,s).
+ ##
+ Boundary:=function(k,s)
+ local psbdry,j,w,bdry;
+
+ psbdry:=PseudoBoundary(k,s);
+ bdry:=[];
+ for j in [1..Length(psbdry)] do
+ w:=psbdry[j];
+ if (j mod 4 = 3) or (j mod 4 = 2) then
+ #if IsEvenInt(j) then
+ Add(bdry,Negate([Sign(k-1,w[1],w[2])*w[1],w[2]]));
+ else
+ Add(bdry,[Sign(k-1,w[1],w[2])*w[1],w[2]]);
+ fi;
+ od;
+
+
+ if s<0 then
+ return NegateWord(bdry);
+ else
+ return bdry;
+ fi;
+ end;
+ ###################################################################
+
+ # Create a list of boundary
+ BoundaryList:=[];
+ for i in [1..n] do
+ BoundaryList[i]:=[];
+ for j in [1..Dimension(i)] do
+ BoundaryList[i][j]:=Boundary(i,j);
+ od;
+ od;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F FinalBoundary
+ ##
+ ## Input: degree n and position k of a generator.
+ ##
+ ## Output: the boundary d(k,s).
+ ##
+ FinalBoundary:=function(n,k)
+ if k>0 then
+ return BoundaryList[n][k];
+ else
+ return NegateWord(BoundaryList[n][AbsInt(k)]);
+ fi;
+ end;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F StabilizerOfPoint
+ ##
+ ## Input: a point g in R^n.
+ ##
+ ## Output: The stabilizer subgroup of g.
+ ##
+ StabilizerOfPoint:=function(g)
+ local H,stbgens,i,h,p;
+ g:=Flat(g);
+ Add(g,1);
+ stbgens:=[];
+ for i in [1..Length(S)] do
+ h:=g*S[i]-g;
+ Remove(h);
+ p:=h*Bt^-1;
+ if IsIntList(p) then Add(stbgens,S[i]*
+ VectorToCrystMatrix(h)^-1);fi;
+ od;
+ H:=Group(stbgens);
+ return H;
+ end;
+ ###################################################################
+
+ ###################################################################
+ # Create a empty list for containing the stabilizer subgroup
+ StabGrp:=[];
+ for i in [1..(n+1)] do
+ StabGrp[i]:=[];
+ for j in [1..Length(L[i])] do
+ StabGrp[i][j]:=StabilizerOfPoint(L[i][j]);
+ od;
+ od;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F Stabilizer
+ ##
+ ## Input: degree m and position k of a generator (the k-th m-cell).
+ ##
+ ## Output: The stabilizer subgroup for the above cell.
+ ##
+ Stabilizer:=function(m,k)
+ local kk;
+ kk:=AbsInt(k);
+ return StabGrp[m+1][k];
+ end;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F PseudoRotSubGroup
+ ##
+ ## Input: degree m and position k of a generator (the k-th m-cell).
+ ##
+ ## Output: The rotation subgroup of the above cell.
+ ##
+ PseudoRotSubGroup:=function(m,k)
+ local x,kk,l,h,i,w,r,y,H,id,eltsH,g,RotSbGrp;
+ kk:=AbsInt(k);
+ RotSbGrp:=[];
+ H:=StabGrp[m+1][k];
+ eltsH:=Elements(H);
+
+ for g in eltsH do
+ if Sign(m,k,pos(g))=1 then
+ Add(RotSbGrp,g);
+ fi;
+ od;
+ RotSubGroupList[m+1][kk]:=Group(RotSbGrp);
+ return Group(RotSbGrp);
+ end;
+ ###################################################################
+
+ ###################################################################
+ # Create an empty list for containing the rotation subgroups
+ RotSubGroupList:=[];
+ for i in [1..(n+1)] do
+ RotSubGroupList[i]:=[];
+ for j in [1..Length(L[i])] do
+ RotSubGroupList[i][j]:=PseudoRotSubGroup(i-1,j);
+ od;
+ od;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F RotSubGroup
+ ##
+ ## Input: degree m and position k of a generator (the k-th m-cell).
+ ##
+ ## Output: The rotation subgroup of the above cell.
+ ##
+ RotSubGroup:=function(m,k)
+ local kk;
+ kk:=AbsInt(k);
+ return RotSubGroupList[m+1][kk];
+ end;
+ ###################################################################
+
+ ###################################################################
+ # Create a record for discrete vector field
+ DVFRec:=[];
+ for k in [1..n+1] do
+ DVFRec[k]:=[];
+ for i in [1..Length(L[k])] do
+ DVFRec[k][i]:=[];
+ od;
+ od;
+ ###################################################################
+
+ if check=1 then
+
+ ###################################################################
+ #1
+ #F DVF
+ ##
+ ## input an n-cell acts like the starting point of an arrow
+ ## the function returns n+1-cell acts like the end
+ ## point of the above arrow
+ ## those cells presented by its center.
+ ##
+ ## Input: an n-cell.
+ ##
+ ## Output: n+1-cell.
+ ##
+ DVF:=function(k,w)
+ local
+ f,x,g,i,y,ww,s,b,j;
+ ww:=[AbsInt(w[1]),w[2]];
+ if not IsBound(DVFRec[k+1][ww[1]][ww[2]]) then
+ x:=StructuralCopy(L[k+1][ww[1]]);
+ Add(x,1);
+ x:=x*Elts[ww[2]];
+ Remove(x);
+ f:=(x-vect)*B^-1;
+ for i in [1..n] do
+ if not f[i]=0 then
+ if not IsInt(f[i]) then
+ DVFRec[k+1][ww[1]][ww[2]]:=[];
+ return DVFRec[k+1][ww[1]][ww[2]];
+ else
+ s:=SignInt(f[i]);
+ f[i]:=f[i]-s*1/2;
+ x:=f*B;
+ y:=SearchOrbit(x,k+1);
+ y[2]:=pos(CanonicalRightCosetElement
+ (StabGrp[k+2][y[1]],Elts[y[2]]));
+
+ DVFRec[k+1][ww[1]][ww[2]]:=y;
+ return DVFRec[k+1][ww[1]][ww[2]];
+ fi;
+ fi;
+ od;
+ DVFRec[k+1][ww[1]][ww[2]]:=[];
+ return DVFRec[k+1][ww[1]][ww[2]];
+ else
+ return DVFRec[k+1][ww[1]][ww[2]];
+ fi;
+ end;
+ ###################################################################
+
+ ###################################################################
+ #1
+ #F Homotopy
+ ##
+ ## Input: Degree k and a word w.
+ ##
+ ## Output: The homotopy h(k,w).
+ ##
+ Homotopy:=function(k,w)
+ local
+ h,d,x,y,i,ww,b,p1,p2,s1,s2,v,s,p,t,a,u;
+
+ if w=[] then return [];fi;
+ a:=Sign(AbsInt(k),w[1],w[2]);
+ d:=[];
+ w[2]:=pos(CanonicalRightCosetElement(StabGrp[k+1][AbsInt(w[1])],
+ Elts[w[2]]));
+ w[1]:=a*Sign(k,w[1],w[2])*w[1];
+ ww:=[AbsInt(w[1]),w[2]];
+ h:=StructuralCopy(DVF(k,ww));
+ if h=[] then
+ return [];
+ fi;
+
+ x:=PseudoBoundary(k+1,h[1]);
+ u:=List(x,v->[v[1],Elts[v[2]]*Elts[h[2]]]);
+ u:=List(u,v->[v[1],pos(CanonicalRightCosetElement
+ (StabGrp[k+1][AbsInt(v[1])],v[2]))]);
+ p:=Position(u,ww);
+ s:=1;;
+ b:=StructuralCopy(FinalBoundary(k+1,h[1]));
+ b:=rmult(b,k,h[2]);
+ c:=StructuralCopy(b);
+ t:=SignInt(b[p][1]);
+ Remove(c,p);
+ Add(d,h);
+ for i in [1..Length(c)] do
+ Append(d,NegateWord(Homotopy(k,c[i])));
+ od;
+
+ if w[1]*t<0 then
+ return NegateWord(d);
+ else
+ return d;
+ fi;
+ end;
+ ###############################################################
+
+ else
+ DVF:=fail;
+ Homotopy:=fail;
+ fi;
+
+ ###################################################################
+ return Objectify(HapNonFreeResolution,
+ rec(
+ dimension:=Dimension,
+ boundary:=FinalBoundary,
+ PseudoBoundary:=PseudoBoundary,
+ dvf:=DVF,
+ CellList:=L,
+ Sign:=Sign,
+ homotopy:=Homotopy,
+ elts:=Elts,
+ group:=G,
+ stabilizer:=Stabilizer,
+ action:=Action,
+ RotSubGroup:=RotSubGroup,
+ properties:=
+ [["length",100],
+ ["characteristic",0],
+ ["type","resolution"]] ));
+
+end);
+################### end of CrystGcomplex ############################
+
+
+
+
+
+##########################################################################
+#0
+#F ResolutionCubicalCrystGroup
+## Input: A crystallographic group G and an positive integer n
+##
+## Output: The first n+1 terms of a free ZG-resolution of Z.
+##
+##
+InstallGlobalFunction(ResolutionCubicalCrystGroup,
+function(G,n)
+local gens,B,C,R,Gram, pos, Homotopy,Cnew;
+ Gram:=GramianOfAverageScalarProductFromFiniteMatrixGroup(
+ PointGroup(G));
+ if Gram=IdentityMat(DimensionOfMatrixGroup(PointGroup(G))) then
+ gens:=GeneratorsOfGroup(G);
+ G:=AffineCrystGroup(gens);
+ B:=CrystGFullBasis(G);
+ if IsList(B) then
+ C:=CrystGcomplex(gens,B,1);
+ Cnew:=CrystGcomplex(gens,B,1);
+ Apply(Cnew!.elts,x->x^-1);
+
+ pos:=function(L,g)
+ local p;
+ p:=Position(L,g);
+ if p=fail then
+ Add(L,g);
+ return Length(L);
+ else
+ return p;
+ fi;
+ end;
+
+ Homotopy:=function(n,w)
+ local p,h;
+ p:=pos(C!.elts,Cnew!.elts[w[2]]^-1);
+ h:=StructuralCopy(C!.homotopy(n,[w[1],p]));
+ Apply(h,x->[x[1],pos(Cnew!.elts,C!.elts[x[2]]^-1)]);
+ return h;
+ end;
+
+ Cnew!.homotopy:=Homotopy;
+ R:=FreeZGResolution(Cnew,n);
+ return R;
+ else
+ return fail;
+ fi;
+ else
+ Print("Gramian matrix is not identity \n");
+ return fail;
+ fi;
+end);
+################### end of ResolutionCubicalCrystGroup ###################
+
+
+
+
+
+##########################################################################
+#0
+#F TensorWithComplexRepresentationRing
+## Input:
+##
+## Output:
+##
+##
+InstallGlobalFunction(TensorWithComplexRepresentationRing,
+function(C)
+local StabIrrTable,i,j,N,
+ Dimension,PairToTriple,BoundaryMatrix,Boundary,
+ TripleToPair,StabGrp,BoundaryRec,PartialBoundaryMatrix;
+
+ StabGrp:=[];
+ i:=0;
+ while C!.dimension(i)>0 do
+ StabGrp[i+1]:=[];
+ for j in [1..C!.dimension(i)] do
+ Add(StabGrp[i+1],C!.stabilizer(i,j));
+ od;
+ i:=i+1;
+ od;
+
+ StabIrrTable:=[];
+ i:=0;
+ while C!.dimension(i)>0 do
+ StabIrrTable[i+1]:=[];
+ for j in [1..C!.dimension(i)] do
+ Add(StabIrrTable[i+1],OrdinaryCharacterTable(StabGrp[i+1][j]));
+ od;
+ i:=i+1;
+ od;
+ N:=i-1;
+
+ Dimension:=function(k)
+ local d,i;
+ d:=0;
+ for i in [1..C!.dimension(k)] do
+ d:=d+Size(Irr(StabIrrTable[k+1][i]));
+ od;
+ return d;
+ end;
+
+ PairToTriple:=function(i,j)
+ local k,x;
+ k:=j;
+ x:=1;
+ while k>Size(Irr(StabIrrTable[i+1][x])) do
+ k:=k-Size(Irr(StabIrrTable[i+1][x]));
+ x:=x+1;
+ od;
+ return [i,x,k];
+ end;
+
+ TripleToPair:=function(i,j,k)
+ local d,x;
+ d:=0;
+ for x in [1..(j-1)] do
+ d:=d+Size(Irr(StabIrrTable[i+1][x]));
+ od;
+ d:=d+k;
+ return [i,d];
+ end;
+
+ PartialBoundaryMatrix:=function(n,k)
+ local bdry,x,Coeffs,Mat,W,A,B,i,xx,irrA,perm,tbA,tbB,c,M,ccA,ccB,ccBA;
+ bdry:=C!.boundary(n,k);
+ Mat:=[];
+ for i in [1..Length(bdry)] do
+ x:=bdry[i][1];
+ xx:=AbsInt(x);
+ B:=StabGrp[n+1][k];
+
+ A:=ConjugateGroup(B,C!.elts[bdry[i][2]]);
+ tbA:=OrdinaryCharacterTable(A);
+ tbB:=OrdinaryCharacterTable(B);
+ ccB:=tbB!.ConjugacyClasses;
+ ccA:=tbA!.ConjugacyClasses;
+ ccBA:=List(ccB,w->(Representative(w)^C!.elts[bdry[i][2]])^A);
+ c:=List(ccBA,w->Position(ccA,w));
+ M:=TransposedMat(List([1..Size(ccA)],w->TransposedMat(Irr(A))[c[w]]));
+ perm:=TransformingPermutations(M,Irr(B));
+ irrA:=Permuted(List(Irr(A),x->Permuted(x,perm.columns)),perm.rows);
+ Coeffs:=MatScalarProducts(Irr(StabIrrTable[n][xx]),InducedClassFunctions(irrA,StabGrp[n][xx]));
+ Add(Mat,[SignInt(x),xx,Coeffs]);
+ od;
+ return Mat;
+ end;
+
+ BoundaryRec:=[];
+ for i in [1..N] do
+ BoundaryRec[i]:=[];
+ for j in [1..C!.dimension(i)] do
+ Add(BoundaryRec[i],PartialBoundaryMatrix(i,j));
+# Print([i,j],BoundaryRec[i][j],"\n");
+ od;
+ od;
+
+ Boundary:=function(n,k)
+ local w,x,y,i,j,b,d;
+ b:=[];
+ for i in [1..Dimension(n-1)] do
+ Add(b,0);
+ od;
+ w:=PairToTriple(n,k);
+#Print("w=",w,"\n");
+ x:=StructuralCopy(BoundaryRec[n][w[2]]);
+ y:=List(x,a->[a[1],a[2],a[3][w[3]]]);
+#Print("y=",y,"\n");
+ for i in [1..Length(y)] do
+ for j in [1..Length(y[i][3])] do
+ if not y[i][3][j]=0 then
+#Print("[n-1,y[i][2],j]",[n-1,y[i][2],j],"\n");
+ d:=TripleToPair(n-1,y[i][2],j)[2];
+ b[d]:=b[d]+y[i][1]*y[i][3][j];
+ #Add(b,[y[i][1]*TripleToPair(n-1,y[i][2],j)[2],y[i][3][j]]);
+ fi;
+ od;
+ od;
+ #b:=AlgebraicReduction(b);
+ return b;
+ end;
+
+ return Objectify(HapChainComplex,
+ rec(
+ #elts:=C!.elts,
+ dimension:=Dimension,
+ boundarymatrix:=PartialBoundaryMatrix,
+ boundary:=Boundary,
+ #homotopy:=fail,
+ #group:=Integers,
+ properties:=
+ [["length",N],
+ ["characteristic",0],
+ ["type","chainComplex"]] ));
+end);
+################### end of TensorWithComplexRepresentationRing ############################
+
+
+###########################################################################################
+#0
+#F TensorWithBurnsideRing
+## Input:
+##
+## Output:
+##
+##
+InstallGlobalFunction(TensorWithBurnsideRing,
+function(C)
+local StabConjClss,i,j,N,
+ Dimension,PairToTriple,BoundaryMatrix,Boundary,
+ TripleToPair,StabGrp,BoundaryRec,PartialBoundaryMatrix;
+
+ StabGrp:=[];
+ i:=0;
+ while C!.dimension(i)>0 do
+ StabGrp[i+1]:=[];
+ for j in [1..C!.dimension(i)] do
+ Add(StabGrp[i+1],C!.stabilizer(i,j));
+ od;
+ i:=i+1;
+ od;
+
+ StabConjClss:=[];
+ i:=0;
+ while C!.dimension(i)>0 do
+ StabConjClss[i+1]:=[];
+ for j in [1..C!.dimension(i)] do
+ Add(StabConjClss[i+1],ConjugacyClassesSubgroups(StabGrp[i+1][j]));
+ od;
+ i:=i+1;
+ od;
+ N:=i-1;
+
+ Dimension:=function(k)
+ local d,i;
+ d:=0;
+ for i in [1..C!.dimension(k)] do
+ d:=d+Size(StabConjClss[k+1][i]);
+ od;
+ return d;
+ end;
+
+ PairToTriple:=function(i,j)
+ local k,x;
+ k:=j;
+ x:=1;
+ while k>Size(StabConjClss[i+1][x]) do
+ k:=k-Size(StabConjClss[i+1][x]);
+ x:=x+1;
+ od;
+ return [i,x,k];
+ end;
+
+ TripleToPair:=function(i,j,k)
+ local d,x;
+ d:=0;
+ for x in [1..(j-1)] do
+ d:=d+Size(StabConjClss[i+1][x]);
+ od;
+ d:=d+k;
+ return [i,d];
+ end;
+
+ PartialBoundaryMatrix:=function(n,k)
+ local bdry,x,Coeffs,Mat,A,i,xx,L,j,B,ccB,ccA;
+ bdry:=C!.boundary(n,k);
+ Mat:=[];
+ for i in [1..Length(bdry)] do
+ x:=bdry[i][1];
+ xx:=AbsInt(x);
+ B:=StabGrp[n+1][k];
+ A:=ConjugateGroup(B,C!.elts[bdry[i][2]]);
+ ccB:=ConjugacyClassesSubgroups(B);
+ ccA:=List(ccB,w->(Representative(w)^C!.elts[bdry[i][2]])^A);
+
+ L:=List(ccA,w->PositionsProperty(StabConjClss[n][xx],c->Representative(w) in c));
+ Coeffs:=[];
+ for j in [1..Length(L)] do
+ Coeffs[j]:=[];
+ for i in [1..Length(StabConjClss[n][xx])] do
+ if i in L[j] then Coeffs[j][i]:=1;
+ else Coeffs[j][i]:=0;
+ fi;
+ od;
+ od;
+ Add(Mat,[SignInt(x),xx,Coeffs]);
+ od;
+ return Mat;
+ end;
+
+ BoundaryRec:=[];
+ for i in [1..N] do
+ BoundaryRec[i]:=[];
+ for j in [1..C!.dimension(i)] do
+ Add(BoundaryRec[i],PartialBoundaryMatrix(i,j));
+# Print([i,j],BoundaryRec[i][j],"\n");
+ od;
+ od;
+
+ Boundary:=function(n,k)
+ local w,x,y,i,j,b,d;
+ b:=[];
+ for i in [1..Dimension(n-1)] do
+ Add(b,0);
+ od;
+ w:=PairToTriple(n,k);
+ x:=StructuralCopy(BoundaryRec[n][w[2]]);
+ y:=List(x,a->[a[1],a[2],a[3][w[3]]]);
+ for i in [1..Length(y)] do
+ for j in [1..Length(y[i][3])] do
+ if not y[i][3][j]=0 then
+ d:=TripleToPair(n-1,y[i][2],j)[2];
+ b[d]:=b[d]+y[i][1]*y[i][3][j];
+ #Add(b,[y[i][1]*TripleToPair(n-1,y[i][2],j)[2],y[i][3][j]]);
+ fi;
+ od;
+ od;
+ #b:=AlgebraicReduction(b);
+ return b;
+ end;
+
+ return Objectify(HapChainComplex,
+ rec(
+ #elts:=C!.elts,
+ classes:=StabConjClss,
+ dimension:=Dimension,
+ boundarymatrix:=PartialBoundaryMatrix,
+ boundary:=Boundary,
+ #homotopy:=fail,
+ #group:=Integers,
+ properties:=
+ [["length",N],
+ ["characteristic",0],
+ ["type","chainComplex"]] ));
+end);
+################### end of TensorWithBurnsideRing ############################
+
+
diff --git a/lib/ArithmeticGroups/freeZGRes.gi b/lib/ArithmeticGroups/freeZGRes.gi
index 73b2adf4..bfb0ed9e 100644
--- a/lib/ArithmeticGroups/freeZGRes.gi
+++ b/lib/ArithmeticGroups/freeZGRes.gi
@@ -88,7 +88,7 @@ local
return res;
fi;
- res:=ResolutionFiniteGroup(Q,n);
+ res:=ResolutionFiniteGroup(Q,n);
res!.group:=G;
res!.elts:=List(res!.elts,x->PreImagesRepresentative(iso,x));
return res;
diff --git a/lib/Congruence/bianchi.gi b/lib/Congruence/bianchi.gi
index a765e7f7..d9333d48 100644
--- a/lib/Congruence/bianchi.gi
+++ b/lib/Congruence/bianchi.gi
@@ -90,6 +90,7 @@ local Q, nrma,BI, rat, irrat, N, L, U, b, x,s1, t1, s2, t2;
#being represented by a circular disk :w!
#in the complex plane.
+
BI:=OQ!.bianchiInteger;
Q:=HAPQuadratic(a);
@@ -316,6 +317,8 @@ u:=cb-ca;
u:=u{[1,2]};
w:=[u[2],-u[1]];
+if u=[0,0] then return [ca{[1,2]},w]; fi;
+
ra2:=ca[3];
rb2:=cb[3];
#u2:=Norm(OQ,u[1])+Norm(OQ,u[2]);
@@ -1129,7 +1132,7 @@ local OQ,N, NRMS, L, LL, K, Y, bool, BI, A,
ABI, LST, UU, u, w, a, b, I, i, pos, HAPRECORD;
OQ:=arg[1];
-N:=5;
+N:=1;
BI:=OQ!.bianchiInteger;
ABI:=AbsInt(BI);
###############################
@@ -1162,14 +1165,11 @@ L:=[];
while bool do
N:=N+1;
-#if NRMS[N]>ABI+30 then NRMS[N]:=0; break; fi; #REMEBER TO DELETE THIS
-#
if Length(arg)>1 then
Print("Adding hemispheres of squared radius ",1/NRMS[N],"\n");
fi;
L:=UnimodularPairs(OQ,NRMS[N],true,L);
-#L:=QQNeighbourhoodOfUnimodularPairs(OQ,L);
if pos=infinity then
K:=SimplicialComplexOfUnimodularPairs(OQ,
QNeighbourhoodOfUnimodularPairs(OQ,L));
@@ -1180,7 +1180,6 @@ fi;
if NRMS[N]>=pos then break; fi;
od;
-#Add(HAPRECORD,[ABI,NRMS[N]]); #REMEBER TO REMOVE THIS
K:=UnimodularPairsReduced(OQ,L);
L:=K[1]; K:=K[2];
diff --git a/read.KEEP b/read.KEEP
index 9d0595b7..5b03a35b 100644
--- a/read.KEEP
+++ b/read.KEEP
@@ -107,6 +107,12 @@ ReadPackageHap( "lib/RegularCWComplexes/equivariantCW.gi");
fi;
################# POLYMAKING COMMANDS DONE #################################
+################# XMOD COMMANDS ############################################
+if IsPackageMarkedForLoading("xmod","0.0") then
+ReadPackageHap( "lib/SimplicialGroups/identity.gi");
+fi;
+################# XMOD COMMANDS DONE #######################################
+
ReadPackageHap( "lib/TitlePage/makeHapMan.gi");
################# OBJECTIFICATIONS ###############################
@@ -152,7 +158,7 @@ ReadPackageHap( "lib/FpGmodules/homs.gi");
ReadPackageHap( "lib/NonabelianTensor/tensorSquare.gi");
ReadPackageHap( "lib/NonabelianTensor/tensorPair.gi");
ReadPackageHap( "lib/NonabelianTensor/tensorPairInf.gi");
-#ReadPackageHap( "lib/NonabelianTensor/tensorPair.alt");
+ReadPackageHap( "lib/NonabelianTensor/tensorPair.alt");
ReadPackageHap( "lib/NonabelianTensor/exteriorProduct.gi");
ReadPackageHap( "lib/NonabelianTensor/SBG.gi");
ReadPackageHap( "lib/NonabelianTensor/symmetricSquare.gi");
@@ -437,7 +443,7 @@ if IsPackageMarkedForLoading("congruence","0.0") then
ReadPackageHap("lib/ArithmeticGroups/cplGTree.gi");
ReadPackageHap("lib/ArithmeticGroups/resGTree.gi");
ReadPackageHap("lib/ArithmeticGroups/sl2zres.gi");
-#ReadPackageHap("lib/ArithmeticGroups/sl2zresalt.gi");
+ReadPackageHap("lib/ArithmeticGroups/sl2zresalt.gi");
# ReadPackageHap("lib/ArithmeticGroups/resDirectProd.gi");
ReadPackageHap("lib/ArithmeticGroups/barycentric.gi");
######################################################
diff --git a/read.g b/read.g
index 0c7a8155..d8932adc 100644
--- a/read.g
+++ b/read.g
@@ -106,6 +106,12 @@ ReadPackageHap( "lib/Polymake/cryst.gi");
fi;
################# POLYMAKING COMMANDS DONE #################################
+################# XMOD COMMANDS ############################################
+if IsPackageMarkedForLoading("xmod","0.0") then
+ReadPackageHap( "lib/SimplicialGroups/identity.gi");
+fi;
+################# XMOD COMMANDS DONE #######################################
+
ReadPackageHap( "lib/TitlePage/makeHapMan.gi");
################# OBJECTIFICATIONS ###############################
@@ -151,7 +157,7 @@ ReadPackageHap( "lib/FpGmodules/homs.gi");
ReadPackageHap( "lib/NonabelianTensor/tensorSquare.gi");
ReadPackageHap( "lib/NonabelianTensor/tensorPair.gi");
ReadPackageHap( "lib/NonabelianTensor/tensorPairInf.gi");
-#ReadPackageHap( "lib/NonabelianTensor/tensorPair.alt");
+ReadPackageHap( "lib/NonabelianTensor/tensorPair.alt");
ReadPackageHap( "lib/NonabelianTensor/exteriorProduct.gi");
ReadPackageHap( "lib/NonabelianTensor/SBG.gi");
ReadPackageHap( "lib/NonabelianTensor/symmetricSquare.gi");
@@ -456,7 +462,7 @@ if IsPackageMarkedForLoading("congruence","0.0") then
ReadPackageHap("lib/ArithmeticGroups/cplGTree.gi");
ReadPackageHap("lib/ArithmeticGroups/resGTree.gi");
ReadPackageHap("lib/ArithmeticGroups/sl2zres.gi");
-#ReadPackageHap("lib/ArithmeticGroups/sl2zresalt.gi");
+ReadPackageHap("lib/ArithmeticGroups/sl2zresalt.gi");
# ReadPackageHap("lib/ArithmeticGroups/resDirectProd.gi");
ReadPackageHap("lib/ArithmeticGroups/barycentric.gi");
######################################################
diff --git a/tutorial/mybib.xml b/tutorial/mybib.xml
index 9e7eb808..fdd87aae 100644
--- a/tutorial/mybib.xml
+++ b/tutorial/mybib.xml
@@ -545,3 +545,23 @@ Voronoï’s algorithm
311--335
+
+
+ C.Liu
+ W.Ye
+
+ Crystallography, Group Cohomology, and Lieb-Schultz-Mattis Constraints
+ https://arxiv.org/abs/2410.03607/
+ 2024
+
+
+
+
+ C.Liu
+ W.Ye
+
+ Space group cohomology and LSM -- a github repository
+ https://github.com/liuchx1993/Space-Group-Cohomology-and-LSM
+ 2024
+
+
diff --git a/tutorial/tutex/7.3.txt b/tutorial/tutex/7.3.txt
new file mode 100644
index 00000000..b2629389
--- /dev/null
+++ b/tutorial/tutex/7.3.txt
@@ -0,0 +1,13 @@
+gap> G:=SpaceGroupIT(3,226);
+SpaceGroupOnRightIT(3,226,'1')
+gap> R:=ResolutionSpaceGroup(G,15);
+Resolution of length 15 in characteristic 0 for <matrix group with
+8 generators> .
+No contracting homotopy available.
+
+gap> D:=List([0..14],n->Cohomology(HomToIntegersModP(R,2),n));
+[ 1, 2, 5, 9, 11, 15, 20, 23, 28, 34, 38, 44, 51, 56, 63 ]
+
+gap> PoincareSeries(D,14);
+(-2*x_1^4+2*x_1^2+1)/(-x_1^5+2*x_1^4-x_1^3+x_1^2-2*x_1+1)
+
diff --git a/tutorial/tutex/7.4.txt b/tutorial/tutex/7.4.txt
new file mode 100644
index 00000000..3d5f5d4e
--- /dev/null
+++ b/tutorial/tutex/7.4.txt
@@ -0,0 +1,18 @@
+gap> G:=SpaceGroupIT(3,103);
+SpaceGroupOnRightIT(3,103,'1')
+gap> R:=ResolutionCubicalCrystGroup(G,100);
+Resolution of length 100 in characteristic 0 for <matrix group with 6 generators> .
+
+gap> D:=List([0..99],n->Cohomology(HomToIntegersModP(R,2),n));;
+gap> PoincareSeries(D,99);
+(x_1^3+2*x_1^2+2*x_1+1)/(-x_1+1)
+
+
+#Torsion subgroups are cyclic
+gap> B:=CrystGFullBasis(G);;
+gap> C:=CrystGcomplex(GeneratorsOfGroup(G),B,1);;
+gap> for n in [0..3] do
+> for k in [1..C!.dimension(n)] do
+> Print(StructureDescription(C!.stabilizer(n,k))," ");
+> od;od;
+C4 C2 C4 1 1 C4 C2 C4 1 1 1 1
diff --git a/tutorial/tutex/7.5.txt b/tutorial/tutex/7.5.txt
new file mode 100644
index 00000000..ff3e3ba8
--- /dev/null
+++ b/tutorial/tutex/7.5.txt
@@ -0,0 +1,37 @@
+gap> Read("SpaceGroupCohomologyData.gi"); #These two files must be
+gap> Read("SpaceGroupCohomologyFunctions.gi"); #downloaded from
+gap> #https://github.com/liuchx1993/Space-Group-Cohomology-and-LSM/
+
+gap> IsPeriodicSpaceGroup(SpaceGroupIT(3,30));
+true
+
+gap> SpaceGroupCohomologyRingGapInterface(30);
+===========================================
+Mod-2 Cohomology Ring of Group No. 30:
+Z2[Ac,Am,Ax,Bb]/<R2,R3,R4>
+R2: Ac.Am Am^2 Ax^2+Ac.Ax
+R3: Am.Bb
+R4: Bb^2
+===========================================
+LSM:
+2a Ac.Bb+Ax.Bb
+2b Ax.Bb
+true
+
+
+gap> IsPeriodicSpaceGroup(SpaceGroupIT(3,216));
+false
+
+gap> SpaceGroupCohomologyRingGapInterface(216);
+===========================================
+Mod-2 Cohomology Ring of Group No. 216:
+Z2[Am,Ba,Bb,Bxyxzyz,Ca,Cb,Cc,Cxyz]/<R4,R5,R6>
+R4: Am.Ca Am.Cb Ba.Bxyxzyz+Am.Cc Bb^2+Am.Cc+Ba.Bb Bb.Bxyxzyz+Am^2.Bb+Am.Cxyz Bxyxzyz^2
+R5: Bxyxzyz.Ca Ba.Cb+Bb.Ca Bb.Cb+Bb.Ca Bxyxzyz.Cb Bxyxzyz.Cc Ba.Cxyz+Am.Ba.Bb+Bb.Cc Bb.Cxyz+Am^2.Cc+Am.Ba.Bb+Bb.Cc Bxyxzyz.Cxyz+Am^3.Bb+Am^2.Cxyz
+===========================================
+LSM:
+4a Ca+Cc+Cxyz
+4b Cb+Cc+Cxyz
+4c Cb+Cxyz
+4d Cxyz
+true
diff --git a/tutorial/tutorialSimplicialComplexes.xml b/tutorial/tutorialSimplicialComplexes.xml
index 62834df3..3e25fe10 100644
--- a/tutorial/tutorialSimplicialComplexes.xml
+++ b/tutorial/tutorialSimplicialComplexes.xml
@@ -554,7 +554,7 @@ corresponding to the tessellation of \mathbb R^3 by a fundamental domain
-Orbifolds and classifying spaces
+Orbifolds and classifying spaces
If a discrete group G acts on Euclidean space or hyperbolic space with
finite stabilizer groups then we say that the quotient space obtained by killing the action of G an an orbifold. If the stabilizer groups are all trivial then the quotient is of course a manifold.
diff --git a/tutorial/tutorialSteenrod.xml b/tutorial/tutorialSteenrod.xml
index d84c6705..691ad6ad 100644
--- a/tutorial/tutorialSteenrod.xml
+++ b/tutorial/tutorialSteenrod.xml
@@ -1,4 +1,4 @@
-Cohomology rings and Steenrod operations for finite groups
+Cohomology rings and Steenrod operations for groupsMod-p cohomology rings of finite groups
@@ -139,4 +139,73 @@ no efficient method of implementation is known.
+
+Mod-p cohomology rings of crystallographic groups
+
+ Mod p cohomology ring computations can be attempted for any group G
+for which we can compute sufficiently many terms of a free ZG-resolution with contracting homotopy.
+The contracting homotopy is not needed if only the dimensions of the cohomology in each degree are sought.
+Crystallographic groups are one class of infinite groups where such computations can be attempted.
+
+Poincare series for crystallographic groups
+
+ Consider the space group G=SpaceGroupOnRightIT(3,226,'1').
+ The following computation computes the infinite series
+
+(-2x^4+2x^2+1)/(-x^5+2x^4-x^3+x^2-2x+1)
+in which the coefficient of the monomial x^n is guaranteed to equal the dimension
+ of the vector space H^n(G,\mathbb Z_2) in degrees n\le 14.
+ One would need to involve a theoretical argument to establish that this equality in fact holds in every degree n\ge 0.
+
+
+<#Include SYSTEM "tutex/7.3.txt">
+
+
+ Consider the space group SpaceGroupOnRightIT(3,103,'1'). The following computation uses a different construction of a free resolution to compute the infinite series
+
+ (x^3+2x^2+2x+1)/(-x+1)
+in which the coefficient of the monomial x^n is guaranteed to equal the dimension
+ of the vector space H^n(G,\mathbb Z_2) in degrees n\le 99.
+
+ The final commands show that G acts on a (cubical) cellular decomposition of \mathbb R^3 with cell ctabilizers being either trivial or cyclic of order 2 or 4. From this extra calculation it follows that the cohomology is periodic in degrees greater than 3 and that the Poincare series is correct in every degree n \ge 0.
+
+
+<#Include SYSTEM "tutex/7.4.txt">
+
+
+
+
+Mod 2 cohomology rings of 3-dimensional crystallographic groups
+
+ Computations in the integral
+ cohomology of a crystallographic group are illustrated in Section . The commands underlying
+ that illustration could be further developed and adapted to mod p cohomology. Indeed, the authors of the paper have developed commands for accessing the mod 2
+ cohomology of 3-dimensional crystallographic groups with the aim of establishing a connection between these
+ rings and the lattice structure of crystals with space group symmetry. Their code is available at the github repository .
+ In particular, their code contains the command
+ SpaceGroupCohomologyRingGapInterface(ITC)
+that inputs an integer
+ in the range 1\le ITC\le 230 corresponding to the numbering of a 3-dimensional space group G in the International Table for Crystallography.
+This command returns
+
+ a presentation for the mod 2 cohomology ring H^\ast(G,\mathbb Z_2). The presentation is guaranteed to be correct for low degree cohomology. In cases where the cohomology is periodic in degrees \gt 4 (which can be tested using IsPeriodicSpaceGroup(G))
+ the presentation is guaranteed correct in all degrees.
+ In non-periodic cases some additional mathematical argument needs to be provided to be mathematically sure that the presentation is correct in all degrees.
+ the Lieb-Schultz-Mattis anomaly (degree-3 cocycles) associated with the Irreducible Wyckoff Position (see the paper for a definition).
+
+
+ The command SpaceGroupCohomologyRingGapInterface(ITC)
+ is fast for most groups (a few seconds to a few minutes) but can be very slow for certain space groups (e.g. ITC = 228 and ITC = 142).
+ The following illustration assumes that two relevant files have been downloaded from and illustrates the command for ITC =30 and ITC =216.
+
+
+<#Include SYSTEM "tutex/7.5.txt">
+
+
+ In the example the naming convention for ring generators follows the paper .
+
+
+
+
+
diff --git a/version b/version
index 5b6cd6b3..9cf4011b 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-1.65
+1.66
diff --git a/www/download/downloadContent.html b/www/download/downloadContent.html
index 7d66ca08..4d48c9da 100644
--- a/www/download/downloadContent.html
+++ b/www/download/downloadContent.html
@@ -19,23 +19,23 @@
Download Instructions
First download the file hap1.65.tar.gz
+ href="https://github.com/gap-packages/hap/releases/download/v1.66/hap-1.66.tar.gz">hap1.66.tar.gz
which contains the most recent development version of HAP to the
subdirectory
"pkg/" of GAP. If you don't have access to this subdirectory,
then create a directory "pkg" in your home directory and download the
file there. (If you'd prefer to download the most
recent development version of HAP then download the file hap1.65-dev.tar.gz
+ href="https://github.com/gap-packages/hap/releases/download/v1.47/hap-1.47.tar.gz">hap1.66-dev.tar.gz
instead.)
Change to directory "pkg/" and type "gunzip
-hap1.65.tar.gz"
+hap1.66.tar.gz"
followed
by "tar
--xvf hap1.65.tar" .
+-xvf hap1.66.tar" .
Start GAP. (If you have created "pkg" in your home
@@ -51,7 +51,7 @@
Download Instructions
Help on HAP can be found on the HAP
home page (a version of which is included in directory
-"pkg/Hap1.65/www" of the distribution).
+"pkg/Hap1.66/www" of the distribution).
A few of HAP's (optional) functions rely on Polymake
@@ -67,7 +67,7 @@
Download Instructions
Performance can be improved by using a compiled
version of the HAP library. The following steps will produce a compiled
version.
-(1) Change to the directory "pkg/Hap1.65/" .
+(1) Change to the directory "pkg/Hap1.66/" .
(2) Edit the file "compile" so that: PKGDIR is equal to the path to the
directory "pkg" where your GAP packages are stored; GACDIR is equal to
the
@@ -78,7 +78,7 @@
Download Instructions
Should you want to return to an uncompiled version, change
to the directory
-"pkg/Hap1.65/" and type "./uncompile".