knitr::opts_chunk$set(echo = TRUE) options(rmarkdown.html_vignette.check_title = FALSE) library("freealg") set.seed(1)  ![](r system.file("help/figures/freealg.png", package = "freealg")){width=10%} To cite the freealg package in publications, please use @hankin2022_freealg. The free algebra is best defined 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$x+y=y+x$(and so$A=\beta zy + \alpha x^2yx$) but multiplication is not commutative, so$xy\neq yx$; 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. # The 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")) (B <- as.freealg("-2zy + 3yyyy")) A+B A*B B*A  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 [@hankin2022_disordR]. Inverses are coded using upper-case letters. A*as.freealg("X") # X = x^{-1}  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"))
A*C
C*A


With these objects we may verify that the distributive and associative laws are true:

A*(B+C) == A*B + A*C
(A+B)*C == A*C + B*C
A*(B*C) == (A*B)*C


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


Using rfalg() to generate random free algebra objects, we may verify the Jacobi identity:

x <- rfalg()
y <- rfalg()
z <- rfalg()

.[x,.[y,z]] + .[y,.[z,x]] + .[z,.[x,y]]


The package includes functionality for substitution:

subs("aabccc",b="1+3x")  # aa(1+3x)ccc

subs("abccc",b="1+3x",x="1+d+2e")


There is even some experimental functionality for calculus:

deriv(as.freealg("aaaxaa"),"a")


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).

# References

## Try the freealg package in your browser

Any scripts or data that you put into this service are public.

freealg documentation built on Dec. 12, 2022, 1:06 a.m.