# Tables 25.1-25.17 of Conway/Burgiel/Goodman-Strauss, "The Symmetries of Things" (2008),
# ch. 25 "The 184 Composite Space Groups", book pp. 370-374 = PDF pp. 389-393.
# Identical to Table 1 of Conway, Delgado Friedrichs, Huson, Thurston,
# "On three-dimensional space groups", Beitr. Algebra Geom. 42 (2001) 475-507 (arXiv:math/9911185).
#
# Transcribed by hand from 400 dpi renderings of the book pages and cross-checked
# against `pdftotext -layout` of arXiv:math/9911185.
#
# Coupling encoding: a string like "1/3-" means the vertical map z -> 1/3 - z ; "0+" means z -> z.
# 'bracket' is '(' for a circular fibration (K = {n+}) or '[' for an interval one (K = {n+, n-}).

from fractions import Fraction as F

# ---------------------------------------------------------------- table definitions
# Each table: plane group, generator names in column order, relator words,
# and the rows (fibrifold name, couplings, point group, IT number).
# A relator word is a list of (generator index, exponent) pairs, read LEFT TO RIGHT
# as a composition of maps (the word g1 g2 ... gn acts as g1 o g2 o ... o gn).

TABLES = []


def T(num, plane, gens, relators, rows):
    TABLES.append(dict(num=num, plane=plane, gens=gens, relators=relators, rows=rows))


def w(s, gens):
    """'PQPQ' -> word; supports 'P-' for inverse, e.g. 'PgPg-' """
    out = []
    i = 0
    while i < len(s):
        g = s[i]
        e = 1
        if i + 1 < len(s) and s[i + 1] == '-':
            e = -1
            i += 1
        out.append((gens.index(g), e))
        i += 1
    return out


# ---- 25.1  *632 :  * ^P 6 ^Q 3 ^R 2 ;  1 = P^2 = (PQ)^6 = Q^2 = (QR)^3 = R^2 = (RP)^2
T('25.1', '*632', 'PQR',
  ['PP', 'PQ' * 6, 'QQ', 'QR' * 3, 'RR', 'RP' * 2],
  [('[*.6.3.2]',   '0+ 0+ 0+ 0-',            '*226', 191),
   ('[*:6.3.2]',   '1/2+ 0+ 0+ 0-',          '*226', 194),
   ('[*.6:3:2]',   '0+ 1/2+ 1/2+ 0-',        '*226', 193),
   ('[*:6:3:2]',   '1/2+ 1/2+ 1/2+ 0-',      '*226', 192),
   ('(*.6.3.2)',   '0+ 0+ 0+',               '*66',  183),
   ('(*:6.3.2)',   '1/2+ 0+ 0+',             '*66',  186),
   ('(*.6:3:2)',   '0+ 1/2+ 1/2+',           '*66',  185),
   ('(*:6:3:2)',   '1/2+ 1/2+ 1/2+',         '*66',  184),
   ('(*6.3.2)',    '0- 0+ 0+',               '2*3',  164),
   ('(*6:3:2)',    '0- 1/2+ 1/2+',           '2*3',  165),
   ('(*.6 3_0 2)', '0+ 0- 0-',               '2*3',  162),
   ('(*.6 3_1 2)', '0+ 1/3- 0-',             '2*3',  166),
   ('(*:6 3_0 2)', '1/2+ 0- 0-',             '2*3',  163),
   ('(*:6 3_1 2)', '1/2+ 1/3- 0-',           '2*3',  167),
   ('(*6_0 3_0 2_0)', '0- 0- 0-',            '226',  177),
   ('(*6_1 3_1 2_1)', '1/2- 1/3- 0-',        '226',  178),
   ('(*6_2 3_2 2_0)', '0- 2/3- 0-',          '226',  180),
   ('(*6_3 3_0 2_1)', '1/2- 0- 0-',          '226',  182)])

# ---- 25.2  632 :  ^g 6 ^d 3 ^e 2 ;  1 = g^6 = d^3 = e^2 = gde
T('25.2', '632', 'gde',
  ['g' * 6, 'd' * 3, 'e' * 2, 'gde'],
  [('[6_0 3_0 2_0]', '0+ 0+ 0+ 0-',   '6*', 175),
   ('[6_3 3_0 2_1]', '1/2+ 0+ 1/2+ 0-', '6*', 176),
   ('(6_0 3_0 2_0)', '0+ 0+ 0+',      '66', 168),
   ('(6_1 3_1 2_1)', '1/6+ 1/3+ 1/2+', '66', 169),
   ('(6_2 3_2 2_0)', '1/3+ 2/3+ 0+',  '66', 171),
   ('(6_3 3_0 2_1)', '1/2+ 0+ 1/2+',  '66', 173),
   ('(6 3_0 2)',     '0- 0+ 0-',      '3x', 147),
   ('(6 3_1 2)',     '1/3- 1/3+ 0-',  '3x', 148)])

# ---- 25.3  *442 : 1 = P^2 = (PQ)^4 = Q^2 = (QR)^4 = R^2 = (RP)^2
T('25.3', '*442', 'PQR',
  ['PP', 'PQ' * 4, 'QQ', 'QR' * 4, 'RR', 'RP' * 2],
  [('[*.4.4.2]', '0+ 0+ 0+ 0-',        '*224', 123),
   ('[*.4.4:2]', '0+ 0+ 1/2+ 0-',      '*224', 139),
   ('[*.4:4.2]', '0+ 1/2+ 0+ 0-',      '*224', 131),
   ('[*.4:4:2]', '0+ 1/2+ 1/2+ 0-',    '*224', 140),
   ('[*:4.4:2]', '1/2+ 0+ 1/2+ 0-',    '*224', 132),
   ('[*:4:4:2]', '1/2+ 1/2+ 1/2+ 0-',  '*224', 124),
   ('(*.4.4.2)', '0+ 0+ 0+',           '*44',   99),
   ('(*.4.4:2)', '0+ 0+ 1/2+',         '*44',  107),
   ('(*.4:4.2)', '0+ 1/2+ 0+',         '*44',  105),
   ('(*.4:4:2)', '0+ 1/2+ 1/2+',       '*44',  108),
   ('(*:4.4:2)', '1/2+ 0+ 1/2+',       '*44',  101),
   ('(*:4:4:2)', '1/2+ 1/2+ 1/2+',     '*44',  103),
   ('(*4.4.2)',  '0- 0+ 0+',           '*224', 129),
   ('(*4.4:2)',  '0- 0+ 1/2+',         '*224', 137),
   ('(*4:4.2)',  '0- 1/2+ 0+',         '*224', 138),
   ('(*4:4:2)',  '0- 1/2+ 1/2+',       '*224', 130),
   ('(*.4 4.2)', '0+ 0- 0+',           '2*2',  115),
   ('(*.4 4:2)', '0+ 0- 1/2+',         '2*2',  121),
   ('(*:4 4:2)', '1/2+ 0- 1/2+',       '2*2',  116),
   ('(*4_0 4.2)', '0- 0- 0+',          '*224', 125),
   ('(*4_1 4.2)', '1/4- 0- 0+',        '*224', 141),
   ('(*4_2 4.2)', '1/2- 0- 0+',        '*224', 134),
   ('(*4_0 4:2)', '0- 0- 1/2+',        '*224', 126),
   ('(*4_1 4:2)', '1/4- 0- 1/2+',      '*224', 142),
   ('(*4_2 4:2)', '1/2- 0- 1/2+',      '*224', 133),
   ('(*4.4 2_0)', '0- 0+ 0-',          '2*2',  111),
   ('(*4.4 2_1)', '1/2- 0+ 0-',        '2*2',  119),
   ('(*4:4 2_0)', '0- 1/2+ 0-',        '2*2',  112),
   ('(*4:4 2_1)', '1/2- 1/2+ 0-',      '2*2',  120),
   ('(*4_0 4_0 2_0)', '0- 0- 0-',      '224',   89),
   ('(*4_1 4_1 2_1)', '1/2- 1/4- 0-',  '224',   91),
   ('(*4_2 4_2 2_0)', '0- 1/2- 0-',    '224',   93),
   ('(*4_2 4_0 2_1)', '1/2- 0- 0-',    '224',   97),
   ('(*4_3 4_1 2_0)', '0- 1/4- 0-',    '224',   98)])

# ---- 25.4  4*2 : ^g 4 * ^P 2 ;  1 = g^4 = P^2 = [P,g]^2
T('25.4', '4*2', 'gP',
  ['g' * 4, 'PP', 'PgP-g-' * 2],
  [('[4_0*.2]', '0+ 0+ 0-',     '*224', 127),
   ('[4_2*.2]', '1/2+ 0+ 0-',   '*224', 136),
   ('[4_0*:2]', '0+ 1/2+ 0-',   '*224', 128),
   ('[4_2*:2]', '1/2+ 1/2+ 0-', '*224', 135),
   ('(4_0*.2)', '0+ 0+',        '*44',  100),
   ('(4_1*.2)', '1/4+ 0+',      '*44',  109),
   ('(4_2*.2)', '1/2+ 0+',      '*44',  102),
   ('(4_0*:2)', '0+ 1/2+',      '*44',  104),
   ('(4_1*:2)', '1/4+ 1/2+',    '*44',  110),
   ('(4_2*:2)', '1/2+ 1/2+',    '*44',  106),
   ('(4~*.2)',  '0- 0+',        '2*2',  113),
   ('(4~*:2)',  '0- 1/2+',      '2*2',  114),
   ('(4_0*2_0)', '0+ 0-',       '224',   90),
   ('(4_1*2_1)', '1/4+ 0-',     '224',   92),
   ('(4_2*2_0)', '1/2+ 0-',     '224',   94),
   ('(4~*_0 2_0)', '0- 0-',     '2*2',  117),
   ('(4~*_1 2_0)', '0- 1/2-',   '2*2',  118),
   ('(4~*2_1)',    '0- 1/4-',   '2*2',  122)])

# ---- 25.5  442 : 1 = g^4 = d^4 = e^2 = gde
T('25.5', '442', 'gde',
  ['g' * 4, 'd' * 4, 'ee', 'gde'],
  [('[4_0 4_0 2_0]', '0+ 0+ 0+ 0-',        '4*', 83),
   ('[4_2 4_2 2_0]', '1/2+ 1/2+ 0+ 0-',    '4*', 84),
   ('[4_2 4_0 2_1]', '1/2+ 0+ 1/2+ 0-',    '4*', 87),
   ('(4_0 4_0 2_0)', '0+ 0+ 0+',           '44', 75),
   ('(4_1 4_1 2_1)', '1/4+ 1/4+ 1/2+',     '44', 76),
   ('(4_2 4_2 2_0)', '1/2+ 1/2+ 0+',       '44', 77),
   ('(4_2 4_0 2_1)', '1/2+ 0+ 1/2+',       '44', 79),
   ('(4_3 4_1 2_0)', '3/4+ 1/4+ 0+',       '44', 80),
   ('(4 4_0 2)',     '0+ 0- 0-',           '4*', 85),
   ('(4 4_1 2)',     '1/4+ 0- 1/4-',       '4*', 88),
   ('(4 4_2 2)',     '1/2+ 0- 1/2-',       '4*', 86),
   ('(4 4 2_0)',     '0- 0- 0+',           '2x', 81),
   ('(4 4 2_1)',     '1/2- 0- 1/2+',       '2x', 82)])

# ---- 25.6  *333 : 1 = P^2 = (PQ)^3 = Q^2 = (QR)^3 = R^2 = (RP)^3
T('25.6', '*333', 'PQR',
  ['PP', 'PQ' * 3, 'QQ', 'QR' * 3, 'RR', 'RP' * 3],
  [('[*.3.3.3]', '0+ 0+ 0+ 0-',        '*223', 187),
   ('[*:3:3:3]', '1/2+ 1/2+ 1/2+ 0-',  '*223', 188),
   ('(*.3.3.3)', '0+ 0+ 0+',           '*33',  156),
   ('(*:3:3:3)', '1/2+ 1/2+ 1/2+',     '*33',  158),
   ('(*3_0 3_0 3_0)', '0- 0- 0-',      '223',  149),
   ('(*3_1 3_1 3_1)', '2/3- 1/3- 0-',  '223',  151),
   ('(*3_0 3_1 3_2)', '1/3- 1/3- 0-',  '223',  155)])

# ---- 25.7  3*3 : ^g 3 * ^P 3 ;  1 = g^3 = P^2 = [P,g]^3
T('25.7', '3*3', 'gP',
  ['ggg', 'PP', 'PgP-g-' * 3],
  [('[3_0*.3]', '0+ 0+ 0-',    '*223', 189),
   ('[3_0*:3]', '0+ 1/2+ 0-',  '*223', 190),
   ('(3_0*.3)', '0+ 0+',       '*33',  157),
   ('(3_1*.3)', '1/3+ 0+',     '*33',  160),
   ('(3_0*:3)', '0+ 1/2+',     '*33',  159),
   ('(3_1*:3)', '1/3+ 1/2+',   '*33',  161),
   ('(3_0*3_0)', '0+ 0-',      '223',  150),
   ('(3_1*3_1)', '1/3+ 0-',    '223',  152)])

# ---- 25.8  333 : 1 = g^3 = d^3 = e^3 = gde
T('25.8', '333', 'gde',
  ['ggg', 'ddd', 'eee', 'gde'],
  [('[3_0 3_0 3_0]', '0+ 0+ 0+ 0-',   '3*', 174),
   ('(3_0 3_0 3_0)', '0+ 0+ 0+',      '33', 143),
   ('(3_1 3_1 3_1)', '1/3+ 1/3+ 1/3+', '33', 144),
   ('(3_0 3_1 3_2)', '0+ 1/3+ 2/3+',  '33', 146)])

# ---- 25.9  *2222 : 1 = P^2 = (PQ)^2 = Q^2 = (QR)^2 = R^2 = (RS)^2 = S^2 = (SP)^2
T('25.9', '*2222', 'PQRS',
  ['PP', 'PQPQ', 'QQ', 'QRQR', 'RR', 'RSRS', 'SS', 'SPSP'],
  [('[*.2.2.2.2]', '0+ 0+ 0+ 0+ 0-',          '*222', 47),
   ('[*.2.2.2:2]', '0+ 0+ 0+ 1/2+ 0-',        '*222', 65),
   ('[*.2.2:2:2]', '0+ 0+ 1/2+ 1/2+ 0-',      '*222', 69),
   ('[*.2:2.2:2]', '0+ 1/2+ 0+ 1/2+ 0-',      '*222', 51),
   ('[*.2:2:2:2]', '0+ 1/2+ 1/2+ 1/2+ 0-',    '*222', 67),
   ('[*:2:2:2:2]', '1/2+ 1/2+ 1/2+ 1/2+ 0-',  '*222', 49),
   ('(*.2.2.2.2)', '0+ 0+ 0+ 0+',             '*22',  25),
   ('(*.2.2.2:2)', '0+ 0+ 0+ 1/2+',           '*22',  38),
   ('(*.2.2:2:2)', '0+ 0+ 1/2+ 1/2+',         '*22',  42),
   ('(*.2:2.2:2)', '0+ 1/2+ 0+ 1/2+',         '*22',  26),
   ('(*.2:2:2:2)', '0+ 1/2+ 1/2+ 1/2+',       '*22',  39),
   ('(*:2:2:2:2)', '1/2+ 1/2+ 1/2+ 1/2+',     '*22',  27),
   ('(*2.2.2.2)',  '0+ 0+ 0+ 0-',             '*222', 51),
   ('(*2.2.2:2)',  '0+ 0+ 1/2+ 0-',           '*222', 63),
   ('(*2.2:2.2)',  '0+ 1/2+ 0+ 0-',           '*222', 55),
   ('(*2.2:2:2)',  '0+ 1/2+ 1/2+ 0-',         '*222', 64),
   ('(*2:2.2:2)',  '1/2+ 0+ 1/2+ 0-',         '*222', 57),
   ('(*2:2:2:2)',  '1/2+ 1/2+ 1/2+ 0-',       '*222', 54),
   ('(*2_0 2.2.2)', '0- 0- 0+ 0+',            '*222', 67),
   ('(*2_1 2.2.2)', '1/2- 0- 0+ 0+',          '*222', 74),
   ('(*2_0 2.2:2)', '0- 0- 0+ 1/2+',          '*222', 72),
   ('(*2_1 2.2:2)', '1/2- 0- 0+ 1/2+',        '*222', 64),
   ('(*2_0 2:2:2)', '0- 0- 1/2+ 1/2+',        '*222', 68),
   ('(*2_1 2:2:2)', '1/2- 0- 1/2+ 1/2+',      '*222', 73),
   ('(*2.2 2.2)',  '0- 0+ 0- 0+',             '2*',   10),
   ('(*2.2 2:2)',  '0- 0+ 0- 1/2+',           '2*',   12),
   ('(*2:2 2:2)',  '0- 1/2+ 0- 1/2+',         '2*',   13),
   ('(*2_0 2_0 2.2)', '0- 0- 0- 0+',          '*222', 49),
   ('(*2_0 2_1 2.2)', '0- 0- 1/2- 0+',        '*222', 66),
   ('(*2_1 2_1 2.2)', '1/2- 0- 1/2- 0+',      '*222', 53),
   ('(*2_0 2_0 2:2)', '0- 0- 0- 1/2+',        '*222', 50),
   ('(*2_0 2_1 2:2)', '0- 0- 1/2- 1/2+',      '*222', 68),
   ('(*2_1 2_1 2:2)', '1/2- 0- 1/2- 1/2+',    '*222', 54),
   ('(*2_0 2_0 2_0 2_0)', '0- 0- 0- 0-',      '222',  16),
   ('(*2_0 2_0 2_1 2_1)', '0- 0- 0- 1/2-',    '222',  21),
   ('(*2_0 2_1 2_0 2_1)', '0- 0- 1/2- 1/2-',  '222',  22),
   ('(*2_1 2_1 2_1 2_1)', '0- 1/2- 0- 1/2-',  '222',  17)])

# ---- 25.10  2*22 : ^g 2 * ^P 2 ^Q 2 ; 1 = g^2 = P^2 = (PQ)^2 = Q^2 = (Q g P g^-1)^2
T('25.10', '2*22', 'gPQ',
  ['gg', 'PP', 'PQPQ', 'QQ', 'QgPg-' * 2],
  [('[2_0*.2.2]', '0+ 0+ 0+ 0-',         '*222', 65),
   ('[2_1*.2.2]', '1/2+ 0+ 0+ 0-',       '*222', 71),
   ('[2_0*.2:2]', '0+ 0+ 1/2+ 0-',       '*222', 74),
   ('[2_1*.2:2]', '1/2+ 0+ 1/2+ 0-',     '*222', 63),
   ('[2_0*:2:2]', '0+ 1/2+ 1/2+ 0-',     '*222', 66),
   ('[2_1*:2:2]', '1/2+ 1/2+ 1/2+ 0-',   '*222', 72),
   ('(2_0*.2.2)', '0+ 0+ 0+',            '*22',  35),
   ('(2_1*.2.2)', '1/2+ 0+ 0+',          '*22',  44),
   ('(2_0*.2:2)', '0+ 0+ 1/2+',          '*22',  46),
   ('(2_1*.2:2)', '1/2+ 0+ 1/2+',        '*22',  36),
   ('(2_0*:2:2)', '0+ 1/2+ 1/2+',        '*22',  37),
   ('(2_1*:2:2)', '1/2+ 1/2+ 1/2+',      '*22',  45),
   ('(2_0*2.2)',  '0+ 0+ 0-',            '*222', 53),
   ('(2_1*2.2)',  '1/2+ 0+ 0-',          '*222', 58),
   ('(2_0*2:2)',  '0+ 1/2+ 0-',          '*222', 52),
   ('(2_1*2:2)',  '1/2+ 1/2+ 0-',        '*222', 60),
   ('(2~*.2.2)',  '0- 0+ 0+',            '*222', 59),
   ('(2~*.2:2)',  '0- 0+ 1/2+',          '*222', 62),
   ('(2~*:2:2)',  '0- 1/2+ 1/2+',        '*222', 56),
   ('(2~*2.2)',   '0- 0- 0+',            '2*',   12),
   ('(2~*2:2)',   '0- 0- 1/2+',          '2*',   15),
   ('(2_0*2_0 2_0)', '0+ 0- 0-',         '222',  21),
   ('(2_1*2_0 2_0)', '1/2+ 0- 0-',       '222',  23),
   ('(2_0*2_1 2_1)', '0+ 1/2- 0-',       '222',  24),
   ('(2_1*2_1 2_1)', '1/2+ 1/2- 0-',     '222',  20),
   ('(2~*_0 2_0 2_0)', '0- 0- 0-',       '*222', 50),
   ('(2~*_1 2_0 2_0)', '0- 1/2- 1/2-',   '*222', 48),
   ('(2~*2_0 2_1)',    '0- 1/4- 1/4-',   '*222', 70),
   ('(2~*2_1 2_1)',    '0- 0- 1/2-',     '*222', 52)])

# ---- 25.11  22* : ^g 2 ^d 2 * ^P ; 1 = g^2 = d^2 = P^2 = [P, g d]
T('25.11', '22*', 'gdP',
  ['gg', 'dd', 'PP', 'PgdP-d-g-'],
  [('[2_0 2_0*.]', '0+ 0+ 0+ 0-',        '*222', 51),
   ('[2_0 2_1*.]', '0+ 1/2+ 0+ 0-',      '*222', 63),
   ('[2_1 2_1*.]', '1/2+ 1/2+ 0+ 0-',    '*222', 59),
   ('[2_0 2_0*:]', '0+ 0+ 1/2+ 0-',      '*222', 53),
   ('[2_0 2_1*:]', '0+ 1/2+ 1/2+ 0-',    '*222', 64),
   ('[2_1 2_1*:]', '1/2+ 1/2+ 1/2+ 0-',  '*222', 57),
   ('(2_0 2_0*.)', '0+ 0+ 0+',           '*22',  28),
   ('(2_0 2_1*.)', '0+ 1/2+ 0+',         '*22',  40),
   ('(2_1 2_1*.)', '1/2+ 1/2+ 0+',       '*22',  31),
   ('(2_0 2_0*:)', '0+ 0+ 1/2+',         '*22',  30),
   ('(2_0 2_1*:)', '0+ 1/2+ 1/2+',       '*22',  41),
   ('(2_1 2_1*:)', '1/2+ 1/2+ 1/2+',     '*22',  29),
   ('(2_0 2_0*)',  '0+ 0+ 0-',           '222',  17),
   ('(2_0 2_1*)',  '0+ 1/2+ 0-',         '222',  20),
   ('(2_1 2_1*)',  '1/2+ 1/2+ 0-',       '222',  18),
   ('(2_0 2~*.)',  '0+ 0- 0+',           '*222', 57),
   ('(2_1 2~*.)',  '1/2+ 0- 0+',         '*222', 62),
   ('(2_0 2~*:)',  '0+ 0- 1/2+',         '*222', 60),
   ('(2_1 2~*:)',  '1/2+ 0- 1/2+',       '*222', 61),
   ('(2_0 2~*_0)', '0+ 0- 0-',           '*222', 54),
   ('(2_0 2~*_1)', '0+ 1/2- 0-',         '*222', 52),
   ('(2_1 2~*_0)', '1/2+ 1/2- 0-',       '*222', 56),
   ('(2_1 2~*_1)', '1/2+ 0- 0-',         '*222', 60),
   ('(2 2*.)',     '0- 0- 0+',           '2*',   11),
   ('(2 2*:)',     '0- 0- 1/2+',         '2*',   14),
   ('(2 2*_0)',    '0- 0- 0-',           '2*',   13),
   ('(2 2*_1)',    '0- 1/2- 0-',         '2*',   15)])

# ---- 25.12  22x : ^g 2 ^d 2 x ^Z ; 1 = g^2 = d^2 = g d Z^2
T('25.12', '22x', 'gdZ',
  ['gg', 'dd', 'gdZZ'],
  [('[2_0 2_0 x_0]', '0+ 0+ 0+ 0-',       '*222', 55),
   ('[2_0 2_0 x_1]', '0+ 0+ 1/2+ 0-',     '*222', 58),
   ('[2_1 2_1 x]',   '1/2+ 1/2+ 0+ 0-',   '*222', 62),
   ('(2_0 2_0 x_0)', '0+ 0+ 0+',          '*22',  32),
   ('(2_0 2_0 x_1)', '0+ 0+ 1/2+',        '*22',  34),
   ('(2_0 2_1 x)',   '0+ 1/2+ 1/4+',      '*22',  43),
   ('(2_1 2_1 x)',   '1/2+ 1/2+ 0+',      '*22',  33),
   ('(2_0 2_0 x~)',  '0+ 0+ 0-',          '222',  18),
   ('(2_1 2_1 x~)',  '1/2+ 1/2+ 0-',      '222',  19),
   ('(2 2 x)',       '0- 0- 0+',          '2*',   14)])

# ---- 25.13  2222 : 1 = g^2 = d^2 = e^2 = z^2 = g d e z
T('25.13', '2222', 'gdez',
  ['gg', 'dd', 'ee', 'zz', 'gdez'],
  [('[2_0 2_0 2_0 2_0]', '0+ 0+ 0+ 0+ 0-',          '2*', 10),
   ('[2_0 2_0 2_1 2_1]', '0+ 0+ 1/2+ 1/2+ 0-',      '2*', 12),
   ('[2_1 2_1 2_1 2_1]', '1/2+ 1/2+ 1/2+ 1/2+ 0-',  '2*', 11),
   ('(2_0 2_0 2_0 2_0)', '0+ 0+ 0+ 0+',             '22',  3),
   ('(2_0 2_0 2_1 2_1)', '0+ 0+ 1/2+ 1/2+',         '22',  5),
   ('(2_1 2_1 2_1 2_1)', '1/2+ 1/2+ 1/2+ 1/2+',     '22',  4),
   ('(2_0 2_0 2 2)',     '0+ 0+ 0- 0-',             '2*', 13),
   ('(2_0 2_1 2 2)',     '0+ 1/2+ 0- 1/2-',         '2*', 15),
   ('(2_1 2_1 2 2)',     '1/2+ 1/2+ 0- 0-',         '2*', 14),
   ('(2 2 2 2)',         '0- 0- 0- 0-',             'x',   2)])

# ---- 25.14  ** : ^L * ^P * ^Q ; 1 = P^2 = Q^2 = [L,P] = [L,Q]
T('25.14', '**', 'LPQ',
  ['PP', 'QQ', 'LPL-P-', 'LQL-Q-'],
  [('[*_0.*_0.]', '0+ 0+ 0+ 0-',        '*22', 25),
   ('[*_1.*_1.]', '1/2+ 0+ 0+ 0-',      '*22', 38),
   ('[*_0.*_0:]', '0+ 0+ 1/2+ 0-',      '*22', 35),
   ('[*_1.*_1:]', '1/2+ 0+ 1/2+ 0-',    '*22', 42),
   ('[*_0:*_0:]', '0+ 1/2+ 1/2+ 0-',    '*22', 28),
   ('[*_1:*_1:]', '1/2+ 1/2+ 1/2+ 0-',  '*22', 39),
   ('(*.*.)',     '0+ 0+ 0+',           '*',    6),
   ('(*.*:)',     '0+ 0+ 1/2+',         '*',    8),
   ('(*:*:)',     '0+ 1/2+ 1/2+',       '*',    7),
   ('(*~.*~.)',   '0- 0+ 0+',           '*22', 26),
   ('(*~.*~:)',   '0- 0+ 1/2+',         '*22', 36),
   ('(*~:*~:)',   '0- 1/2+ 1/2+',       '*22', 29),
   ('(*.*_0)',    '0+ 0+ 0-',           '*22', 28),
   ('(*.*_1)',    '1/2+ 0+ 0-',         '*22', 40),
   ('(*:*_0)',    '0+ 1/2+ 0-',         '*22', 32),
   ('(*:*_1)',    '1/2+ 1/2+ 0-',       '*22', 41),
   ('(*~.*~_0)',  '0- 0+ 0-',           '*22', 39),
   ('(*~.*~_1)',  '1/2- 0+ 0-',         '*22', 46),
   ('(*~:*~_0)',  '0- 1/2+ 0-',         '*22', 45),
   ('(*~:*~_1)',  '1/2- 1/2+ 0-',       '*22', 41),
   ('(*_0*_0)',   '0+ 0- 0-',           '22',   3),
   ('(*_1*_1)',   '1/2+ 0- 0-',         '22',   5),
   ('(*~_0*~_0)', '0- 0- 0-',           '*22', 27),
   ('(*~_0*~_1)', '0- 0- 1/2-',         '*22', 37),
   ('(*~_1*~_1)', '0- 1/2- 1/2-',       '*22', 30)])

# ---- 25.15  *x : * ^P x ^Z ; 1 = P^2 = [P, Z^2]
T('25.15', '*x', 'PZ',
  ['PP', 'PZZP-Z-Z-'],
  [('[*.x_0]', '0+ 0+ 0-',    '*22', 38),
   ('[*.x_1]', '0+ 1/2+ 0-',  '*22', 44),
   ('[*:x_0]', '1/2+ 0+ 0-',  '*22', 46),
   ('[*:x_1]', '1/2+ 1/2+ 0-', '*22', 40),
   ('(*.x)',   '0+ 0+',       '*',    8),
   ('(*:x)',   '1/2+ 0+',     '*',    9),
   ('(*.x~)',  '0+ 0-',       '*22', 31),
   ('(*:x~)',  '1/2+ 0-',     '*22', 33),
   ('(*_0 x_0)', '0- 0+',     '*22', 30),
   ('(*_0 x_1)', '0- 1/2+',   '*22', 34),
   ('(*_1 x)',   '0- 1/4+',   '*22', 43),
   ('(*x~)',     '0- 0-',     '22',   5)])

# ---- 25.16  xx : x ^Y x ^Z ; 1 = Y^2 Z^2
T('25.16', 'xx', 'YZ',
  ['YYZZ'],
  [('[x_0 x_0]', '0+ 0+ 0-',    '*22', 26),
   ('[x_0 x_1]', '0+ 1/2+ 0-',  '*22', 36),
   ('[x_1 x_1]', '1/2+ 1/2+ 0-', '*22', 31),
   ('(x x_0)',   '0+ 0+',       '*',    7),
   ('(x x_1)',   '0+ 1/2+',     '*',    9),
   ('(x~ x_0)',  '0- 0+',       '*22', 29),
   ('(x~ x_1)',  '0- 1/2+',     '*22', 33),
   ('(x~ x~)',   '0- 0-',       '22',   4)])

# ---- 25.17  o : o ^{X,Y} ; 1 = [X,Y]
T('25.17', 'o', 'XY',
  ['XYX-Y-'],
  [('[o_0]', '0+ 0+ 0-',     '*', 6),
   ('[o_1]', '1/2+ 1/2+ 0-', '*', 8),
   ('(o)',   '0+ 0+',        '1', 1),
   ('(o~_0)', '0- 0-',       '*', 7),
   ('(o~_1)', '0- 1/2-',     '*', 9)])
