Skip to content

AffineNormalizer(S) returns only a proper subgroup when the point-group normalizer is infinite #60

Description

@lan496

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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions