Recently I had a correspondence concerning the PresentationNormalClosure
function which might be of interest for other GAP users, too.
Warren Dicks from Barcelona wrote:
Can you tell me to whom I can write to ask the following question?
How can I find expressions for the generators of
PresentationNormalClosureRrs(G,H) in terms of the original
generators of G?
Unfortunately, the program does not return a list of these expressions
though it definitely needs them during the computation. In fact, it
establishes an intermediate list of the definitions of the so called
"primary subgroup generators" (see for the manual) in the resulting
I think that you can get access to this list by just including one
additional statement in the function "PresentationAugmentedCosetTable"
in the GAP library file "fpsgpres.g". I am not enough familiar any more
with the code to guarantee that this works properly, but I think it is
worth while to have a try. So I would recommend thatyou to do the
(1) Extract a copy of the function "PresentationAugmentedCosetTable"
from the GAP library file "fpsgpres.g" and write it into a local
file "pact", say.
(2) Insert in this file the statement
T.definitions := aug.primaryGeneratorWords;
immediately before the return statement at the end.
(3) Start your GAP session with the commands
ReadLib( "fpgrp" ); ReadLib( "fptietze" ); ReadLib( "fpsgpres" ); Read( "pact" );
to load the GAP library "fpsgpres.g" and then to overwrite the
original version of the above function by the altered one.
(4) Then start your computation. After calling the command
P := PresentationNormalClosureRrs( G, H );
you should end up with a presentation record which has an additional
component P.definitions which hopefully contains the definitions of
the primary subgroup generators as words in the original generators
of G. Note that you can use the "DecodeTree" command to reduce the
list of all subgroup generators to the list of primary subgroup
Warren Dicks replied:
Thank you for your message. Yes, it works exactly as you say, so I
will modify the file fpsgpres .
Would it be too much trouble to ask what code I should add so that
I can trace the generators for the unTreeDecoded presentation, and
and the Simplifyed presentation? TreeDecode, in my case, gives one more
relation than Simplify does, and many many applications of the simplifying
procedure don't seem to get rid of it.
As for your question for words for the unTreeDecoded generators:
There is a good reason not to provide these words: They tend to be
of enormous length, at least in general. Of course, this may be
different for your concrete examples, hence you should have a look
at them. Using your modified version of "fpsgpres,g", you may extend
the list "P.definitions" to a list of words for all generators using
the following (hopefully correct) code.
P := PresentationNormalClosureRrs( G, H ); numgens := Length( P.generators ); defs := P.definitions; numprim := Length( defs ); tree := P.tree; treelength := Length( tree ); defs2 := Copy( defs ); for i in [ numprim + 1 .. treelength ] do j := tree[i]; if j > 0 then left := defs2[j]; else left := defs2[-j]^-1; fi; j := tree[i]; if j > 0 then right := defs2[j]; else right := defs2[-j]^-1; fi; defs2[i] := left * right; od; for i in [ numprim + 1 .. numgens ] do defs[i] := defs2[tree[i]]; od;
As for your question for words for the generators in an simplified
presentation: The "SimplifyPresentation" command does not trace the
substitutions it performs.
Volkmar Felsch, Aachen