Learn R Programming

The Free Algebra in R

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 and

and

we would have

and

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

we would have

and

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
#> 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")

Copy Link

Version

Install

install.packages('freealg')

Monthly Downloads

606

Version

1.1-8

License

GPL (>= 2)

Issues

Pull Requests

Stars

Forks

Maintainer

Robin K S Hankin

Last Published

August 26th, 2024

Functions in freealg (1.1-8)

pepper

Combine variables in every possible order
subs

Substitution
zero

The zero algebraic object
accessor

Accessor methods for freealg objects
Ops.freealg

Arithmetic Ops methods for the the free algebra
drop

Drop redundant information
adjoint

The adjoint map
freealg-package

tools:::Rd_package_title("freealg")
constant

The constant term
dot-class

Class “dot”
abelianize

Abelianize a freealg object
inverse

Inverses
print

Print freealg objects
rfalg

Random free algebra objects
nterms

Number of terms in a freealg object
horner

Horner's method
deriv

Differentiation of freealg objects
grade

The grade (or degree) of terms in a freealg object
freealg-class

Class “freealg”
linear

A simple free algebra object
freealg

The free algebra
letters

Single-letter symbols