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 @@
CrystFinitePartOfMatrix    Examples:

-CrystGFullBasis    Examples: ../tutorial/chap9.html1 , -../www/SideLinks/About/aboutBredon.html2  +CrystGFullBasis    Examples: ../tutorial/chap8.html1 , +../tutorial/chap9.html2 , +../www/SideLinks/About/aboutBredon.html3 

-CrystGcomplex    Examples: ../tutorial/chap9.html1 , -../www/SideLinks/About/aboutBredon.html2  +CrystGcomplex    Examples: ../tutorial/chap8.html1 , +../tutorial/chap9.html2 , +../www/SideLinks/About/aboutBredon.html3 

CrystMatrix    Examples:
@@ -865,7 +867,8 @@
IsMetricMatrix    Examples:

-IsPeriodicSpaceGroup    Examples: ../tutorial/chap1.html1  +IsPeriodicSpaceGroup    Examples: ../tutorial/chap1.html1 , +../tutorial/chap8.html2 

IsPureComplex    Examples:
@@ -1281,7 +1284,8 @@ ResolutionSL2Z_alt    Examples: ../tutorial/chap13.html1 

-ResolutionSpaceGroup    Examples: ../tutorial/chap11.html1  +ResolutionSpaceGroup    Examples: ../tutorial/chap8.html1 , +../tutorial/chap11.html2 

ResolutionToEquivariantCWComplex    Examples:
@@ -2076,7 +2080,8 @@
IsPeriodic    Examples: ../tutorial/chap1.html1 , ../tutorial/chap7.html2 , -../tutorial/chap13.html3  +../tutorial/chap8.html3 , +../tutorial/chap13.html4 

IsPseudoListWithFunction    Examples:
@@ -3119,7 +3124,8 @@
IsPeriodic    Examples: ../tutorial/chap1.html1 , ../tutorial/chap7.html2 , -../tutorial/chap13.html3  +../tutorial/chap8.html3 , +../tutorial/chap13.html4 

Kernel    Examples: ../tutorial/chap1.html1 , @@ -6421,15 +6427,18 @@

Position    Examples: ../tutorial/chap5.html1 , -../www/SideLinks/About/aboutTensorSquare.html2  +../tutorial/chap8.html2 , +../www/SideLinks/About/aboutTensorSquare.html3 

Position    Examples: ../tutorial/chap5.html1 , -../www/SideLinks/About/aboutTensorSquare.html2  +../tutorial/chap8.html2 , +../www/SideLinks/About/aboutTensorSquare.html3 

Position    Examples: ../tutorial/chap5.html1 , -../www/SideLinks/About/aboutTensorSquare.html2  +../tutorial/chap8.html2 , +../www/SideLinks/About/aboutTensorSquare.html3 

PositionCanonical    Examples:
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 groups or 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 groups or 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 groups or 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 groups
Mod-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).