Learn R Programming

⚠️There's a newer version (1.1-8) of this package.Take me there.

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. The package uses C++’s STL map class for efficiency, which uses the fact that the order of the terms is algebraically immaterial. The package conforms to disordR discipline.

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
#> + 1*a + 2*ab + 3*abc + 4*abcd + 5*abcde
Y <- as.freealg("6 - 4a +2aaab")
X+Y
#> free algebra element algebraically equal to
#> + 7 - 1*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 + 1*a + 5*aCBB + 2*bc
(x2 <- rfalg(inc=TRUE))
#> free algebra element algebraically equal to
#> + 6 + 1*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 + 1*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

784

Version

1.1-1

License

GPL (>= 2)

Issues

Pull Requests

Stars

Forks

Maintainer

Robin K S Hankin

Last Published

March 20th, 2023

Functions in freealg (1.1-1)

rfalg

Random free algebra objects
subs

Substitution
adjoint

The adjoint map
deriv

Differentiation of freealg objects
Ops.freealg

Arithmetic Ops methods for the the free algebra
constant

The constant term
abelianize

Abelianize a freealg object
dot-class

Class “dot”
drop

Drop redundant information
freealg

The free algebra
accessor

Accessor methods for freealg objects
grade

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

tools:::Rd_package_title("freealg")
nterms

Number of terms in a freealg object
print

Print freealg objects
pepper

Combine variables in every possible order
horner

Horner's method
linear

A simple free algebra object
zero

The zero algebraic object