Skip to contents

Vectorized functionality to implement outer automorphisms of the free group

Usage

permsymb_single_X(X,f)
permsymb_single_f(X,f)
permsymb_vec(X,f)
permsymb(X,f)
autosub_lowlevel(M,e,S)
autosub(X,e,S,automorphism_warning=TRUE)

Arguments

X,S

Object of class free

f

Permutation function

M

Single free group element, in two-row matrix form

e

Single element to substitute

automorphism_warning

Boolean, with default TRUE meaning to give a warning if the requested substitution is not an automorphism and FALSE meaning not to give the warning

Details

In 1924, Nielsen showed that the automorphism group of the free group with basis \([x_1,\ldots,x_n]\) is generated by the following four elementary Nielsen transformations:

  1. switch \(x_1\) and \(x_2\)

  2. Cyclically permute \(x_1,x_2,\ldots,x_n\) to \(x_2,\ldots,x_n,x_1\)

  3. Replace \(x_1\) with \(x_1^{-1}\)

  4. Replace \(x_1\) with \(x_1x_2\).

The functions documented here give vectorized methods to effect such outer automorphisms, using the permutations package.

Operations 1 and 2 above generate the symmetric group \(S_n\) and such automorphisms are effected by function permsymb(). Operation 3 is carried out by by flip() and operation 4 by subsymb().

Functions permsymb_single_X(), permsymb_single_f(), permsymb_vec() and subsymb_lowlevel() are low-level helper functions that are not really suited for the end user; use permsymb(), (flip) and subsymb() instead.

References

Wikipedia contributors. (2018, October 29). “Automorphism group of a free group”. In Wikipedia, The Free Encyclopedia. Retrieved 19:58, January 10, 2019, from https://en.wikipedia.org/w/index.php?title=Automorphism_group_of_a_free_group&oldid=866270661

Author

Robin K. S. Hankin

See also

Note

Function permsymb() is intended to work nicely with the permutations package; see inst/outer.Rmd for some illustrations. The function is not perfect.

Examples


P <- as.free(c("abc","aba","cc","ca"))
autosub(P,"c",as.free("xyz"))
#> [1] a.b.c.x.y.z     a.b.a           c.x.y.z.c.x.y.z c.x.y.z.a      

flip(P,"c")
#> [1] a.b.c^-1 a.b.a    c^-2     c^-1.a  
flip(P,"ac")
#> [1] a^-1.b.c^-1 a^-1.b.a^-1 c^-2        c^-1.a^-1