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\gamma x^2yxzy + \alpha\gamma x^2yxy^4+\beta\gamma zyzy +\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 useThe 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,\delta\). Here we will use \(1,2,3,4\) respectively.
as.freealg("xxyx + 2zy")) (A <-
## free algebra element algebraically equal to
## + 1*xxyx + 2*zy
as.freealg("-2zy + 3yyyy")) (B <-
## free algebra element algebraically equal to
## + 3*yyyy - 2*zy
+B A
## free algebra element algebraically equal to
## + 1*xxyx + 3*yyyy
*B A
## free algebra element algebraically equal to
## + 3*xxyxyyyy - 2*xxyxzy + 6*zyyyyy - 4*zyzy
*A B
## free algebra element algebraically equal to
## + 3*yyyyxxyx + 6*yyyyzy - 2*zyxxyx - 4*zyzy
Note that the terms are stored in an implementation-specific order. For example, B
might appear as + 4*yyyy + 3*z
or the algebraically equivalent form 3*z + 4*yyyy
(see the disordR
package vignette for an extended discussion).
Inverses are coded using upper-case letters.
as.freealg("3 + 5X - 2Xyx")) (C <-
## free algebra element algebraically equal to
## + 3 + 5*X - 2*Xyx
*C A
## free algebra element algebraically equal to
## + 5*xxy + 3*xxyx - 2*xxyyx + 6*zy + 10*zyX - 4*zyXyx
*A C
## free algebra element algebraically equal to
## - 2*Xyxxxyx - 4*Xyxzy + 10*Xzy + 3*xxyx + 5*xyx + 6*zy
With these objects we may verify that the distributive and associative laws are true:
*(B+C) == A*B + A*C A
## [1] TRUE
+B)*C == A*C + B*C (A
## [1] TRUE
*(B*C) == (A*B)*C A
## [1] TRUE
Various utilities are included in the package. For example, the commutator bracket is represented by reasonably concise idiom:
as.freealg("x"),as.freealg("y")] .[
## free algebra element algebraically equal to
## + 1*xy - 1*yx
Using rfalg()
to generate random free algebra objects, we may verify the Jacobi identity:
rfalg()
x <- rfalg()
y <- rfalg()
z <-
+ .[y,.[z,x]] + .[z,.[x,y]] .[x,.[y,z]]
## 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
## + 1*aaccc + 3*aaxccc
subs("abccc",b="1+3x",x="1+d+2e")
## free algebra element algebraically equal to
## + 4*accc + 3*adccc + 6*aeccc
There is even some functionality for calculus:
deriv(as.freealg("aaaxaa"),"a")
## free algebra element algebraically equal to
## + 1*aaaxa(da) + 1*aaax(da)a + 1*aa(da)xaa + 1*a(da)axaa + 1*(da)aaxaa