> < ^ Date: Mon, 01 Aug 1994 14:08:00 +0200
> < ^ From: Volkmar Felsch <Volkmar.Felsch@Math.RWTH-Aachen.DE >
< ^ Subject: Re: Words for secondary generators

Tim Hsu writes:

I've been trying to set up a calculation using AugmentedCosetTableRrs.
Now, when you have the statement

aug := AugmentedCosetTableRrs(G,ct,2,"_q");

(ct is the coset table for a subgroup S in G),
aug.primaryGeneratorWords contains descriptions of the primary
generators of S in terms of words in the generators of G. According
to the GAP manual, aug.tree, (in some form) contains a description of
the secondary generators of S in terms of the primary relators, so in
theory, you should be able to obtain the secondary generators of S in
terms of words in G. Could someone tell me how to get this from the
tree?

Whenever you call the command

aug := AugmentedCosetTableRrs( G, ct, 2, string );

it will return a record with a component "aug.tree" which is a list
of length 5. (Note that the structure represented by that list is not
a tree in mathematical sense; the name has historical reasons.) The
entries of this list are

tree[1] = tree1 (a list of length treelength),
tree[2] = tree2 (a list of length treelength),
tree[3] = treelength = total number of all generators,
tree[4] = numgens = number of primary generators,
tree[5] = type = 2.

The two lists "tree1" and "tree2" are in parallel to the list "gen",
say, of all generators which is ordered such that gen[1] to gen[numgens]
are the primary generators whereas gen[numgens+1] to gen[treelength]
are the secondary generators.

Each of the secondary generators has originally been defined as a
product of two preceding generators (with respect to that list) or
their inverses. The purpose of the tree is to save these definitions.
For numgens < i <= treelength, we have

```gen[i] = factor(tree1[i]) * factor(tree2[i])
```

where

```factor(j) = gen[j]      for j > 0,
factor(j) = gen[-j]^-1  for j < 0.
```

You may use the tree to recursively express each secondary generator
as a word in the preceding ones and finally in the primary generators,
but I would like to warn you of the fact that the length of these words
tends to become very huge so that they soon may get unhandable.

My next question is, do RewriteSubgroupRelators,
PresentationAugmentedCosetTable, TzGo, or FpGroupPresentation change
the ordering of the generators in any way, other than eliminating
generators? Thanks very much.

I think that none of these commands will reorder the list of subgroup
generators by swapping any pair of generators. This answer is to the
best of my recollection, but as it is long ago that I wrote the programs
I would not like to swear on it. If you want to be absolutely sure,
please check the code which for such purposes is given in full source.

Moreover, I would not like to guarantee this for all future. We may at
some time have reasons to change this. This is, in fact, the reason
why no guarantee of this kind has been made in the manual.

What frequently happens in the present program, is that the subgroup
generators are internally renumbered after elimination processes in order
to get rid of the gaps in the numbering. The names of the generators
are not changed by this process.

Example:

```gap> F := FreeGroup( "a", "b" );;
gap> a := F.1;; b := F.2;;
gap> G := F / [ a^2, b^4, (a*b)^7, Comm(a,b)^5, (a*b*a*b^2*a*b^-1)^3 ];;
gap> H := Subgroup ( G, [ G.1^G.2, G.2^(G.1*G.2^-1*G.1) ] );;
gap> T := PresentationSubgroupRrs( G, H );
<< presentation with 5 gens and 12 rels of total length 64 >>
gap> TzPrintGenerators( T );
#I  1.  _x1   11 occurrences   involution
#I  2.  _x2   12 occurrences   involution
#I  3.  _x3   16 occurrences   involution
#I  4.  _x4   11 occurrences
#I  5.  _x5   14 occurrences   involution
gap> TzGo( T );
#I  there are 3 generators and 8 relators of total length 94
gap> TzPrintGenerators( T );
#I  1.  _x2   26 occurrences   involution
#I  2.  _x4   43 occurrences
#I  3.  _x5   25 occurrences   involution
```