45.9 Tietze Transformations that introduce new Generators

Some of the Tietze transformation commands listed so far may eliminate generators and hence change the given presentation to a presentation on a subset of the given set of generators, but they all do not introduce new generators. However, sometimes there will be the need to substitute certain words as new generators in order to improve a presentation. Therefore GAP offers the two commands TzSubstitute and TzSubstituteCyclicJoins which introduce new generators.

  • TzSubstitute( P, word ) F
  • TzSubstitute( P[, n[, eliminate]] ) F

    In the first form TzSubstitute expects P to be a presentation and word to be either an abstract word or a Tietze word in the generators of P. It substitutes the given word as a new generator of P. This is done as follows: First, TzSubstitute creates a new abstract generator, g say, and adds it to the presentation, then it adds a new relator g-1·word .

    In its second form, TzSubstitute substitutes a squarefree word of length 2 as a new generator and then eliminates a generator from the extended generator list. We will describe this process in more detail below.

    The parameters n and eliminate are optional. If you specify arguments for them, then n is expected to be a positive integer, and eliminate is expected to be 0, 1, or 2. The default values are n = 1 and eliminate = 0.

    TzSubstitute first determines the n most frequently occurring relator subwords of the form g1 g2, where g1 and g2 are different generators or their inverses, and sorts them by decreasing numbers of occurrences.

    Let a b be the last word in that list, and let i be the smallest positive integer which has not yet been used as a generator number in the presentation P so far. TzSubstitute defines a new abstract generator xi named "_xi" and adds it to P (see AddGenerator). Then it adds the word xi-1 a b as a new relator to P and replaces all occurrences of a b in the relators by xi. Finally, it eliminates some suitable generator from P.

    The choice of the generator to be eliminated depends on the actual value of the parameter eliminate:

    If eliminate is zero, TzSubstitute just calls the function TzEliminate. So it may happen that it is the just introduced generator xi which now is deleted again so that you don't get any remarkable progress in simplifying your presentation. On the first glance this does not look reasonable, but it is a consequence of the request that a call of TzSubstitute with eliminate = 0 must not increase the total length of the relators.

    Otherwise, if eliminate is 1 or 2, TzSubstitute eliminates the respective factor of the substituted word a b, i. e., it eliminates a if eliminate = 1 or b if eliminate = 2. In this case, it may happen that the total length of the relators increases, but sometimes such an intermediate extension is the only way to finally reduce a given presentation.

    There is still another property of the command TzSubstitute which should be mentioned. If, for instance, word is an abstract word, a call

    TzSubstitute( P, word );
    

    is more or less equivalent to

    AddGenerator( P );
    g := GeneratorsOfPresentation(P)[Length(GeneratorsOfPresentation(P))];
    AddRelator( P, g^-1 * word );
    

    However, there is a difference: If you are tracing generator images and preimages of P through the Tietze transformations applied to P (see Tracing generator images through Tietze transformations), then TzSubstitute, as a Tietze transformation of P, will update and save the respective lists, whereas a call of the function AddGenerator (which does not perform a Tietze transformation) will delete these lists and hence terminate the tracing.

    gap> G := PerfectGroup( IsSubgroupFpGroup, 960, 1 );
    A5 2^4
    gap> P := PresentationFpGroup( G );
    <presentation with 6 gens and 21 rels of total length 84>
    gap> GeneratorsOfPresentation( P );
    [ a, b, s, t, u, v ]
    gap> TzGoGo( P );
    #I  there are 3 generators and 10 relators of total length 81
    #I  there are 3 generators and 10 relators of total length 80
    gap> TzPrintGenerators( P );
    #I  1.  a   31 occurrences   involution
    #I  2.  b   26 occurrences
    #I  3.  t   23 occurrences   involution
    gap> a := GeneratorsOfPresentation( P )[1];;
    gap> b := GeneratorsOfPresentation( P )[2];;
    gap> TzSubstitute( P, a*b );
    #I  now the presentation has 4 generators, the new generator is _x7
    #I  substituting new generator _x7 defined by a*b
    #I  there are 4 generators and 11 relators of total length 83
    gap> TzGo( P );
    #I  there are 3 generators and 10 relators of total length 74
    gap> TzPrintGenerators( P );
    #I  1.  a   23 occurrences   involution
    #I  2.  t   23 occurrences   involution
    #I  3.  _x7   28 occurrences
    

    As an example of an application of the command TzSubstitute in its second form we handle a subgroup of index 266 in the Janko group J1.

    gap> F2 := FreeGroup( "a", "b" );;
    gap> J1 := F2 / [ F2.1^2, F2.2^3, (F2.1*F2.2)^7,
    > Comm(F2.1,F2.2)^10, Comm(F2.1,F2.2^-1*(F2.1*F2.2)^2)^6 ];;
    gap> a := J1.1;; b := J1.2;;
    gap> H := Subgroup ( J1, [ a, b^(a*b*(a*b^-1)^2) ] );;
    gap> P := PresentationSubgroup( J1, H );
    <presentation with 23 gens and 82 rels of total length 530>
    gap> TzGoGo( P );
    #I  there are 3 generators and 47 relators of total length 1368
    #I  there are 2 generators and 46 relators of total length 3773
    #I  there are 2 generators and 46 relators of total length 2570
    gap> TzGoGo( P );
    #I  there are 2 generators and 46 relators of total length 2568
    gap> TzGoGo( P );
    

    Here we do not get any more progress without substituting a new generator.

    gap> TzSubstitute( P );
    #I  substituting new generator _x28 defined by _x6*_x23^-1
    #I  eliminating _x28 = _x6*_x23^-1
    

    GAP cannot substitute a new generator without extending the total length, so we have to explicitly ask for it by using the second form of the command TzSubstitute. Our problem is to chose appropriate values for the arguments n and eliminate. For this purpose it may be helpful to print out a list of the most frequently occurring squarefree relator subwords of length 2.

    gap> TzPrintPairs( P );
    #I  1.  504  occurrences of  _x6 * _x23^-1
    #I  2.  504  occurrences of  _x6^-1 * _x23
    #I  3.  448  occurrences of  _x6 * _x23
    #I  4.  448  occurrences of  _x6^-1 * _x23^-1
    gap> TzSubstitute( P, 2, 1 );
    #I  substituting new generator _x29 defined by _x6^-1*_x23
    #I  eliminating _x6 = _x23*_x29^-1
    #I  there are 2 generators and 46 relators of total length 2867
    gap> TzGoGo( P );
    #I  there are 2 generators and 45 relators of total length 2417
    #I  there are 2 generators and 45 relators of total length 2122
    gap> TzSubstitute( P, 1, 2 );
    #I  substituting new generator _x30 defined by _x23*_x29^-1
    #I  eliminating _x29 = _x30^-1*_x23
    #I  there are 2 generators and 45 relators of total length 2192
    gap> TzGoGo( P );
    #I  there are 2 generators and 42 relators of total length 1637
    #I  there are 2 generators and 40 relators of total length 1286
    #I  there are 2 generators and 36 relators of total length 807
    #I  there are 2 generators and 32 relators of total length 625
    #I  there are 2 generators and 22 relators of total length 369
    #I  there are 2 generators and 18 relators of total length 213
    #I  there are 2 generators and 13 relators of total length 141
    #I  there are 2 generators and 12 relators of total length 121
    #I  there are 2 generators and 10 relators of total length 101
    gap> TzPrintPairs( P );
    #I  1.  19  occurrences of  _x23 * _x30^-1
    #I  2.  19  occurrences of  _x23^-1 * _x30
    #I  3.  14  occurrences of  _x23 * _x30
    #I  4.  14  occurrences of  _x23^-1 * _x30^-1
    

    If we save a copy of the current presentation, then later we will be able to restart the computation from the current state.

    gap> P1 := ShallowCopy( P );
    <presentation with 2 gens and 10 rels of total length 101>
    

    Just for demonstration we make an inconvenient choice:

    gap> TzSubstitute( P, 3, 1 );
    #I  substituting new generator _x31 defined by _x23*_x30
    #I  eliminating _x23 = _x31*_x30^-1
    #I  there are 2 generators and 10 relators of total length 122
    gap> TzGoGo( P );
    #I  there are 2 generators and 9 relators of total length 105
    

    This presentation is worse than the one we have saved, so we restart from that presentation again.

    gap> P := ShallowCopy( P1 );
    <presentation with 2 gens and 10 rels of total length 101>
    gap> TzSubstitute( P, 2, 1);
    #I  substituting new generator _x31 defined by _x23^-1*_x30
    #I  eliminating _x23 = _x30*_x31^-1
    #I  there are 2 generators and 10 relators of total length 107
    gap> TzGoGo( P );
    #I  there are 2 generators and 9 relators of total length 84
    #I  there are 2 generators and 8 relators of total length 75
    gap> TzSubstitute( P, 2, 1);
    #I  substituting new generator _x32 defined by _x30^-1*_x31
    #I  eliminating _x30 = _x31*_x32^-1
    #I  there are 2 generators and 8 relators of total length 71
    gap> TzGoGo( P );
    #I  there are 2 generators and 7 relators of total length 56
    #I  there are 2 generators and 5 relators of total length 36
    gap> TzPrintRelators( P );
    #I  1. _x32^5
    #I  2. _x31^5
    #I  3. _x31^-1*_x32^-1*_x31^-1*_x32^-1*_x31^-1*_x32^-1
    #I  4. _x31*_x32*_x31^-1*_x32*_x31^-1*_x32*_x31*_x32^-2
    #I  5. _x31^-1*_x32^2*_x31*_x32^-1*_x31^2*_x32^-1*_x31*_x32^2
    

  • TzSubstituteCyclicJoins( P ) F

    tries to find pairs of commuting generators a and b, say, such that the exponent of a (i. e. the least currently known positive integer n such that an is a relator in P) is prime to the exponent of b. For each such pair, their product a b is substituted as a new generator, and a and b are eliminated.

    [Top] [Previous] [Up] [Next] [Index]

    GAP 4 manual
    February 2000