knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.path = "man/figures/README-",
  out.width = "100%"
)

Total Downloads CRAN_Status_Badge

Overview

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.

Installation

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 ${x,y,z}$ and

[ A=\alpha x^2yx + \beta zy ]

and

[ B=\gamma z + \delta 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 x^2yxy^4+\beta\gamma zyz+\beta\delta zy^5 ]

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

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 $xX=1$). Thus if

[ C=\epsilon\left(x^{-1}\right)^2=\epsilon X^2]

we would have

[ AC=\left(\alpha x^2yx+\beta zy\right)\epsilon X^2= \alpha\epsilon x^2yX + \beta\epsilon zyX^2 ]

and

[ CA=\epsilon X^2\left(\alpha x^2yx+\beta zy\right)= \alpha\epsilon yx + \beta\epsilon X^2zy. ]

The system inherits associativity from associativity of concatenation, and distributivity is assumed, but it is not commutative.

The freealg 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

or use a more formal method:

freealg(sapply(1:5,seq_len),1:5)
Y <- as.freealg("6 - 4a +2aaab")
X+Y
X*Y
X^2

We can demonstrate associativity (which is non-trivial):

set.seed(0)
(x1 <- rfalg(inc=TRUE))
(x2 <- rfalg(inc=TRUE))
(x3 <- rfalg(inc=TRUE))

(function rfalg() generates random freealg objects). Then

x1*(x2*x3) == (x1*x2)*x3

Further information

For more detail, see the package vignette

vignette("freealg")



RobinHankin/freealg documentation built on Dec. 24, 2024, 3:16 a.m.