For the space group
S := SpaceGroupIT(3, 7);; # Pc, ITA No. 7, unique axis b
Section 3.5 of International Table for Crystallography Vol. A says that the affine normalizer of Pc is generated by transformations with linear part
$$
M_5 := \begin{pmatrix}
u_{11} & 0 & g_{13} \\
0 & \pm 1 & 0 \\
n_{31} & 0 & u_{33}
\end{pmatrix}
$$
and translation part
$$
v_5 := \begin{pmatrix}
r \\
\frac{1}{2} n_{2} \\
t \\
\end{pmatrix}
$$
where $n$, $g$, and $u$ represent integer, even, and odd numbers, respectively, and $r, t$ are real numbers.
However, AffineNormalizer(S) in Cryst appears to return only a proper subgroup of this affine normalizer. In particular, all returned generators have zero (3, 1) entry in their translation part, whereas the affine normalizer should contain elements with a nonzero (3, 1) entry. The script below constructs such an element explicitly. It normalizes S, and its linear part normalizes the point group, but it is not contained in the subgroup generated by AffineNormalizer(S).
Enviromnent
- GAP 4.15.1
- Cryst 4.1.27
- CrystCat 1.1.10
Script
LoadPackage("cryst");;
LoadPackage("crystcat");;
S := SpaceGroupIT(3, 7);; # Pc
n := [[1, 0, 0, 0],
[0, 1, 0, 0],
[2, 0, 1, 0],
[0, 0, 0, 1]];;
# 1. n normalizes S.
ok := ForAll(GeneratorsOfGroup(S), g -> n * g * n^-1 in S) and
ForAll(GeneratorsOfGroup(S), g -> n^-1 * g * n in S);;
Print("n normalizes S: ", ok, "\n");
# 2. The point-group normalizer in GL(3,Z) does contain the linear
# part of n (sanity check that n is a valid candidate): it
# preserves the y-axis / (x,z)-plane splitting and the lattice.
A := n{[1..3]}{[1..3]};;
P := PointGroup(S);;
inN := ForAll(GeneratorsOfGroup(P), w -> A * w * A^-1 in P);;
Print("linear part of n normalizes the point group: ", inN, "\n");
# 3. But every generator returned by AffineNormalizer(S) has zero
# (3,1) entry. Matrices of this block-triangular shape are closed
# under products and inverses, hence EVERY element of the returned
# group has zero (3,1) entry, while n[3][1] = 2. So n is missing.
AN := AffineNormalizer(S);;
tri := ForAll(GeneratorsOfGroup(AN), g -> g[3][1] = 0);;
Print("all AffineNormalizer gens have g[3][1] = 0: ", tri, "\n");
Print("but n[3][1] = ", n[3][1], "\n");
if ok and inN and tri then
Print("BUG REPRODUCED: n normalizes S but is not in ",
"AffineNormalizer(S).\n");
else
Print("bug not reproduced in this environment.\n");
QuitGap(1);
fi;
QUIT;
Outputs
n normalizes S: true
linear part of n normalizes the point group: true
all AffineNormalizer gens have g[3][1] = 0: true
but n[3][1] = 2
BUG REPRODUCED: n normalizes S but is not in AffineNormalizer(S).
For the space group
Section 3.5 of International Table for Crystallography Vol. A says that the affine normalizer of Pc is generated by transformations with linear part
and translation part
where$n$ , $g$ , and $u$ represent integer, even, and odd numbers, respectively, and $r, t$ are real numbers.
However,
AffineNormalizer(S)in Cryst appears to return only a proper subgroup of this affine normalizer. In particular, all returned generators have zero (3, 1) entry in their translation part, whereas the affine normalizer should contain elements with a nonzero (3, 1) entry. The script below constructs such an element explicitly. It normalizesS, and its linear part normalizes the point group, but it is not contained in the subgroup generated byAffineNormalizer(S).Enviromnent
Script
Outputs