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 has the downside that the order of the terms is
undefined. This does not matter as the mathematical value is unaffected
by reordering; and the print method does a good job in producing
human-readable output.
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
[ A=\alpha x^2yx + \beta zy](https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;%0AA%3D%5Calpha%20x%5E2yx%20%2B%20%5Cbeta%20zy%0A ” A=x^2yx + zy “)
and
[ B=\gamma z + \delta y^4](https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;%0AB%3D%5Cgamma%20z%20%2B%20%5Cdelta%20y%5E4%0A ” B=z + y^4 “)
we would have
[ AB=\left(\alpha x^2yx+\beta zy\right)\left(\gamma z+\delta y^4\right)=\alpha\gamma x^2yxz+\alpha\delta x2yxy4+\beta\gamma zyz+\beta\delta zy^5](https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;%0AAB%3D%5Cleft%28%5Calpha%20x%5E2yx%2B%5Cbeta%20zy%5Cright%29%5Cleft%28%5Cgamma%20z%2B%5Cdelta%20y%5E4%5Cright%29%3D%5Calpha%5Cgamma%20x%5E2yxz%2B%5Calpha%5Cdelta%20x%5E2yxy%5E4%2B%5Cbeta%5Cgamma%20zyz%2B%5Cbeta%5Cdelta%20zy%5E5%0A ” AB=(x2yx+zy)(z+y4)=x2yxz+x2yxy4+zyz+zy5 “)
and
[ BA=\left(\gamma z+\delta y^4\right)\left(\alpha x^2yx+\beta zy\right)=\alpha\gamma zx^2yx + \alpha\delta y^4 x^2yx + \beta\gamma z^2y + \beta\delta y^4zy.](https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;%0ABA%3D%5Cleft%28%5Cgamma%20z%2B%5Cdelta%20y%5E4%5Cright%29%5Cleft%28%5Calpha%20x%5E2yx%2B%5Cbeta%20zy%5Cright%29%3D%5Calpha%5Cgamma%20zx%5E2yx%20%2B%20%5Calpha%5Cdelta%20y%5E4%20x%5E2yx%20%2B%20%5Cbeta%5Cgamma%20z%5E2y%20%2B%20%5Cbeta%5Cdelta%20y%5E4zy.%0A ” BA=(z+y4)(x2yx+zy)=zx^2yx + y^4 x^2yx + z^2y + y^4zy. “)
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 ). Thus if
[ C=\epsilon\left(x{-1}\right)2=\epsilon X^2](https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;%0AC%3D%5Cepsilon%5Cleft%28x%5E%7B-1%7D%5Cright%29%5E2%3D%5Cepsilon%20X%5E2 ” C=(x{-1})2=X^2”)
we would have
[ AC=\left(\alpha x^2yx+\beta zy\right)\epsilon X^2= \alpha\epsilon x^2yX + \beta\epsilon zyX^2](https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;%0AAC%3D%5Cleft%28%5Calpha%20x%5E2yx%2B%5Cbeta%20zy%5Cright%29%5Cepsilon%20X%5E2%3D%0A%5Calpha%5Cepsilon%20x%5E2yX%20%2B%20%5Cbeta%5Cepsilon%20zyX%5E2%0A ” AC=(x2yx+zy)X2= x^2yX + zyX^2 “)
and
[ CA=\epsilon X^2\left(\alpha x^2yx+\beta zy\right)= \alpha\epsilon yx + \beta\epsilon X^2zy.](https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;%0ACA%3D%5Cepsilon%20X%5E2%5Cleft%28%5Calpha%20x%5E2yx%2B%5Cbeta%20zy%5Cright%29%3D%0A%5Calpha%5Cepsilon%20yx%20%2B%20%5Cbeta%5Cepsilon%20X%5E2zy.%0A ” CA=X2(x2yx+zy)= yx + X^2zy. “)
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")