To cite the freealg
package in publications, please use
Hankin (2022b). In this short document I
show how free algebras may be studied using the freealg
package. The free algebra is best introduced by an example:
with an alphabet of \{x,y,z\}, and real
numbers \alpha,\beta,\gamma we formally
define A=\alpha x^2yx
+ \beta zy and B=-\beta zy + \gamma
y^4. Addition is commutative so A+B=B+A. However, multiplication is not
commutative so AB\neq
BA in general; both are associative. We also have consistency in
that \alpha(\beta P)=(\alpha\beta)P for
any expression P. Then:
A+B=(\alpha x^2yx + \beta zy) + (-\beta zy + \gamma y^4) = \alpha x^2yx + \gamma y^4
AB= (\alpha x^2yx + \beta zy) (-\beta zy + \gamma y^4) = -\alpha\beta x^2yxzy +\alpha\gamma x^2yxy^4 -\beta^2zyzy +\beta\gamma zy^5
BA=(-\beta zy + \gamma y^4)(\alpha x^2yx + \beta zy) = -\alpha\beta zyx^2yx -\beta^2 zyzy + \alpha\gamma y^4x^2yx + \beta\gamma y^4zy
This is a natural set of objects to consider. Formally, we consider the free R-module with a basis consisting of all words over an alphabet of symbols [conventionally lower-case letters] with multiplication of words defined as concatenation. The system inherits associativity from associativity of concatenation; distributivity follows from the definition of R-module. However, the free algebra is not commutative in general.
freealg
package in use
The above examples are a little too general for the
freealg
package; the idiom requires that we have specific
numerical values for the coefficients \alpha,\beta,\gamma. Here we will use 1,2,3 respectively.
(A <- as.freealg("xxyx + 2zy"))
## free algebra element algebraically equal to
## + xxyx + 2zy
(B <- as.freealg("-2zy + 3yyyy"))
## free algebra element algebraically equal to
## + 3yyyy - 2zy
A+B
## free algebra element algebraically equal to
## + xxyx + 3yyyy
A*B
## free algebra element algebraically equal to
## + 3xxyxyyyy - 2xxyxzy + 6zyyyyy - 4zyzy
B*A
## free algebra element algebraically equal to
## + 3yyyyxxyx + 6yyyyzy - 2zyxxyx - 4zyzy
Note that the terms are stored in an implementation-specific order.
For example, A
might appear as xxyz + 2*zy
or
the algebraically equivalent form 2*zy + xxyz
. The package
follows disordR
discipline (Hankin
2022a).
Inverses are coded using upper-case letters.
A*as.freealg("X") # X = x^{-1}
## free algebra element algebraically equal to
## + xxy + 2zyX
See how multiplying by X=x^{-1} on
the right cancels one of the x
terms in A
. We
can use this device in more complicated examples:
(C <- as.freealg("3 + 5X - 2Xyx"))
## free algebra element algebraically equal to
## + 3 + 5X - 2Xyx
A*C
## free algebra element algebraically equal to
## + 5xxy + 3xxyx - 2xxyyx + 6zy + 10zyX - 4zyXyx
C*A
## free algebra element algebraically equal to
## - 2Xyxxxyx - 4Xyxzy + 10Xzy + 3xxyx + 5xyx + 6zy
With these objects we may verify that the distributive and associative laws are true:
A*(B+C) == A*B + A*C
## [1] TRUE
(A+B)*C == A*C + B*C
## [1] TRUE
A*(B*C) == (A*B)*C
## [1] TRUE
Various utilities are included in the package. For example, the commutator bracket is represented by reasonably concise idiom:
a <- as.freealg("a")
b <- as.freealg("b")
.[a,b] # returns ab-ba
## free algebra element algebraically equal to
## + ab - ba
Using rfalg()
to generate random free algebra objects,
we may verify the Jacobi identity:
## free algebra element algebraically equal to
## 0
The package includes functionality for substitution:
subs("aabccc",b="1+3x") # aa(1+3x)ccc
## free algebra element algebraically equal to
## + aaccc + 3aaxccc
subs("abccc",b="1+3x",x="1+d+2e")
## free algebra element algebraically equal to
## + 4accc + 3adccc + 6aeccc
It is possible to extract components of freealg
objects
using reasonably standard idiom:
(a <- as.freealg("aaa + 2*aaba + 3*abbbba + 9*xyzabc - 3*abc"))
## free algebra element algebraically equal to
## + aaa + 2aaba + 3abbbba - 3abc + 9xyzabc
a[coeffs(a) > 2]
## free algebra element algebraically equal to
## + 3abbbba + 9xyzabc
a[coeffs(a) < 0] <- 99
a
## free algebra element algebraically equal to
## + aaa + 2aaba + 3abbbba + 99abc + 9xyzabc
There is even some experimental functionality for calculus:
deriv(as.freealg("aaaxaa"),"a")
## free algebra element algebraically equal to
## + aaaxa(da) + aaax(da)a + aa(da)xaa + a(da)axaa + (da)aaxaa
Above, “da
” means the differential of a
.
Note how it may appear at any position in the product, not just the end
(cf matrix differentiation).
disordR
Package.”
arXiv. https://doi.org/10.48550/ARXIV.2210.03856.