The free algebra is an interesting and useful object. Here I present
the `freealg`

package which provides some functionality for
free algebra. The package uses `C++`

’s STL `map`

class for efficiency, which uses the fact that the order of the terms is
algebraically immaterial. The package conforms to `disordR`

discipline.

You can install the released version of `freealg`

from CRAN with:

```
# install.packages("freealg") # uncomment this to install the package
library("freealg")
```

The free algebra is the free R-module with a basis consisting of all words over an alphabet of symbols with multiplication of words defined as concatenation. Thus, with an alphabet of

and

we would have

and

A natural and easily implemented extension is to use upper-case symbols to represent multiplicative inverses of the lower-case equivalents (formally we would use the presentation

we would have

and

The system inherits associativity from associativity of concatenation, and distributivity is assumed, but it is not commutative.

`freealg`

package in
useCreating a free algebra object is straightforward. We can coerce from a character string with natural idiom:

```
<- as.freealg("1 + 3a + 5b + 5abba")
X
X#> free algebra element algebraically equal to
#> + 1 + 3*a + 5*abba + 5*b
```

or use a more formal method:

```
freealg(sapply(1:5,seq_len),1:5)
#> free algebra element algebraically equal to
#> + 1*a + 2*ab + 3*abc + 4*abcd + 5*abcde
```

```
<- as.freealg("6 - 4a +2aaab")
Y +Y
X#> free algebra element algebraically equal to
#> + 7 - 1*a + 2*aaab + 5*abba + 5*b
*Y
X#> free algebra element algebraically equal to
#> + 6 + 14*a - 12*aa + 6*aaaab + 2*aaab + 30*abba - 20*abbaa + 10*abbaaaab + 30*b
#> - 20*ba + 10*baaab
^2
X#> free algebra element algebraically equal to
#> + 1 + 6*a + 9*aa + 15*aabba + 15*ab + 10*abba + 15*abbaa + 25*abbaabba +
#> 25*abbab + 10*b + 15*ba + 25*babba + 25*bb
```

We can demonstrate associativity (which is non-trivial):

```
set.seed(0)
<- rfalg(inc=TRUE))
(x1 #> free algebra element algebraically equal to
#> + 7*C + 6*Ca + 4*B + 3*BC + 1*a + 5*aCBB + 2*bc
<- rfalg(inc=TRUE))
(x2 #> free algebra element algebraically equal to
#> + 6 + 1*CAAA + 2*Ca + 3*Cbcb + 7*aaCA + 4*b + 5*c
<- rfalg(inc=TRUE))
(x3 #> free algebra element algebraically equal to
#> + 3*C + 5*CbAc + 1*BACB + 2*a + 10*b + 7*cb
```

(function `rfalg()`

generates random `freealg`

objects). Then

```
*(x2*x3) == (x1*x2)*x3
x1#> [1] TRUE
```

For more detail, see the package vignette

`vignette("freealg")`