The free algebra is an interesting and useful object. Here I present the freealg
package which provides some functionality for free algebra in the R programming environment. The package uses the C++ map
class for efficiency and conforms to disordR
discipline. Several use-cases are provided.
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
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=x^2yx + zyand
B=z + y^4we would have
AB=(x2yx+zy)(z+y4)=x2yxz+x2yxy4+zyz+zy5and
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=(x{-1})2=X^2we would have
AC=(x2yx+zy)X2= x^2yX + zyX^2and
CA=X2(x2yx+zy)= yx + X^2zy.The system inherits associativity from associativity of concatenation, and distributivity is assumed, but it is not commutative.
Thefreealg
package in use
Creating a free algebra object is straightforward. We can coerce from a character string with natural idiom:
X <- as.freealg("1 + 3a + 5b + 5abba")
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
#> + a + 2*ab + 3*abc + 4*abcd + 5*abcde
Y <- as.freealg("6 - 4a +2aaab")
X+Y
#> free algebra element algebraically equal to
#> + 7 - a + 2*aaab + 5*abba + 5*b
X*Y
#> 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
X^2
#> 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)
(x1 <- rfalg(inc=TRUE))
#> free algebra element algebraically equal to
#> + 7*C + 6*Ca + 4*B + 3*BC + a + 5*aCBB + 2*bc
(x2 <- rfalg(inc=TRUE))
#> free algebra element algebraically equal to
#> + 6 + CAAA + 2*Ca + 3*Cbcb + 7*aaCA + 4*b + 5*c
(x3 <- rfalg(inc=TRUE))
#> free algebra element algebraically equal to
#> + 3*C + 5*CbAc + BACB + 2*a + 10*b + 7*cb
(function rfalg()
generates random freealg
objects). Then
x1*(x2*x3) == (x1*x2)*x3
#> [1] TRUE
Further information
For more detail, see the package vignette
vignette("freealg")
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4