diff --git a/.gitignore b/.gitignore index 8b4f584..e68d8ca 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ /doc/manual.ps /doc/manual.toc /htm/ +**/*.swp +**/.DS_Store diff --git a/doc/cryst.tex b/doc/cryst.tex index f7ae52e..33d32ef 100644 --- a/doc/cryst.tex +++ b/doc/cryst.tex @@ -470,7 +470,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Wyckoff positions} -A Wyckoff position of a space group is an equivalence class of +A Wyckoff position of a crystallographic group is an equivalence class of points in Euclidean space, having stabilizers which are conjugate subgroups of . Apart from a subset of lower dimension, which contains points with even bigger stabilizers, a Wyckoff position @@ -480,7 +480,7 @@ \>WyckoffPositions( ) A -returns the list of Wyckoff positions of the space group . +returns the list of Wyckoff positions of the group . \beginexample gap> S := SpaceGroupIT(2,14); @@ -501,12 +501,12 @@ In the previous example, has three kinds of special points (the basis is empty), whose representatives all have a stabilizer -with the same point group (with label 1), one kind of special line +with the same point group (with label 3), one kind of special line (the basis has length 1), and the general position. \>WyckoffPositionsByStabilizer( , ) O -where is a space group and a subgroup of the point group or +where is a group and a subgroup of the point group or a list of such subgroups, determines only the Wyckoff positions whose representatives have a stabilizer with a point group equal to the subgroup or contained in the list , respectively. @@ -553,7 +553,7 @@ \>WyckoffSpaceGroup( ) O -returns the space group of which is a Wyckoff position. +returns the crystallographic group of which is a Wyckoff position. \beginexample gap> WyckoffSpaceGroup( W[1] ); @@ -564,7 +564,7 @@ returns the stabilizer of the (generic) points in the representative affine subspace of the Wyckoff position . This stabilizer is a -subgroup of the space group of , and thus an `AffineCrystGroup'. +subgroup of the crystallographic group of , and thus an `AffineCrystGroup'. \beginexample gap> stab := WyckoffStabilizer( W[4] ); @@ -576,13 +576,13 @@ \>WyckoffOrbit( ) O determines the orbit of the representative affine subspace of the -Wyckoff position under the space group of (modulo lattice +Wyckoff position under the crystallographic group of (modulo lattice translations). The affine subspaces in this orbit are then converted into a list of Wyckoff positions, which is returned. The Wyckoff positions in this list are just different representations of . Their `WyckoffBasis' and `WyckoffTranslation' are chosen such that the induced parametrizations of their representative subspaces are -mapped onto each other under the space group operation. +mapped onto each other under the crystallographic group operation. \beginexample gap> orb := WyckoffOrbit( W[4] ); @@ -881,8 +881,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{International Tables} -For the user's convenience, a table with the 17 plane groups and the -230 space groups is included in {\Cryst}. These groups are given in +For the user's convenience, tables with the 17 plane groups, 230 +space groups, 7 frieze groups, 75 rod groups, and 80 layer groups +are included in {\Cryst}. These groups are given in exactly the same settings (i.e., choices of basis and origin) as in the International Tables. Space groups with a centered lattice are therefore given in the non-primitive basis crystallographers are @@ -904,6 +905,34 @@ in a rhombohedral basis (setting `\pif{r}\pif'). `\pif{h}\pif' is the default setting. +For the frieze groups, two different settings are available. +The possible settings are labelled with the characters `\pif{a}\pif' +and `\pif{b}\pif'. `\pif{a}\pif' is the default setting. + +For the orthorhombic rod groups, six settings are available. +These are labelled with the string `\pif\pif{abc}\pif\pif' or permutations +of its characters. These correspond to permutations of the , +, and directions. `\pif\pif{abc}\pif\pif' is the default setting. + +For some of the tetragonal, trigonal, and hexagonal rod groups, +two basis choices exist: `\pif{1}\pif' and `\pif{2}\pif'. `\pif{1}\pif' +is the default setting. + +For layer groups 5 and 7, three cell choices exist, which differ +by whether the glide vector is along the direction (setting +`\pif{1}\pif'), the direction (setting `\pif{2}\pif'), or the + direction (setting `\pif{3}\pif'). `\pif{1}\pif' is the default +setting. + +For some orthorhombic layer groups, they have two settings, +`\pif{a}\pif' for the abc setting, and `\pif{b}\pif' for the bac setting. +`\pif{a}\pif' is the default setting. + +For some layer groups (52, 62, and 64), there exists a point of higher +symmetry than the origin of the `\pif{1}\pif' setting. In such cases, +a second setting `\pif{2}\pif' which has this higher symmetry point as +the origin is available and is the default setting. + \>SpaceGroupSettingsIT( , ) F returns a string, whose characters label the available settings of @@ -940,5 +969,49 @@ SpaceGroupOnRightIT(3,146,'r') \endexample +The subperiodic group functions accept an argument , which is +a string which is either `\pif\pif{Frieze}\pif\pif', `\pif\pif{Rod}\pif\pif', or +`\pif\pif{Layer}\pif\pif'. This specifies the type of subperiodic group. + +\>SubPeriodicGroupSettingsIT( , ) F + +returns a string (or list), whose characters (or strings, for +multi-character settings) label the available settings of +the subperiodic group with number and type . + +\> SubPeriodicGroupOnRightIT( , ) F +\> SubPeriodicGroupOnRightIT( , , ) F + +returns subperiodic group number with type in the +representation acting on the right. In the third argument, +the desired setting can be specified. Otherwise, the +group is returned in the default setting for that group. + +\> SubPeriodicGroupOnLeftIT( , ) F +\> SubPeriodicGroupOnLeftIT( , , ) F + +returns subperiodic group number with type in the +representation acting on the left. In the third argument, +the desired setting can be specified. Otherwise, the +group is returned in the default setting for that group. + +\> SubPeriodicGroupIT( , ) F +\> SubPeriodicGroupIT( , , ) F + +returns either `SubPeriodicGroupOnRightIT' or `SubPeriodicGroupOnLeftIT' with +the same arguments, depending on the value of `CrystGroupDefaultAction'. + +\> FriezeGroupIT( ) F +\> FriezeGroupIT( , ) F + +returns `SubPeriodicGroupIT(\pif\pif{Frieze}\pif\pif, , )'. + +\> RodGroupIT( ) F +\> RodGroupIT( , ) F + +returns `SubPeriodicGroupIT(\pif\pif{Rod}\pif\pif, , )'. +\> LayerGroupIT( ) F +\> LayerGroupIT( , ) F +returns `SubPeriodicGroupIT(\pif\pif{Layer}\pif\pif, , )'. \ No newline at end of file diff --git a/doc/manual.six b/doc/manual.six index 5dfb14d..5fa693a 100644 --- a/doc/manual.six +++ b/doc/manual.six @@ -109,3 +109,16 @@ F 2.11. SpaceGroupOnLeftIT F 2.11. SpaceGroupOnLeftIT F 2.11. SpaceGroupIT F 2.11. SpaceGroupIT +F 2.11. SubPeriodicGroupSettingsIT +F 2.11. SubPeriodicGroupOnRightIT +F 2.11. SubPeriodicGroupOnRightIT +F 2.11. SubPeriodicGroupOnLeftIT +F 2.11. SubPeriodicGroupOnLeftIT +F 2.11. SubPeriodicGroupIT +F 2.11. SubPeriodicGroupIT +F 2.11. FriezeGroupIT +F 2.11. FriezeGroupIT +F 2.11. RodGroupIT +F 2.11. RodGroupIT +F 2.11. LayerGroupIT +F 2.11. LayerGroupIT diff --git a/gap/cryst.gi b/gap/cryst.gi index e575e9b..2873cce 100644 --- a/gap/cryst.gi +++ b/gap/cryst.gi @@ -283,6 +283,12 @@ function ( S, conj ) # add Wyckoff positions if known if HasWyckoffPositions( S ) then + # If we have a sub-periodic group and C includes out-of-basis + # components, then we must scrap the cached Wyckoffs. + # Just to be safe, we'll scrap it without checking C, as there are + # too many edge cases. + # Scrapping Wyckoffs just means we don't call SetWyckoffPositions + if IsSpaceGroup(S) then W := []; for w in WyckoffPositions( S ) do r := rec( basis := w!.basis, @@ -294,6 +300,7 @@ function ( S, conj ) Add( W, WyckoffPositionObject( r ) ); od; SetWyckoffPositions( R, W ); + fi; fi; return R; @@ -331,6 +338,11 @@ function ( S, conj ) # add Wyckoff positions if known if HasWyckoffPositions( S ) then + # Transformations are only unique for space groups. + # Sub-periodic groups can lose information if there are out-of-plane + # components, which can make the Wyckoff positions inconsistent. + # So we'll only keep the cached Wyckoffs if it is a space group. + if IsSpaceGroup(S) then W := []; for w in WyckoffPositions( S ) do r := rec( basis := w!.basis, @@ -342,6 +354,7 @@ function ( S, conj ) Add( W, WyckoffPositionObject( r ) ); od; SetWyckoffPositions( R, W ); + fi; fi; return R; diff --git a/gap/hom.gd b/gap/hom.gd index bc400dc..fb4ae86 100644 --- a/gap/hom.gd +++ b/gap/hom.gd @@ -25,6 +25,12 @@ DeclareAttribute( "NiceToCryst", IsPointGroup ); ## DeclareGlobalFunction( "NiceToCrystStdRep" ); +############################################################################# +## +#F NiceToCrystStdRepSymmetric( P, perm ) +## +DeclareGlobalFunction( "NiceToCrystStdRepSymmetric" ); + ############################################################################# ## #P IsFromAffineCrystGroupToFpGroup diff --git a/gap/hom.gi b/gap/hom.gi index ba523df..229d4aa 100644 --- a/gap/hom.gi +++ b/gap/hom.gi @@ -73,7 +73,7 @@ end ); #F NiceToCrystStdRep( P, perm ) ## InstallGlobalFunction( NiceToCrystStdRep, function( P, perm ) - local S, m, d, c; + local S, m; S := AffineCrystGroupOfPointGroup( P ); m := ImagesRepresentative( NiceToCryst( P ), perm ); if IsStandardAffineCrystGroup( S ) then @@ -83,6 +83,29 @@ InstallGlobalFunction( NiceToCrystStdRep, function( P, perm ) fi; end ); +############################################################################# +## +#F NiceToCrystStdRepSymmetric( P, perm ) +## +InstallGlobalFunction( NiceToCrystStdRepSymmetric, function( P, perm ) + local S, m, d, mat, lconj, rconj; + # Uses SymmetricInternalBasis rather than InternalBasis + S := AffineCrystGroupOfPointGroup( P ); + m := ImagesRepresentative( NiceToCryst( P ), perm ); + d := DimensionOfMatrixGroup( S ) - 1; + # Get transformation into standard basis + mat := AugmentedMatrix(SymmetricInternalBasis(S), ListWithIdenticalEntries(d, 0)); + if IsAffineCrystGroupOnRight( S ) then + lconj := mat; + rconj := mat^-1; + else + mat := TransposedMat(mat); + lconj := mat^-1; + rconj := mat; + fi; + return lconj * m * rconj; +end ); + ############################################################################# ## #M NaturalHomomorphismByNormalSubgroup( , ) . . for AffineCrystGroup diff --git a/gap/wyckoff.gd b/gap/wyckoff.gd index 1522193..ab96682 100644 --- a/gap/wyckoff.gd +++ b/gap/wyckoff.gd @@ -58,6 +58,12 @@ DeclareGlobalFunction( "ImageAffineSubspaceLattice" ); ## DeclareGlobalFunction( "ImageAffineSubspaceLatticePointwise" ); +############################################################################# +## +#A SymmetricInternalBasis . .internal basis that respects lattice symmetries +## +DeclareAttribute( "SymmetricInternalBasis", IsAffineCrystGroupOnLeftOrRight ); + ############################################################################# ## #A WyckoffStabilizer . . . . . . . . . stabilizer of representative subspace diff --git a/gap/wyckoff.gi b/gap/wyckoff.gi index 0028386..8671d94 100644 --- a/gap/wyckoff.gi +++ b/gap/wyckoff.gi @@ -62,6 +62,231 @@ InstallMethod( WyckoffTranslation, InstallMethod( WyckoffBasis, true, [ IsWyckoffPosition ], 0, w -> w!.basis ); +############################################################################# +## +#F IsVectorInSpan . . . . . . .is a vector in the span of a list of vectors? +## +IsVectorInSpan := function( v, T ) + # Catch trivial cases + if IsEmpty(T) then + return false; + fi; + if IsZero(v) then + return true; + fi; + # I could catch errors, but for an internal function I can assume + # well-behaved input + # Check if is in span + return Rank(Concatenation(T,[v])) = Rank(T); +end; + +############################################################################# +## +#F ReducedLatticeBasisByOrbits . .helper function for SymmetricInternalBasis +## +ReducedLatticeBasisByOrbits := function( T, S ) + # Like ReducedLatticeBasis, but recursively optimises the basis to have + # elements in the same orbit. This is because, when building the internal + # basis, only the orientations of the fictitious lattice vectors are defined; + # the lengths are free variables. But we want the lattive to respect the + # symmetries, so the lengths need to be related. + # T: fictitious basis vectors to reduce. + # S: Crystallographic group (to get point group and dimensionality). + local P, d, T2, t; + # Catch trivial case + if IsEmpty(T) then + return []; + fi; + P := PointGroup(S); + d := DimensionOfMatrixGroup(P); + # Initial reduction so have consistent starting point + T := ReducedLatticeBasis(T); + T2 := []; + # Iterate through vectors in T until we have full basis or exhaust T. + for t in T do + # Only consider a vector if it expands the basis. + if not IsVectorInSpan(t, T2) then + # Get all vectors in the same orbit. + Append(T2, Orbit(P, t)); + # Reduce to minimal basis set. + T2 := ReducedLatticeBasis(T2); + if Length(T2) = d then + return T2; + fi; + fi; + od; + return T2; +end; + +############################################################################# +## +#M SymmetricInternalBasis . .internal basis that respects lattice symmetries +## +InstallMethod( SymmetricInternalBasis, + true, [ IsAffineCrystGroupOnLeftOrRight ], 0, +function( S ) + local d, T, gens, g, vecs, eigenvals, ev, i, v, spare_eigenvecs, k, comp, + idx, e, j, order, rotations, M, vlist, newbasis, T2, tmpbasis; + d := DimensionOfMatrixGroup(S) - 1; + T := TranslationBasis(S); + # If we have a space group, no need to find extra vectors + if Length(T) = d then + return T; + fi; + T := ShallowCopy(T); + # Get to consistent Action (okay, this might falter for point groups) + if not IsAffineCrystGroupOnRight(S) then + S := TransposedMatrixGroup(S); + fi; + # Grab the linear part of the non-trivial generators + gens := Filtered(PointGroup(S), x -> (x <> IdentityMat(d)) and (x <> -IdentityMat(d))); + # If we have no non-trivial operators, then the regular InternalBasis + # will do + if Length(gens) = 0 then + return InternalBasis( S ); + fi; + # We want to consider not just the generators, but sums of generator products. + # This solves for a different set of vectors, like the rotational plane. + # (If GAP allowed complex numbers, we could get all eigenvectors from gens, + # but it doesn't.) + for i in [1..Length(gens)] do + order := Order(gens[i]); + if order > 2 then + # Order > 2 allows complex eigenvalues, so need a supplemental matrix + # to get complementary eigenvectors. + # Sum of products of the matrix up to the Order. This is guaranteed to + # have real eigenvalues (but not necessarily the same sets of degeneracy). + M := Sum(List([0..order-1], x -> gens[i]^x)); + if not M in gens then + Add(gens, M); + fi; + fi; + od; + spare_eigenvecs := rec(); + newbasis := []; + # Go over each generator. Find the eigenvectors. + for g in gens do + vecs := Eigenvectors(Rationals, g); + # Get the eigenvalues for each eigenvector + eigenvals := []; + for v in vecs do + ev := v * g; # ev: v times eigenvalue + # Find the first non-zero value, if present, and divide + if ev = Zero(v) then + # If ev is zero vector, then eigenvalue is zero + Add(eigenvals, 0); + else + # Find the first non-zero value + i := PositionProperty(ev, x -> x <> 0); + Add(eigenvals, ev[i] / v[i]); + fi; + od; + # We'll sort the eigenvalues + StableSortParallel(eigenvals, vecs); + # Single out the eigenvectors with non-degenerate eigenvalues + # but keep the degenerate ones in case we exhaust the non-degenerate ones. + for e in eigenvals do + idx := Positions(eigenvals, e); + if Length(idx) > 1 then + # Pop degenerate eigenvectors + if IsBound(spare_eigenvecs.(Length(idx))) then + # Don't record duplicates + if not vecs{idx} in spare_eigenvecs.(Length(idx)) then + Add(spare_eigenvecs.(Length(idx)), vecs{idx}); + fi; + else + spare_eigenvecs.(Length(idx)) := [vecs{idx}]; + fi; + for i in Reversed(idx) do + Remove(vecs, i); + Remove(eigenvals, i); + od; + fi; + # Otherwise, just keep the vector in vecs + od; + # The vectors remaining in vecs have unique eigenvalues. + for v in vecs do + # Check whether this new vector extends T and we don't already have it + # If yes, Add to list of candidate vectors + if not IsVectorInSpan(v, T) and not v in newbasis then + Add(newbasis, v); + fi; + od; + od; + # Now that we have candidate (non-degenerate) vectors for the internal basis, + # let us reduce this fictional lattice. + newbasis := ReducedLatticeBasisByOrbits(newbasis, S); + if Length(newbasis) + Length(T) > d then + ErrorNoReturn("Somehow have more basis vectors than dimensions!?!"); + fi; + if Length(newbasis) + Length(T) = d then + # We've found a full basis! + T := Concatenation(T, newbasis); + if Determinant(T) < 0 then + # Ensure our basis has a positive determinant. This is to avoid + # accidentally changing chirality when going to standard basis. + T[d] := -T[d]; + fi; + return T; + fi; + # If we've made it here, we've exhausted the non-degenerate eigenvectors + # Now let's go through the spares in increasing order of degeneracy. + for i in Set(RecNames(spare_eigenvecs), Int) do + tmpbasis := []; + for vlist in spare_eigenvecs.(i) do + for v in vlist do + if not IsVectorInSpan(v, Concatenation(T, newbasis, tmpbasis)) then + # Add all rotations of this vector, but cut out redundant vectors + Append(tmpbasis, ReducedLatticeBasis(Orbit(PointGroup(S), v))); + fi; + od; + # Add our new basis vectors to the set + Append(newbasis, tmpbasis); + newbasis := ReducedLatticeBasisByOrbits(newbasis, S); + if Length(newbasis) + Length(T) > d then + ErrorNoReturn("Somehow have more basis vectors than dimensions!?!"); + fi; + if Length(newbasis) + Length(T) = d then + # We've found a full basis! + T := Concatenation(T, newbasis); + if Determinant(T) < 0 then + # Ensure our basis has a positive determinant. This is to avoid + # accidentally changing chirality when going to standard basis. + T[d] := -T[d]; + fi; + return T; + fi; + od; + od; + # Iterate over all vectors until Length(T) = d. + # If somehow we exhaust all vectors before then, resort to InternalBasis' + # algorithm for filling out the remaining vectors. + if Length(T) = 0 then + return IdentityMat(d); + else + T2 := ReducedLatticeBasis(T); # InternalBasis assumes T is reduced + comp := NullMat( d - Length(T2), d ); + i:=1; j:=1; k:=1; + while i <= Length( T2 ) do + while T2[i][j] = 0 do + comp[k][j] := 1; + k := k+1; j:=j+1; + od; + i := i+1; j := j+1; + od; + while j <= d do + comp[k][j] := 1; + k := k+1; j:=j+1; + od; + Append(T, comp); + fi; + if Determinant(T) < 0 then + # Change sign to be positive determinant. + T[d] := -T[d]; + fi; + return T; +end ); + ############################################################################# ## #M ReduceAffineSubspaceLattice . . . . reduce affine subspace modulo lattice @@ -74,7 +299,8 @@ function( r ) r.basis := ReducedLatticeBasis( r.basis ); rk := Length( r.basis ); d := Length( r.translation ); - T := TranslationBasis( r.spaceGroup ); + T := SymmetricInternalBasis( r.spaceGroup ); + # Using SymmetricInternalBasis allows handling subperiodic groups. Ti := T^-1; if rk = d then @@ -82,7 +308,7 @@ function( r ) elif rk > 0 then M := r.basis; v := r.translation; - if not IsStandardAffineCrystGroup( r.spaceGroup ) then + if T <> One(T) then M := M * Ti; v := v * Ti; fi; @@ -100,12 +326,12 @@ function( r ) Qi := Q^-1; P := Q{[1..d]}{[rk+1..d]} * Qi{[rk+1..d]}; v := List( v * P, FractionModOne ); - if not IsStandardAffineCrystGroup( r.spaceGroup ) then + if T <> One(T) then v := v * T; fi; - v := VectorModL( v, T ); + v := VectorModL( v, TranslationBasis(r.spaceGroup) ); else - v := VectorModL( r.translation, T ); + v := VectorModL( r.translation, TranslationBasis(r.spaceGroup) ); fi; r.translation := v; @@ -221,6 +447,9 @@ InstallMethod( WyckoffStabilizer, true, [ IsWyckoffPosition ], 0, function( w ) local S, t, B, d, I, gen, U, r, new, n, g, v; + # BUG: Potentially returns Wyckoff Stabilizers that are too small if S is + # a subperiodic group with an origin outside the span of its translation + # basis. S := WyckoffSpaceGroup( w ); t := WyckoffTranslation( w ); B := WyckoffBasis( w ); @@ -260,6 +489,9 @@ InstallMethod( WyckoffOrbit, true, [ IsWyckoffPosition ], 0, function( w ) local S, t, B, d, I, gen, U, r, o, s; + # BUG: Potentially returns Wyckoff Orbits with too many members if S is + # a subperiodic group with an origin outside the span of its translation + # basis. S := WyckoffSpaceGroup( w ); t := WyckoffTranslation( w ); B := WyckoffBasis( w ); @@ -438,6 +670,124 @@ IsSubspaceAffineSubspaceLattice := function( U, V ) fi; end; +############################################################################# +## +#F IsTranslationInBasis( S ) . . . . tests if Wyckoff position is in lattice +## +IsTranslationInBasis := function(f) + local STB, t, d, S, gens, xs, translations, basis, t2, Q, R, sol, M, fvecs; + # From our record f, checks whether the translation vector lies within + # the group's translation basis. Returns Boolean. + # Also corrects the translation vector in-place to account for false + # translations from the fake internal basis vectors. + S := f.spaceGroup; + # Trivial case: we have a space group + if IsSpaceGroup(S) then + return true; + fi; + # Otherwise, consider if the translation vector lies within the translation basis + t := f.translation; + d := Length(t); + STB := TranslationBasis(S); + # If the Wyckoff basis is non-empty, then maybe another point on the Wyckoff + # position lies in the crystal's translation basis. + if Length(f.basis) > 0 then + STB := Concatenation(STB, -f.basis); + fi; + # Make all vectors in STB integers, so can use RowEchelonForm safely. + # We can do this safely because we don't care about the magnitude of these + # vectors, only their span. + STB := List( STB, v -> v * Lcm(List(v, DenominatorRat)) ); + # Simplify (so Rank = Length) + STB := RowEchelonForm(STB); + # Trivial case: the basis of allowed points fills the whole space + if Length(STB) = d then + return true; + fi; + # Now, we can't simply check if t is in the span of STB, because + # the origin may be non-zero. Instead, we must check if the vectors, + # when operated on, fit the span. + gens := GeneratorsOfGroup(S); + if IsAffineCrystGroupOnLeft(S) then + gens := List(gens, TransposedMat); + fi; + # We'll also filter the pure translations out of gens, because those have + # been caught in TranslationBasis(S); + gens := Filtered(gens, g -> g{[1..d]}{[1..d]} <> IdentityMat(d)); + # Let us check for a simpler case: the origin is at zero. + # This is guaranteed if there are no translation components in the generators, + # or the translation components are within the span of the translation basis. + translations := List(gens, g -> g[d+1]{[1..d]}); + if RankMat(Concatenation(STB, translations)) = Length(STB) then + # There are no symmetry operators to take the origin outside the lattice + # Can use a cheaper check, as solutions don't need to account for an + # extra translation. + if RankMat(Concatenation(STB, [t])) = Length(STB) then + return true; + else + # Check if t modulo Z is usable + # Because earlier parts of the algorithm give the translation modulo + # fictitious lattice vectors, so we want to choose the correct modulo. + # Convert to standard basis + basis := SymmetricInternalBasis(S); + t := t * Inverse(basis); + STB := STB * Inverse(basis); + Q := IdentityMat(d); + R := RowEchelonFormT(TransposedMat(STB), Q); + # Q * TransposedMat(STB) = R (except R drops zero rows) + t2 := Q * t; + # Grab just the inconsistent part of the solution vector. + t2{[1..Length(R)]} := 0 * [1..Length(R)]; + t2 := Inverse(Q) * t2; # Convert out of row echelon form + # Check that it is integers + if not ForAll(t2, IsInt) then + return false; + fi; + # If it is, correct the translation. + f.translation := f.translation - t2 * basis; + ReduceAffineSubspaceLattice(f); + return true; + fi; + fi; + # xs are the difference between point t and point t after being operated on. + xs := List(gens, g -> (Concatenation(t, [1]) * (g - One(g))){[1..d]}); + # If xs are all in the span of the translation basis, then the point being + # acted on is staying inside the lattice, so is valid. + if Length(STB) = RankMat(Concatenation(STB, xs)) then + return true; + fi; + # Otherwise, we need to test if this point shifted by an integer number of + # fictitious lattice vectors would give a point in the lattice. + # First, grab the fictitious lattice vectors. + fvecs := Filtered( SymmetricInternalBasis(S), v -> not v in TranslationBasis(S) ); + # We now solve the system of all xs simultaneously. + Q := IdentityMat(d * Length(gens)); + R := RowEchelonFormT(KroneckerProduct(IdentityMat(Length(gens)), TransposedMat(STB)), Q); + t2 := Q * Flat(xs); # Q is the transformation taking to REF. + # Grab just the inconsistent part + t2{[1..Length(R)]} := 0 * [1..Length(R)]; + # We now have (g-I) * fvec * n = t2. + # We want to find n if it is integers. + # Stack up all the linear parts of the generators. + # (Remember that gens are RightAction, so normally act on row vectors.) + # (But I'm doing maths with column vectors at the moment.) + M := Concatenation(List(gens, g -> TransposedMat(g{[1..d]}{[1..d]}) - IdentityMat(d) )); + # Multiply by the vectors of interest. + # Move to the same REF + M := Q * M * TransposedMat(fvecs); + # Find an integer solution, for just the inconsistent part. + # (IntSolutionMat works on RightAction) + sol := IntSolutionMat(TransposedMat(M{[Length(R)+1..Length(M)]}), t2{[Length(R)+1..Length(t2)]}); + if sol = fail then + return false; + else + # We have a solution. Correct the translation and go home. + f.translation := f.translation - sol * fvecs; + ReduceAffineSubspaceLattice(f); + return true; + fi; +end; + ############################################################################# ## #F WyPos( S, stabs, lift ) . . . . . . . . . . . . . . . . Wyckoff positions @@ -449,7 +799,7 @@ WyPos := function( S, stabs, lift ) # get representative affine subspace lattices d := DimensionOfMatrixGroup( S ) - 1; W := List( [0..d], i -> [] ); - T := TranslationBasis( S ); + T := SymmetricInternalBasis( S ); for i in [1..Length(stabs)] do lst := List( GeneratorsOfGroup( stabs[i] ), lift ); if IsAffineCrystGroupOnLeft( S ) then @@ -465,7 +815,9 @@ WyPos := function( S, stabs, lift ) w.spaceGroup := S; w.class := i; ReduceAffineSubspaceLattice( w ); - Add( W[dim], w ); + if IsTranslationInBasis(w) then + Add( W[dim], w ); + fi; od; od; @@ -510,7 +862,11 @@ WyPosSGL := function( S ) N := NiceObject( P ); # set up lift from nice rep to std rep - lift := x -> NiceToCrystStdRep( P, x ); + if IsSpaceGroup(S) then + lift := x -> NiceToCrystStdRep( P, x ); + else + lift := x -> NiceToCrystStdRepSymmetric( P, x ); + fi; stabs := List( ConjugacyClassesSubgroups( N ), Representative ); Sort( stabs, function(x,y) return Size(x) > Size(y); end ); @@ -542,24 +898,37 @@ WyPosStep := function( idx, G, M, b, lst ) else F := []; fi; + # At this stage, F contains possible basis and translation information + # for the Wyckoff positions c := lst.c + 1; added := false; for f in F do d := Length( f.basis ) + 1; stop := d=lst.dim+1; + # Multiplying by the translation basis of the group takes it back + # to the original setting from the standard setting f.translation := f.translation * lst.T; if not IsEmpty( f.basis ) then f.basis := f.basis * lst.T; fi; f.spaceGroup := lst.S; ReduceAffineSubspaceLattice( f ); - if not f in lst.sp[d] then + if IsTranslationInBasis(f) then + # Exclude f if f.translation lies + # outside the span of TranslationBasis(lst.S). + # IsTranslationInBasis also accounts for f.translation possibly + # being off modulo 1 and corrects it, and accounts for + # non-centered origins. + if not f in lst.sp[d] then + # We check for duplicates after we potentially correct + # the translation. O := Orbit( lst.S2, Immutable(f), ImageAffineSubspaceLattice ); w := ShallowCopy( f ); w.class := c; UniteSet( lst.sp[d], O ); Add( lst.W[d], WyckoffPositionObject(w) ); added := true; + fi; fi; od; if added and not stop then @@ -591,16 +960,27 @@ WyPosAT := function( S ) S2 := TransposedMatrixGroup( S2 ); fi; - lst := rec( dim := d, T := TranslationBasis(S), S := S, c := 1, + lst := rec( dim := d, T := SymmetricInternalBasis(S), S := S, c := 1, S2 := S2 ); + # T used to be TranslationBasis, but it's used for changing from Standard + # form to original form, so needs to be a full matrix. zz := []; mat := []; vec := []; for g in Zuppos( NiceObject( P ) ) do if g <> () then - m := NiceToCrystStdRep(P,g); + # Record a point group operation *in standard basis* + # Meaning you might have permuted the bases. + if IsSpaceGroup( S ) then + m := NiceToCrystStdRep(P,g); + else + # If a sub-periodic group, need to do some slightly more expensive checks. + m := NiceToCrystStdRepSymmetric(P,g); + fi; if IsAffineCrystGroupOnRight( S ) then m := TransposedMat(m); fi; + # The matrix M and vector b are used in a set of equations + # to solve for the Wyckoff positions M := m{[1..d]}{[1..d]}-IdentityMat(d); b := m{[1..d]}[d+1]; M := RowEchelonFormVector(M,b); @@ -614,13 +994,15 @@ WyPosAT := function( S ) lst.z := zz; lst.mat := mat; lst.vec := vec; - + + # This record is used to build the general position. s := rec( translation := ListWithIdenticalEntries(d,0), - basis := TranslationBasis(S), + basis := SymmetricInternalBasis(S), spaceGroup := S ); ReduceAffineSubspaceLattice(s); lst.sp := List( [1..d+1], x-> [] ); Add( lst.sp[d+1], s ); - + + # Here we make the general position w := ShallowCopy( s ); w.class := 1; w := WyckoffPositionObject( w ); @@ -642,11 +1024,6 @@ InstallMethod( WyckoffPositions, "for AffineCrystGroupOnLeftOrRight", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) - # check if we indeed have a space group - if not IsSpaceGroup( S ) then - Error("S must be a space group"); - fi; - # for small dimensions, the recursive method is faster if DimensionOfMatrixGroup( S ) < 6 then return WyPosAT( S ); @@ -665,9 +1042,6 @@ InstallGlobalFunction( WyckoffPositionsByStabilizer, function( S, stb ) local stabs, P, lift; # check the arguments - if not IsSpaceGroup( S ) then - Error( "S must be a space group" ); - fi; if IsGroup( stb ) then stabs := [ stb ]; else @@ -678,7 +1052,11 @@ InstallGlobalFunction( WyckoffPositionsByStabilizer, function( S, stb ) P := PointGroup( S ); # set up lift from nice rep to std rep - lift := x -> NiceToCrystStdRep( P, x ); + if IsSpaceGroup(S) then + lift := x -> NiceToCrystStdRep( P, x ); + else + lift := x -> NiceToCrystStdRepSymmetric( P, x ); + fi; stabs := List( stabs, x -> Image( NiceMonomorphism( P ), x ) ); Sort( stabs, function(x,y) return Size(x) > Size(y); end ); diff --git a/grp/subgrp.gd b/grp/subgrp.gd new file mode 100644 index 0000000..b1252b3 --- /dev/null +++ b/grp/subgrp.gd @@ -0,0 +1,63 @@ +############################################################################# +## +#A subgrp.gd Cryst library Bernard Field +## +#Y Copyright 2023 by Bernard Field +## +## Declarations for IT subperiodic groups +## + +############################################################################# +## +#F SubPeriodicGroupSettingsIT . .available settings of IT subperiodic groups +## +DeclareGlobalFunction( "SubPeriodicGroupSettingsIT" ); + +############################################################################# +## +#F SubPeriodicGroupDataIT . . . . . data extractor for IT subperiodic groups +## +DeclareGlobalFunction( "SubPeriodicGroupDataIT" ); + +############################################################################# +## +#F SubPeriodicGroupFunIT . . . constructor function for IT subperiodic group +## +DeclareGlobalFunction( "SubPeriodicGroupFunIT" ); + +############################################################################# +## +#F SubPeriodicGroupOnRightIT . .constructor for IT subperiodic group OnRight +## +DeclareGlobalFunction( "SubPeriodicGroupOnRightIT" ); + +############################################################################# +## +#F SubPeriodicGroupOnLeftIT . . .constructor for IT subperiodic group OnLeft +## +DeclareGlobalFunction( "SubPeriodicGroupOnLeftIT" ); + +############################################################################# +## +#F SubPeriodicGroupIT . . . . . . . . . constructor for IT subperiodic group +## +DeclareGlobalFunction( "SubPeriodicGroupIT" ); + +############################################################################# +## +#F FriezeGroupIT . . . . . . . . . . . . . . constructor for IT frieze group +## +DeclareGlobalFunction( "FriezeGroupIT" ); + +############################################################################# +## +#F RodGroupIT . . . . . . . . . . . . . . . . . constructor for IT rod group +## +DeclareGlobalFunction( "RodGroupIT" ); + +############################################################################# +## +#F LayerGroupIT . . . . . . . . . . . . . . . constructor for IT layer group +## +DeclareGlobalFunction( "LayerGroupIT" ); + diff --git a/grp/subgrp.gi b/grp/subgrp.gi new file mode 100644 index 0000000..5220ded --- /dev/null +++ b/grp/subgrp.gi @@ -0,0 +1,203 @@ +############################################################################# +## +#A subgrp.gi Cryst library Bernard Field +## +#Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel +#Y Copyright 2023 by Bernard Field +## +## Extraction functions for IT subperiodic groups +## + +############################################################################# +## +#M SubPeriodicGroupSettingsIT . .available settings of IT subperiodic groups +## +InstallGlobalFunction( SubPeriodicGroupSettingsIT, function( type, nr ) + if type = "Frieze" then + if nr in [1..7] then + return List( RecNames( FriezeGroupList[nr] ), x -> x[1] ); + else + Error( "frieze group number must be in [1..7]" ); + fi; + elif type = "Rod" then + if nr in [3..22] then + # The settings are "abc" etc, not single characters. + # Sorry if this breaks the convention, but the alternative is to + # not follow the International Tables. + return RecNames( RodGroupList[nr] ); + elif nr in [1..75] then + return List( RecNames( RodGroupList[nr] ), x -> x[1] ); + else + Error( "rod group number must be in [1..75]" ); + fi; + elif type = "Layer" then + if nr in [1..80] then + return List( RecNames( LayerGroupList[nr] ), x -> x[1] ); + else + Error( "layer group number must be in [1..80]" ); + fi; + else + Error( "only types Frieze, Rod, or Layer are supported, but got ", type ); + fi; +end ); + +############################################################################# +## +#M SubPeriodicGroupDataIT . . . . . data extractor for IT subperiodic groups +## +InstallGlobalFunction( SubPeriodicGroupDataIT, function( r ) + + local settings, setting; + settings := SubPeriodicGroupSettingsIT(r.type, r.nr); + if IsBound(r.setting) then + if not (r.setting in settings) then + Error( "requested setting is not available" ); + fi; + else + # No setting provided. Find the default setting. + if r.type = "Frieze" then + r.setting := 'a'; + elif r.type = "Rod" then + if "abc" in settings then + r.setting := "abc"; + else + r.setting := '1'; + fi; + elif r.type = "Layer" then + if 'a' in settings then + r.setting := 'a'; + elif r.nr in [52,62,64] then + # The alternative origin choice. + r.setting := '2'; + else + r.setting := '1'; + fi; + else + Error( "only types Frieze, Rod, or Layer are supported, but got ", r.type ); + fi; + fi; + # Convert from character to string, if required. + if not IsList(r.setting) then + setting := [r.setting]; + else + setting := r.setting; + fi; + if r.type = "Frieze" then + if r.nr in [1..7] then + return FriezeGroupList[r.nr].(setting); + else + Error( "frieze group number must be in [1..7]" ); + fi; + elif r.type = "Rod" then + if r.nr in [1..75] then + return RodGroupList[r.nr].(setting); + else + Error( "rod group number must be in [1..75]" ); + fi; + elif r.type = "Layer" then + if r.nr in [1..80] then + return LayerGroupList[r.nr].(setting); + else + Error( "layer group number must be in [1..80]" ); + fi; + else + Error( "only types Frieze, Rod, or Layer are supported, but got ", r.type ); + fi; +end ); + +############################################################################# +## +#M SubPeriodicGroupFunIT . . . constructor function for IT subperiodic group +## +InstallGlobalFunction( SubPeriodicGroupFunIT, function( r ) + local data, gens, vec, name, S, setting, d; + data := SubPeriodicGroupDataIT( r ); + gens := ShallowCopy( data.generators ); + d := Length(data.basis[1]); + for vec in data.basis do + Add( gens, AugmentedMatrix( IdentityMat( d ), vec ) ); + od; + if r.action = LeftAction then + gens := List( gens, TransposedMat ); + S := AffineCrystGroupOnLeftNC( gens, IdentityMat(d+1) ); + name := "SubPeriodicGroupOnLeftIT("; + else + S := AffineCrystGroupOnRightNC( gens, IdentityMat(d+1) ); + name := "SubPeriodicGroupOnRightIT("; + fi; + if not IsList(r.setting) then + setting := [r.setting]; + else + setting := r.setting; + fi; + AddTranslationBasis( S, data.basis ); + SetName( S, Concatenation( name, r.type, ",", String(r.nr), + ",'", setting, "')" ) ); + return S; +end ); + +############################################################################# +## +#M SubPeriodicGroupOnRightIT . .constructor for IT subperiodic group OnRight +## +InstallGlobalFunction( SubPeriodicGroupOnRightIT, function( arg ) + local r; + r := rec( type := arg[1], nr := arg[2], action := RightAction ); + if IsBound( arg[3] ) then + r.setting := arg[3]; + fi; + return SubPeriodicGroupFunIT( r ); +end ); + +############################################################################# +## +#M SubPeriodicGroupOnLeftIT . . .constructor for IT subperiodic group OnLeft +## +InstallGlobalFunction( SubPeriodicGroupOnLeftIT, function( arg ) + local r; + r := rec( type := arg[1], nr := arg[2], action := LeftAction ); + if IsBound( arg[3] ) then + r.setting := arg[3]; + fi; + return SubPeriodicGroupFunIT( r ); +end ); + +############################################################################# +## +#M SubPeriodicGroupIT . . . . . . . . . constructor for IT subperiodic group +## +InstallGlobalFunction( SubPeriodicGroupIT, function( arg ) + local r; + r := rec( type := arg[1], nr := arg[2], action := CrystGroupDefaultAction ); + if IsBound( arg[3] ) then + r.setting := arg[3]; + fi; + return SubPeriodicGroupFunIT( r ); +end ); + +############################################################################# +## +#M FriezeGroupIT . . . . . . . . . . . . . . constructor for IT frieze group +## +InstallGlobalFunction( FriezeGroupIT, function( arg ) + Add(arg, "Frieze", 1); + return CallFuncList(SubPeriodicGroupIT, arg); +end ); + +############################################################################# +## +#M RodGroupIT . . . . . . . . . . . . . . . . . constructor for IT rod group +## +InstallGlobalFunction( RodGroupIT, function( arg ) + Add(arg, "Rod", 1); + return CallFuncList(SubPeriodicGroupIT, arg); +end ); + +############################################################################# +## +#M LayerGroupIT . . . . . . . . . . . . . . . constructor for IT layer group +## +InstallGlobalFunction( LayerGroupIT, function( arg ) + Add(arg, "Layer", 1); + return CallFuncList(SubPeriodicGroupIT, arg); +end ); diff --git a/grp/subgrp.grp b/grp/subgrp.grp new file mode 100644 index 0000000..816e352 --- /dev/null +++ b/grp/subgrp.grp @@ -0,0 +1,1371 @@ +############################################################################# +## +#A subgrp.grp Cryst library Bernard Field +## +#Y Copyright 2024 by Bernard Field +## +## Data for IT subperiodic groups +## + +############################################################################# +## +#M FriezeGroupList . . . . . . . . . . . . . . . . data for IT frieze groups +## +BindGlobal("FriezeGroupList", +[rec( +a := rec( +basis := [[1,0]], +generators := []), +b := rec( +basis := [[0,1]], +generators := [])),rec( +a := rec( +basis := [[1,0]], +generators := [[[-1,0,0],[0,-1,0],[0,0,1]]]), +b := rec( +basis := [[0,1]], +generators := [[[-1,0,0],[0,-1,0],[0,0,1]]])),rec( +a := rec( +basis := [[1,0]], +generators := [[[-1,0,0],[0,1,0],[0,0,1]]]), +b := rec( +basis := [[0,1]], +generators := [[[1,0,0],[0,-1,0],[0,0,1]]])),rec( +a := rec( +basis := [[1,0]], +generators := [[[1,0,0],[0,-1,0],[0,0,1]]]), +b := rec( +basis := [[0,1]], +generators := [[[-1,0,0],[0,1,0],[0,0,1]]])),rec( +a := rec( +basis := [[1,0]], +generators := [[[1,0,0],[0,-1,0],[1/2,0,1]]]), +b := rec( +basis := [[0,1]], +generators := [[[-1,0,0],[0,1,0],[0,-1/2,1]]])),rec( +a := rec( +basis := [[1,0]], +generators := +[[[-1,0,0],[0,-1,0],[0,0,1]],[[-1,0,0],[0,1,0],[0,0,1]]]), +b := rec( +basis := [[0,1]], +generators := +[[[-1,0,0],[0,-1,0],[0,0,1]],[[1,0,0],[0,-1,0],[0,0,1]]])) +,rec( +a := rec( +basis := [[1,0]], +generators := +[[[-1,0,0],[0,-1,0],[0,0,1]],[[-1,0,0],[0,1,0],[1/2,0,1]]]) +, +b := rec( +basis := [[0,1]], +generators := +[[[-1,0,0],[0,-1,0],[0,0,1]],[[1,0,0],[0,-1,0],[0,-1/2,1]]] +))] +); + +############################################################################# +## +#M RodGroupList . . . . . . . . . . . . . . . . . . . data for IT rod groups +## +BindGlobal("RodGroupList", +[rec( +1 := rec( +basis := [[0,0,1]], +generators := [])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])), +rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,-1/2,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[-1/2,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[-1/2,0,0,1]]])), +rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[-1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[-1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[-1/2,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[-1/2,0,0,1]]])), +rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[-1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[-1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,1/2,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,-1/2,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,1/2,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,1/2,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[-1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[-1/2,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[-1/2,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[-1/2,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,1/2,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[-1/2,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[-1/2,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,1/2,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[-1/2,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[-1/2,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[-1/2,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[-1/2,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,1/2,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[-1/2,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[-1/2,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[-1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[-1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +abc := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,1/2,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +acb := rec( +basis := [[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,-1/2,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bac := rec( +basis := [[0,0,1]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +bca := rec( +basis := [[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cab := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[-1/2,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +cba := rec( +basis := [[1,0,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[-1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/4,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,3/4,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/4,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,3/4,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,1/2,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,1/2,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,1/3,1]]])), +rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,2/3,1]]])), +rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,-1,0],[0,0,0,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,-1,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,1/3,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,-1,0],[0,0,2/3,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,1/3,1]], +[[-1,-1,0,0],[0,1,0,0],[0,0,-1,0],[0,0,2/3,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,2/3,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,-1,0],[0,0,1/3,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,2/3,1]], +[[-1,-1,0,0],[0,1,0,0],[0,0,-1,0],[0,0,1/3,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,-1,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,-1,0,0],[0,1,0,0],[0,0,1,0],[0,0,1/2,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,-1,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,-1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,-1,0,0],[0,1,0,0],[0,0,-1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,1/3,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,2/3,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,1/3,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,2/3,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,1/3,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,1/3,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,2/3,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,2/3,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,1/3,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,1/3,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,2/3,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,2/3,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[-1,-1,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,-1,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,1/2,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,-1,0,0],[0,1,0,0],[0,0,1,0],[0,0,1/2,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,1/2,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +2 := rec( +basis := [[0,0,1]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,1/2,1]], +[[1,1,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]))] +); + +############################################################################# +## +#M LayerGroupList . . . . . . . . . . . . . . . . . data for IT layer groups +## +BindGlobal("LayerGroupList", +[rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])), +rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]]]), +2 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[-1/2,-1/2,0,1]]]), +3 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]]])), +rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +2 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[-1/2,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +3 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]]])), +rec( +a := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,1/2,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,0,0,1]]])), +rec( +a := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]]), +b := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,-1/2,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,1/2,0,1]]])),rec( +1 := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,-1/2,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,1/2,0,1]]])),rec( +1 := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,1/2,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,1/2,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,1/2,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,-1/2,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,-1/2,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,-1/2,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[1/2,1/2,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,-1/2,0,1]]])),rec( +a := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]]), +b := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,1,0],[1/2,0,0,1]]]), +b := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,-1/2,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,1/2,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,-1/2,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +a := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]), +b := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,-1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,1/2,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1/2,1/2,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1,1,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[1,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,1/2,0,1]]]), +2 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,1/2,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,1/2,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,1/2,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,1/2,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,1/2,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1,1,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[1,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,1/2,0,1]]]), +2 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,1/2,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1,1,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[1,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[1/2,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[1/2,1/2,0,1]]]), +2 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[1/2,1/2,0,1]], +[[0,1,0,0],[-1,0,0,0],[0,0,1,0],[1/2,0,0,1]], +[[-1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,1/2,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[0,-1,0,0],[-1,0,0,0],[0,0,1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]]])),rec( +1 := rec( +basis := [[1,0,0],[0,1,0]], +generators := [[[0,1,0,0],[-1,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,1,0],[0,0,0,1]], +[[0,1,0,0],[1,0,0,0],[0,0,-1,0],[0,0,0,1]], +[[-1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]]))] +); diff --git a/init.g b/init.g index 0e84760..0ea0212 100644 --- a/init.g +++ b/init.g @@ -29,3 +29,4 @@ ReadPackage( "cryst", "gap/max.gd" ); # declarations for maximal subgroups ReadPackage( "cryst", "gap/color.gd" ); # declarations for color groups ReadPackage( "cryst", "gap/equiv.gd" ); # isomorphism test for space groups ReadPackage( "cryst", "grp/spacegrp.gd" ); # the IT space group catalogue +ReadPackage( "cryst", "grp/subgrp.gd" ); # the IT subperiodic group catalogue diff --git a/read.g b/read.g index 3880812..eefcbbd 100644 --- a/read.g +++ b/read.g @@ -56,3 +56,6 @@ ReadPackage( "cryst", "gap/equiv.gi" ); # conjugator between space groups ## ReadPackage( "cryst", "grp/spacegrp.grp" ); # the catalogue ReadPackage( "cryst", "grp/spacegrp.gi" ); # access functions +# And the subperiodic groups +ReadPackage( "cryst", "grp/subgrp.grp" ); # the catalogue +ReadPackage( "cryst", "grp/subgrp.gi" ); # access functions diff --git a/tst/subperiodic.tst b/tst/subperiodic.tst new file mode 100644 index 0000000..fdb9b7e --- /dev/null +++ b/tst/subperiodic.tst @@ -0,0 +1,291 @@ +gap> START_TEST( "Cryst: subperiodic.tst" ); + +# This test is for the subperiodic group features. +gap> SetAssertionLevel(1); +gap> SetCrystGroupDefaultAction(RightAction); + +# Test that layer groups are conjured correctly. +gap> G := LayerGroupIT( 5 ); +SubPeriodicGroupOnRightIT(Layer,5,'1') + +gap> IsAffineCrystGroupOnRight( G ); +true + +gap> G^IdentityMat(4); + + +gap> TranslationBasis( G ); +[ [ 1, 0, 0 ], [ 0, 1, 0 ] ] + +gap> G := LayerGroupIT( 8, 'b' ); +SubPeriodicGroupOnRightIT(Layer,8,'b') + +# Test that rod groups are conjured correctly +gap> G := RodGroupIT( 7 ); +SubPeriodicGroupOnRightIT(Rod,7,'abc') + +gap> IsAffineCrystGroupOnRight( G ); +true + +gap> G^IdentityMat(4); + + +gap> TranslationBasis( G ); +[ [ 0, 0, 1 ] ] + +gap> G := RodGroupIT( 12, "bca" ); +SubPeriodicGroupOnRightIT(Rod,12,'bca') + +gap> TranslationBasis( G ); +[ [ 0, 1, 0 ] ] + +# Test that frieze groups are conjured correctly +gap> G := FriezeGroupIT( 2 ); +SubPeriodicGroupOnRightIT(Frieze,2,'a') + +gap> IsAffineCrystGroupOnRight( G ); +true + +gap> G^IdentityMat(3); +Group([ [ [ -1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, 1 ] ], + [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 1, 0, 1 ] ] ]) + +gap> TranslationBasis( G ); +[ [ 1, 0 ] ] + +gap> G := FriezeGroupIT( 2, 'b' ); +SubPeriodicGroupOnRightIT(Frieze,2,'b') + +gap> TranslationBasis( G ); +[ [ 0, 1 ] ] + +# Test that different ways of calling the same group work +gap> SubPeriodicGroupIT("Layer", 23) = LayerGroupIT(23); +true + +gap> SubPeriodicGroupOnRightIT("Rod", 14) = RodGroupIT(14); +true + +gap> SubPeriodicGroupOnRightIT("Frieze", 3, 'a') = FriezeGroupIT(3); +true + +# Confirm that different groups are different +gap> RodGroupIT(4) = RodGroupIT(3); +false + +gap> LayerGroupIT(15) = RodGroupIT(15); +false + +gap> FriezeGroupIT(1) = RodGroupIT(1); +false + +# Test conjugation without Wyckoff positions +gap> G := FriezeGroupIT(3);; +gap> C := [[0,1,0],[1,0,0],[0,0,1]];; +gap> G^C; +Group([ [ [ 1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, 1 ] ], + [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 1, 1 ] ] ]) + +# Test generation of Wyckoff positions +gap> G := LayerGroupIT(56);; +gap> pos := WyckoffPositions(G); +[ < Wyckoff position, point group 2, translation := [ 0, 0, 0 ], + basis := [ [ 0, 0, 1 ] ] > + , < Wyckoff position, point group 2, translation := [ 0, 1/2, 0 ], + basis := [ [ 0, 0, 1 ] ] > + , < Wyckoff position, point group 3, translation := [ 0, 1/2, 0 ], + basis := [ [ 1, 1, 0 ], [ 0, 0, 1 ] ] > + , < Wyckoff position, point group 1, translation := [ 0, 0, 0 ], + basis := [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] > + ] + +# Some GAP versions give Group([ ]), some . +gap> IsTrivial( WyckoffStabilizer( pos[4] ) ); +true + +gap> WyckoffStabilizer( pos[3] ); +Group( +[ [ [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ], [ 0, 0, 1, 0 ], [ -1/2, 1/2, 0, 1 ] ] ]) + +gap> WyckoffStabilizer( pos[2] ); + + +# Test that conjugation of Wyckoff positions works as expected +# Make sure to include a Wyckoff with an empty basis +gap> G := LayerGroupIT(54);; +gap> pos := WyckoffPositions(G); +[ < Wyckoff position, point group 3, translation := [ 1/2, 0, 0 ], + basis := [ ] > + , < Wyckoff position, point group 2, translation := [ 0, 0, 0 ], + basis := [ [ 0, 0, 1 ] ] > + , < Wyckoff position, point group 2, translation := [ 0, 1/2, 0 ], + basis := [ [ 0, 0, 1 ] ] > + , < Wyckoff position, point group 4, translation := [ 0, 1/2, 0 ], + basis := [ [ 1, 1, 0 ] ] > + , < Wyckoff position, point group 1, translation := [ 0, 0, 0 ], + basis := [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] > + ] + +# An arbitrary transformation, with translation +gap> C := [ [ 5, -1, 0, 0 ], [ 2, 0, 1, 0 ], [ -3, 1, -1, 0 ], [ 1/2, 1/3, 1, 1 ] ];; +gap> IsAffineCrystGroupOnRight( G^C ); +true + +gap> Set(WyckoffPositions( G^C )) = Set(WyckoffPositions( LayerGroupIT(54)^C )); +true + +gap> G := RodGroupIT(17);; +gap> Length(WyckoffPositions( G^C )) = Length(WyckoffPositions( RodGroupIT(17) )); +true + +# Test that WyckoffPositionsByStabilizer (and, by extension, WyPos) works +gap> G := LayerGroupIT(24);; +gap> W := WyckoffPositions(G);; +gap> sub := Group([[[-1,0,0],[0,1,0],[0,0,1]]]);; +gap> IsSubgroup(PointGroup(G), sub); +true + +gap> wp := WyckoffPositionsByStabilizer(G, sub); +[ < Wyckoff position, point group 1, translation := [ 1/4, 0, 0 ], + basis := [ [ 0, 1, 0 ], [ 0, 0, 1 ] ] > + ] + +gap> wp[1] = W[3]; +true + +# Test that the WyPosSGL algorithm works just as well as default. +gap> G := LayerGroupIT(26);; +gap> W1 := WyPosSGL(G);; +gap> W2 := WyPosAT(G);; +gap> Set(W1) = Set(W2); +true + +gap> C := [ [ 5, -1, 0, 0 ], [ 2, 0, 1, 0 ], [ -3, 1, -1, 0 ], [ 1/2, 1/3, 1, 1 ] ];; +gap> W1 := WyPosSGL( G^C );; +gap> W2 := WyPosAT( G^C );; +gap> Set(W1) = Set(W2); +true + +# Test that Wyckoff works on the left +gap> G := SubPeriodicGroupOnLeftIT("Layer", 12); +SubPeriodicGroupOnLeftIT(Layer,12,'a') + +gap> G = TransposedMatrixGroup(LayerGroupIT(12)); +true + +gap> G := SubPeriodicGroupOnLeftIT("Layer", 54);; +gap> pos := WyckoffPositions(G); +[ < Wyckoff position, point group 3, translation := [ 1/2, 0, 0 ], + basis := [ ] > + , < Wyckoff position, point group 2, translation := [ 0, 0, 0 ], + basis := [ [ 0, 0, 1 ] ] > + , < Wyckoff position, point group 2, translation := [ 0, 1/2, 0 ], + basis := [ [ 0, 0, 1 ] ] > + , < Wyckoff position, point group 4, translation := [ 0, 1/2, 0 ], + basis := [ [ 1, -1, 0 ] ] > + , < Wyckoff position, point group 1, translation := [ 0, 0, 0 ], + basis := [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] > + ] + +# Some GAP versions give Group([ ]), some +gap> IsTrivial( WyckoffStabilizer( pos[5] ) ); +true + +gap> WyckoffStabilizer( pos[4] ); +Group( +[ [ [ 0, -1, 0, 1/2 ], [ -1, 0, 0, 1/2 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ] ]) + +gap> IsAffineCrystGroupOnLeft( G^TransposedMat(C) ); +true + +gap> Set(WyckoffPositions( G^TransposedMat(C) )) = Set(WyckoffPositions(SubPeriodicGroupOnLeftIT("Layer",54)^TransposedMat(C))); +true + +gap> G := SubPeriodicGroupOnLeftIT("Rod", 17);; +gap> Length(WyckoffPositions( G )) = Length(WyckoffPositions( RodGroupIT(17) )); +true + +gap> Length(WyckoffPositions( G^TransposedMat(C) )) = Length(WyckoffPositions( G )); +true + +# Test that we get the right number of Wyckoff positions +gap> List( [1..7], i -> Length( WyckoffPositions( FriezeGroupIT(i) ) ) ); +[ 1, 3, 3, 2, 1, 6, 3 ] + +gap> List( [0..7], i -> Length( WyckoffPositions( RodGroupIT(10*i + 3) ) ) ); +[ 3, 8, 2, 3, 1, 2, 3, 12 ] + +gap> List( [1..8], i -> Length( WyckoffPositions( LayerGroupIT(10*i - 2) ) ) ); +[ 3, 6, 3, 11, 10, 5, 5, 10 ] + +gap> List( [1..8], i -> Length( WyckoffPositions( LayerGroupIT(10*i - 2)^C ) ) ); +[ 3, 6, 3, 11, 10, 5, 5, 10 ] + +# An arbitrary transformation without a translation, +# just to ensure code coverage of the non-shifted case. +gap> C := [ [ 5, -1, 0, 0 ], [ 2, 0, 1, 0 ], [ -3, 1, -1, 0 ], [ 0, 0, 0, 1 ] ];; +gap> List( [1..8], i -> Length( WyckoffPositions( LayerGroupIT(10*i - 2)^C ) ) ); +[ 3, 6, 3, 11, 10, 5, 5, 10 ] + +# Also need to ensure I get good results in the harder case where two +# internal basis vectors need to be generated +gap> List( [0..7], i -> Length( WyckoffPositions( RodGroupIT(10*i + 3)^C ) ) ); +[ 3, 8, 2, 3, 1, 2, 3, 12 ] + +# Check that changing CrystGroupDefaultAction works as expected +gap> CrystGroupDefaultAction; +"RightAction" + +gap> SetCrystGroupDefaultAction(LeftAction); + +gap> G := LayerGroupIT(12); +SubPeriodicGroupOnLeftIT(Layer,12,'a') + +gap> G ^ IdentityMat(4); + + +gap> IsAffineCrystGroupOnLeft(G); +true + +gap> LayerGroupIT(8, 'b'); +SubPeriodicGroupOnLeftIT(Layer,8,'b') + +gap> G := RodGroupIT(5); +SubPeriodicGroupOnLeftIT(Rod,5,'abc') + +gap> IsAffineCrystGroupOnLeft(G); +true + +gap> G := FriezeGroupIT(2); +SubPeriodicGroupOnLeftIT(Frieze,2,'a') + +gap> IsAffineCrystGroupOnLeft(G); +true + +gap> G := SubPeriodicGroupIT("Layer", 54); +SubPeriodicGroupOnLeftIT(Layer,54,'1') + +gap> pos := WyckoffPositions(G); +[ < Wyckoff position, point group 3, translation := [ 1/2, 0, 0 ], + basis := [ ] > + , < Wyckoff position, point group 2, translation := [ 0, 0, 0 ], + basis := [ [ 0, 0, 1 ] ] > + , < Wyckoff position, point group 2, translation := [ 0, 1/2, 0 ], + basis := [ [ 0, 0, 1 ] ] > + , < Wyckoff position, point group 4, translation := [ 0, 1/2, 0 ], + basis := [ [ 1, -1, 0 ] ] > + , < Wyckoff position, point group 1, translation := [ 0, 0, 0 ], + basis := [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] > + ] + +gap> C := [ [ 5, 2, -3, 1/2 ], [ -1, 0, 1, 1/3 ], [ 0, 1, -1, 1 ], [ 0, 0, 0, 1 ] ];; +gap> IsAffineCrystGroup( G^C ); +true + +gap> Set( WyckoffPositions( G^C ) ) = Set( WyckoffPositions( LayerGroupIT(54)^C ) ); +true + +# Revert to default +gap> SetCrystGroupDefaultAction(RightAction); + +gap> STOP_TEST( "subperiodic.tst", 10000 ); diff --git a/tst/wyckoff.tst b/tst/wyckoff.tst index 1a15706..6ab3fa3 100644 --- a/tst/wyckoff.tst +++ b/tst/wyckoff.tst @@ -8,4 +8,9 @@ gap> List( [1..17], i -> Length( WyckoffPositions( SpaceGroupIT(2,i) ) ) ); gap> List( [1..23], i -> Length( WyckoffPositions( SpaceGroupIT(3,10*i-3) ) ) ); [ 1, 5, 5, 4, 27, 5, 15, 4, 9, 11, 5, 9, 12, 8, 7, 4, 6, 14, 15, 6, 11, 8, 9 ] +# Test conjugation +gap> C := [[5,-1,0,0],[2,0,1,0],[-3,1,-1,0],[1/2,1/3,1,1]];; +gap> List( [1..23], i -> Length( WyckoffPositions( SpaceGroupIT(3,10*i-3) ^ C ) ) ); +[ 1, 5, 5, 4, 27, 5, 15, 4, 9, 11, 5, 9, 12, 8, 7, 4, 6, 14, 15, 6, 11, 8, 9 ] + gap> STOP_TEST( "wyckoff.tst", 10000 );