The Bracket Algebra

Let $\{x_1, \dots, x_n\} \subset P^{d}$ be $n$ points in projective space. The algebra generated by the $d+1 \times d+1$-minors of the matrix

\[X = \begin{pmatrix} x_{1,1} & \dots & x_{1,d} & 1 \\ & \vdots & \\ x_{n,1} & \dots & x_{n,d} & 1 \end{pmatrix}\]

is called the bracket algebra $\mathcal{B}_{n,d}$ Let $\Lambda \coloneqq \Lambda(n,d+1) \coloneqq \{[\lambda_1, \dots, \lambda_{d+1}] \mid 1\leq \lambda_1 < \dots < \lambda_{d+1} \leq n\}$ and set $[\lambda_{\pi(1)}, \dots \lambda_{\pi(d)}] = \mathrm{sgn}(\pi)[\lambda_1, \dots, \lambda_d]$ in $\mathbb{C}(\Lambda)$. Then

\[\mathbb{C}[\Lambda] / I \to \mathcal{B}_{n,d}, [\lambda_1, \dots, \lambda_{d+1}] \mapsto \det \begin{pmatrix} x_{\lambda_1, 1} & \dots & x_{\lambda_1, d} & 1 \\ & \vdots & \\ x_{\lambda_{d+1}, 1} & \dots & x_{\lambda_{d+1}, d} & 1 \end{pmatrix}\]

defines an isomorphism, where $I$ is the ideal generated by the so called Plücker relations <!– Todo –> We identify the elements of the bracket algebra with its corresponding preimage in $\mathbb{C}[\Lambda]/I$. We define a monomial ordering on the elements of $\mathbb{C}[\Lambda]$. For $[\lambda] = [\lambda_1, \dots, \lambda_{d+1}], \mu = [\mu_1, \dots, \mu_{d+1}] \in \Lambda$ we set $[\lambda] \leq [\mu]$ if and only if for some $1\leq m \leq d+1$ we have $\lambda_i = \mu_i$ for all $1\leq i \leq m$ and $\lambda_{m+1} \leq \mu_{m+1}$, i.e. $[\lambda]$ is smaller in the first entry $[\lambda]$ and $[\mu]$ differ. The degree reverse lexicographic ordering extending this ordering of the variables is called the tableaux ordering.

Basic bracket algebra functionality

This package implements bracket algebras using the ring interface of the Julia package AbstractAlgebra.jl. As is usual for AbstractAlgebra rings, a bracket algebra is an object of type BracketAlgebra and the elements of a bracket algebra are objects of type BracketAlgebraElem.

Constructing Bracket Algebras

Bracket algebras in this package are BracketAlgebra objects.

BracketAlgebras.BracketAlgebraType
BracketAlgebra{T<:RingElement} <: AbstractBracketAlgebra{T}

Bracket algebra with coefficients of type T.

Fields

  • d::Int: dimension of the underlying projective space P^d
  • n::Int: number of points considered
  • R::MPolyRing{T}: AbstractAlgebra multivariate polynomial ring representing the elements of the bracket algebra (for internal use)
  • point_ordering::Vector{Int}: ordering of the n point indices, that induces the tableaux order. point_ordering[1] < point_ordering[2] < ... < point_ordering[n].
  • variables::Bijection{Vector{Int},<:MPolyRingElem{T}}: bijection from brackets to the corresponding monomials in the polynomial ring R
  • point_labels::Vector: point labels for each point
source

To construct the bracket algebra $\mathcal{B}_{6,3}$, you can call

julia> BracketAlgebra(6,3)
Bracket algebra over P^3 on 6 points with point ordering 1 < 2 < 3 < 4 < 5 < 6 and coefficient ring Integers.

The standard labels for the n points is 1:n. You can give different labels to the points by calling

julia> labels = ["a", "b", "c", "d", "e", "f"];

julia> BracketAlgebra(6, 3, point_labels=labels)
Bracket algebra over P^3 on 6 points with point ordering a < b < c < d < e < f and coefficient ring Integers.

Note that if the point labels are integers, they are always expected to be equal to 1:n.

julia> BracketAlgebra(6,3,point_labels=[2,1,3,4,5,6])
ERROR: When point_labels is a Vector of Integers, it must equal collect(1:n)

You can also construct bracket algebras with different orderings of the points. This translates to changing the ordering in the elements of $\Lambda$ above.

julia> labels = ["a", "b", "c", "d", "e", "f"];

julia> BracketAlgebra(6, 3, point_labels=labels)
Bracket algebra over P^3 on 6 points with point ordering a < b < c < d < e < f and coefficient ring Integers.

julia> BracketAlgebra(6, 3, [2,1,3,4,5,6], point_labels=labels)
Bracket algebra over P^3 on 6 points with point ordering b < a < c < d < e < f and coefficient ring Integers.

To access the contents of the fields of a BracketAlgebra the following access functions are provided

BracketAlgebras.nFunction
n(B::BracketAlgebra)

Return the number of points considered in the bracket algebra B.

julia> n(BracketAlgebra(6,3))
6
source
BracketAlgebras.dFunction
d(B::BracketAlgebra)

Return the dimension of the projective space P^d underlying the bracket algebra B.

Examples

julia> d(BracketAlgebra(6,3))
3
source
BracketAlgebras.point_orderingFunction
point_ordering(B::BracketAlgebra)

Return the ordering of the n points in the bracket algebra B, that induces the tableaux order.

Examples

julia> point_ordering(BracketAlgebra(6,3,[2,1,3,4,5,6]))
6-element Vector{Int64}:
 2
 1
 3
 4
 5
 6
source

To change the point ordering of an existing bracket algebra call

BracketAlgebras.point_ordering!Function
point_ordering!(B::BracketAlgebra, point_ordering::AbstractVector{<:Integer}=collect(1:B.n))

Update the point ordering of the bracket algebra B to point_ordering and return the updated bracket algebra.

Warning: changing the point ordering will not change the representation of already generated elements of B, which leads to wrong results when working with these elements. It is recommended to create a new bracket algebra with the desired point ordering instead.

Examples

julia> point_ordering!(BracketAlgebra(6,3), [6,5,4,3,2,1])
Bracket algebra over P^3 on 6 points with point ordering 6 < 5 < 4 < 3 < 2 < 1 and coefficient ring Integers.
source
Warning

Changing the point ordering of an existing BracketAlgebra will not update the point ordering in the internal representation of the already constructed BracketAlgebraElem, even though they will have the updated bracket algebra as a parent object.

The generators of a bracket algebra, i.e. the brackets in the bracket algebra, can be computed by AbstractAlgebra.gens.

julia> gens(BracketAlgebra(4,2))
4-element Vector{BracketAlgebraElem{BigInt}}:
 [2, 3, 4]
 [1, 3, 4]
 [1, 2, 4]
 [1, 2, 3]

julia> gens(BracketAlgebra(4,2,[2,1,3,4]))
4-element Vector{BracketAlgebraElem{BigInt}}:
 [1, 3, 4]
 [2, 3, 4]
 [2, 1, 4]
 [2, 1, 3]

To change the point labels of an existin bracket algebra call

BracketAlgebras.point_labels!Function
point_labels!(B::BracketAlgebra, new_labels::AbstractVector)

Update the point labels of the bracket algebra B and return the resulting bracket algebra. If new_labels is a vector of integers, it is expected to be equal to collect(1:n(B)).

Examples

julia> point_labels!(BracketAlgebra(6,3), ["a", "b", "c", "d", "e", "f"])
Bracket algebra over P^3 on 6 points with point ordering a < b < c < d < e < f and coefficient ring Integers.
julia> point_labels!(BracketAlgebra(6,3), [2,1,3,4,5,"a"])
Bracket algebra over P^3 on 6 points with point ordering 2 < 1 < 3 < 4 < 5 < a and coefficient ring Integers.
julia> point_labels!(BracketAlgebra(6,3), [2,1,3,4,5,6])
ERROR: When point_labels is a Vector of Integers, it must equal collect(1:n)
source

The coefficient ring of the bracket algebra can be accessed via AbstractAlgebra.base_ring

julia> base_ring(BracketAlgebra(4,2,[1,2,3,4],Rational{BigInt}))
Rationals

julia> base_ring(BracketAlgebra(4,2,[1,2,3,4],BigInt))
Integers

julia> base_ring(BracketAlgebra(4,2,[1,2,3,4],AbstractAlgebra.GF(13)))
Finite field F_13

Constructing bracket algebra elements

The elements of a bracket algebra are BracketAlgebraElem objects.

BracketAlgebras.BracketAlgebraElemType
BracketAlgebraElem{T<:Union{RingElem,Number}} <: AbstractBracketAlgebraElem{T}

Element type for BracketAlgebra with coefficients of type T.

Fields

  • parent::BracketAlgebra{T}: parent object of the bracket algebra element.
  • polynomial::MPolyRingElem{T}: polynomial in parent.R that represents the element.
source

The easiest way to construct bracket algebra elements is to first construct a bracket algebra B and then constructing the elements with B(bracket), where bracket is a vector of point labels of length d(B)+1, as in the following example

julia> B = BracketAlgebra(4, 2, point_labels = ["a","b","c","d"])
Bracket algebra over P^2 on 4 points with point ordering a < b < c < d and coefficient ring Integers.

julia> B(["a","b","c"])
["a", "b", "c"]

You can also generate a bracket algebra element in the same way by providing the indices of the labels.

julia> B = BracketAlgebra(4, 2, point_labels = ["a","b","c","d"])
Bracket algebra over P^2 on 4 points with point ordering a < b < c < d and coefficient ring Integers.

julia> B([1,2,3])
["a", "b", "c"]

Brackets are alternating, therefore

julia> B = BracketAlgebra(4, 2, point_labels = ["a","b","c","d"])
Bracket algebra over P^2 on 4 points with point ordering a < b < c < d and coefficient ring Integers.

julia> B([2,1,3])
 - ["a", "b", "c"]

julia> B([2,2,3])
0

Elements a of the coefficient ring of a bracket algebra B can be coerced into the bracket algebra by calling B(a). B() will construct the zero element of B. zero(B) and one(B) are also implemented to return the zero and one element of B as well as methods for functions iszero(b) and isone(b) to check whether a bracket algebra element is the zero or one element.

julia> B = BracketAlgebra(4, 2)
Bracket algebra over P^2 on 4 points with point ordering 1 < 2 < 3 < 4 and coefficient ring Integers.

julia> B(1)
1

julia> typeof(B(1))
BracketAlgebraElem{BigInt}

julia> B()
0

julia> zero(B)
0

julia> one(B)
1

julia> isone(one(B))
true

julia> iszero(zero(B))
true

Brackets can be added, multiplied and multiplied with elements of the base ring to form more complex bracket expressions. Internally they are stored according to the tableaux ordering, which is also why it is not recommended to change the point ordering of a bracket algebra, which already has existing elements (see point_ordering!).

julia> B = BracketAlgebra(4, 2)
Bracket algebra over P^2 on 4 points with point ordering 1 < 2 < 3 < 4 and coefficient ring Integers.

julia> B([1,2,3])*B([2,3,4]) + 2*B([1,2,4])^2 - B([2,3,4])*B([1,3,4])
 - [2, 3, 4][1, 3, 4] + 2[1, 2, 4]^2 + [2, 3, 4][1, 2, 3]

It is also possible to construct bracket algebra expressions by providing a vector of coefficients and a vector of exponent vectors of an expression.

julia> B = BracketAlgebra(4, 2)
Bracket algebra over P^2 on 4 points with point ordering 1 < 2 < 3 < 4 and coefficient ring Integers.

julia> gens(B)
4-element Vector{BracketAlgebraElem{BigInt}}:
 [2, 3, 4]
 [1, 3, 4]
 [1, 2, 4]
 [1, 2, 3]

julia> B([1,-2], [[1,2,3,4], [1,0,0,1]])
[2, 3, 4][1, 3, 4]^2[1, 2, 4]^3[1, 2, 3]^4 - 2[2, 3, 4][1, 2, 3]

The bracket algebra that a BracketAlgebraElem object b is an element of can be accessed via parent(b)

julia> B = BracketAlgebra(4, 2)
Bracket algebra over P^2 on 4 points with point ordering 1 < 2 < 3 < 4 and coefficient ring Integers.

julia> b = B([1,2,3])
[1, 2, 3]

julia> parent(b) === B
true

Arithmetic operations for bracket algebra elements

For bracket algebra elements the following arithmetic operations are implemented:

julia> B = BracketAlgebra(4,2)
Bracket algebra over P^2 on 4 points with point ordering 1 < 2 < 3 < 4 and coefficient ring Integers.

julia> b1 = B([1,2,3]) * B([1,2,4]) + B([2,3,4])
[1, 2, 4][1, 2, 3] + [2, 3, 4]

julia> b2 = B([1,2,3]) * B([2,3,4])
[2, 3, 4][1, 2, 3]

julia> 2*b1 # multiplication with integers
2[1, 2, 4][1, 2, 3] + 2[2, 3, 4]

julia> -b1 # additive inverse
 - [1, 2, 4][1, 2, 3] - [2, 3, 4]

julia> b1^3 # raising bracket algebra expressions to an integer power
[1, 2, 4]^3[1, 2, 3]^3 + 3[2, 3, 4][1, 2, 4]^2[1, 2, 3]^2 + 3[2, 3, 4]^2[1, 2, 4][1, 2, 3] + [2, 3, 4]^3

julia> b1+b2 # addition of bracket algebra elements
[2, 3, 4][1, 2, 3] + [1, 2, 4][1, 2, 3] + [2, 3, 4]

julia> b1-b2 # subtraction of bracket algebra elements
 - [2, 3, 4][1, 2, 3] + [1, 2, 4][1, 2, 3] + [2, 3, 4]

julia> b1*b2 # multiplication of bracket algebra elements
[2, 3, 4][1, 2, 4][1, 2, 3]^2 + [2, 3, 4]^2[1, 2, 3]

We can also compare representatives of bracket algebra monomials with regards to the tableuaux ordering.

julia> B = BracketAlgebra(4,2)
Bracket algebra over P^2 on 4 points with point ordering 1 < 2 < 3 < 4 and coefficient ring Integers.

julia> b1 = B([1,2,3]) * B([2,3,4])
[2, 3, 4][1, 2, 3]

julia> b2 = B([1,2,3]) * B([1,2,4])
[1, 2, 4][1, 2, 3]

julia> b3 = B([2,3,4])
[2, 3, 4]

julia> b1 < b2
false

julia> b1 > b2
true

julia> b1 > b3
true

Bracket algebra elements as polynomials

We can query information about the chosen representative in $\mathbb{C}[\Lambda]$ of a bracket algebra element as a polynomial. These are implemented as extensions of functions in the AbstractAlgebra.jl package.

julia> B = BracketAlgebra(4,2);

julia> b = B([1,2,3]) * B([2,3,4]) + 2*B([1,3,4]) * B([1,2,3])
[2, 3, 4][1, 2, 3] + 2[1, 3, 4][1, 2, 3]

julia> length(b) # number of terms of b
2

julia> degrees(b) # degree of b in gens(parent(b))
4-element Vector{Int64}:
 1
 1
 0
 1

julia> total_degree(b) # tatal degree of b
2

julia> collect(coefficients(b)) # coefficients of the terms of b in tableaux ordering
2-element Vector{BigInt}:
 1
 2

julia> collect(monomials(b)) # monomials making up the terms of b in tableaux ordering
2-element Vector{BracketAlgebraElem{BigInt}}:
 [2, 3, 4][1, 2, 3]
 [1, 3, 4][1, 2, 3]

julia> collect(terms(b)) # terms of b in tableaux ordering
2-element Vector{BracketAlgebraElem{BigInt}}:
 [2, 3, 4][1, 2, 3]
 2[1, 3, 4][1, 2, 3]

julia> collect(exponent_vectors(b)) # exponent vectors of terms of b in tableaux ordering
2-element Vector{Vector{Int64}}:
 [1, 0, 0, 1]
 [0, 1, 0, 1]

julia> coeff(b, 2) # coefficient of second term
2

julia> coeff(b, [0,1,0,1]) # coefficient of the term with exponent vector [0,1,0,1]
2

julia> monomial(b, 2) # monomial of second term
[1, 3, 4][1, 2, 3]

julia> exponent_vector(b, 2) # exponent vector of second term
4-element Vector{Int64}:
 0
 1
 0
 1

julia> term(b, 2) # second term
2[1, 3, 4][1, 2, 3]

julia> leading_term(b) # leading term of b
[2, 3, 4][1, 2, 3]

julia> leading_monomial(b) # leading monomial of b
[2, 3, 4][1, 2, 3]

julia> leading_coefficient(b) # leading coefficient of b
1
Note

Note that these notions are not well defined for bracket algebra expressions. They are calculated for the chosen representative in $\mathbb{C}[\Lambda]$.

You can evaluate a bracket expression b of a bracket algebra B at a coordinization of the points in homogeneous coordinates. For that provide the coordinization as a $d\times n$ matrix, where the columns correspond to the point coordinates and call evaluate(b, coordinization)

julia> B = BracketAlgebra(4,2);

julia> b = B([2,3,4]) * B([1,2,4])
[2, 3, 4][1, 2, 4]

julia> coordinization = [0 1 0 1; 0 0 1 1]
2×4 Matrix{Int64}:
 0  1  0  1
 0  0  1  1

julia> evaluate(b, coordinization)
-1.0

julia> x = hcat(transpose(coordinization), ones(4,1)) # matrix X as in introduction
4×3 Matrix{Float64}:
 0.0  0.0  1.0
 1.0  0.0  1.0
 0.0  1.0  1.0
 1.0  1.0  1.0

julia> det(x[[2,3,4], :]) * det(x[[1,2,4], :])
-1.0

Straightening

We want to define a normal form for bracket algebra elements. This is achieved by the isomorphism $\mathcal{B}_{n,d} \cong \mathbb{C}[\Lambda]/I$.

Straightening syziges

Let $1\leq s \leq d+1$, $\alpha \in \Lambda(n, s-1)$, $\beta \in \Lambda(n, d+2)$ and $\gamma \in \Lambda(n, d + 1 - s)$. For $\tau = \{\tau_1 < \dots <\tau_s\}\subset \{1, \dots, d+2\}$ let $\tau^\ast = \{1, \dots, d+2\} \setminus \tau = \{\tau^\ast_1 < \dots < \tau^\ast_{d+2-s}}$ and

\[\mathrm{sgn}(\tau*, \tau) = \mathrm{sgn} \begin{pmatrix} 1 & 2 & 3 & \dots & d+2-s & d+2-s+1 & \dots & d+2 \\ \tau^\ast_1 & \tau^\ast_2 & \tau^\ast_3 & \dots & \tau^\ast_{d+2-s} & \tau_1 & \dots & \tau_s \end{pmatrix}.\]

We define the straightening syzige

\[[[\alpha, \dot{\beta}, \gamma]] = \sum_{\tau \in \mathrm{Pot}_s(\underline{d+2})} \mathrm{sgn}(\tau*, \tau) [\alpha_1, \dots, \alpha_{s-1}, \beta_{\tau^\ast_1}, \dots, \beta_{\tau^\ast_{d+2-s}}][\beta_{\tau_1}, \dots, \beta_{\tau_s}, \gamma_1, \dots, \gamma_{d+1-s}] \in \mathbb{C}(\Lambda).\]

The straightening syzige of \alpha, \beta and \gamma in a bracket algebra B can be constructed using the function straightening_syzige

BracketAlgebras.straightening_sizygeFunction
straightening_sizyge(α::Vector{<:Integer}, β::Vector{<:Integer}, γ::Vector{<:Integer}, B::BracketAlgebra)

Return the straightening_sizyge corresponding to α, β, γ as an element of the bracket algebra B. The lenghts of the vectors have to fulfill length(β)==d(B)+2 and length(γ)==d(B)-length(α)

Examples

julia> B = BracketAlgebra(6,2)
Bracket algebra over P^2 on 6 points with point ordering 1 < 2 < 3 < 4 < 5 < 6 and coefficient ring Integers.

julia> α = [1]
1-element Vector{Int64}:
 1

julia> β = [5,6,2,3]
4-element Vector{Int64}:
 5
 6
 2
 3

julia> γ = [4]
1-element Vector{Int64}:
 4

julia> straightening_sizyge(α, β, γ, B)
[2, 3, 4][1, 5, 6] + [2, 4, 5][1, 3, 6] - [2, 4, 6][1, 3, 5] - [3, 4, 5][1, 2, 6] + [3, 4, 6][1, 2, 5] + [4, 5, 6][1, 2, 3]
source

Tabloids

Further we need to introduce the notions of tabloids. Let $[\lambda_1]\dots[lambda_k] \in \mathbb{C}[\Lambda]$ be a monomial, such that $[\lambda_1]\leq \dots \leq [\lambda_k]$. The associated tabloid to the monomial is

\[ \begin{pmatrix} \lambda_1 \\ \vdots \\ \lambda_k \end{pmatrix}.\]

In this package tabloids are objects of the struct Tabloid.

BracketAlgebras.TabloidType
Tabloid

A tabloid with ordered rows.

Fields

-matrix::Matrix{Int}: Matrix representation of the tabloid. -ordering::Vector{Int}: Ordering of the entries of the tabloids. ordering[1] < ordering[2] < ...

source

We can associate a tabloid to a bracket algebra monomial by the tabloid corresponding to its representative. A tabloid is said to be standard, iff its rows are ordered.

BracketAlgebras.standard_violationFunction
standard_violation(t::Tabloid)

Return the index of the first violation to the standardness of the tabloid t, i.e. the first index where t[i,j] > t[i+1, j] with regard to the ordering. Otherwise return nothing.

Examples:

julia> standard_violation(Tabloid([1 2 3; 1 4 5; 1 5 6; 2 3 4], [1,2,3,4,5,6]))
CartesianIndex(3, 2)
julia> standard_violation(Tabloid([1 2 3; 1 2 4], [1,2,3,4]))
source
standard_violation(b::BracketAlgebraElem)

Return the index of the first standard violation of the tabloid corresponding to b.

source

The straightening algorithm

It can be shown that the straightening syziges form a Groebner basis of the Ideal $I$ with $\mathcal{B}_{n,d} \cong \mathbb{C}[\Lambda]/I$ with regards to the tablueax order. The result of the reduction of an element with this Groebner basis will lead to a representative, in which the tabloid corresponding to each term is standard. This Groebner basis reduction is called the straightening algorithm. It can be performed by iteratively adding appropriate multiples of straightening syziges to the representative until the tabloids corresponding to all monomials in the expression are standard. Let

\[\begin{pmatrix} \lambda_{1,1}& \dots & \lambda_{1, d+1}\\ &\vdots \\ \lambda_{k,1} & \dots & \lambda_{k, d+1} \end{pmatrix}\]

be a non standard tabloid corresponding to a term in a bracket algebra element $b$. Let $(r,s)$ be the first index, where the tabloid is not standard, meaning $\lambda_{r,s} > \lambda_{r+1,s}$. Let $\alpha = [\lambda_{r,1}, \dots, \lambda_{r, s-1}]$, $\beta = [\lambda_{r, s}, \dots, \lambda_{r, d+1}, \lambda_{r+1, 1}, \dots, \lambda_{r+1, s-1}]$, $\gamma = [\lambda_{r+1, s}, \dots, \lambda_{r+1, d+1}]$, then $b = b - [\lambda_{1,1}, \dots, \lambda_{1, d+1}]\dots [\lambda_{r-1, 1}, \dots, \lambda_{r-1, d+1}] [\lambda_{r+2,1}, \dots, \lambda_{r+2, d+1}]\dots [\lambda_{k,1}, \dots, \lambda_{k, d+1}] [[\alpha\dot{\beta}\gamma]] \in \mathcal{B}_{n,d}$, but the violation to the standardness occurs later in the tabloid of the adjusted term. Therefore the straightening algorithm terminates and returns a representative, where every term is standard.

BracketAlgebras.straightenFunction
straighten(b::BracketAlgebraElem)

Perform the straightening algorithm on the bracket algebra element b as in Stutrmfels 2008, Alg. 3.5.6. The straightening algorithm performs the groebner reduction of the bracket algebra element b with the straightening sizyges as a Groebner basis. The result is a normal form of b in which every term is standard. See also straightening_sizyge, standard_violation, is_standard.

Examples

julia> B = BracketAlgebra(6, 2)
Bracket algebra over P^2 on 6 points with point ordering 1 < 2 < 3 < 4 < 5 < 6 and coefficient ring Integers.

julia> b = B([1,4,5])*B([1,5,6])*B([2,3,4])
[2, 3, 4][1, 5, 6][1, 4, 5]

julia> straighten(b)
[2, 5, 6][1, 4, 5][1, 3, 4] - [3, 5, 6][1, 4, 5][1, 2, 4] + [4, 5, 6][1, 4, 5][1, 2, 3]
source

The straightening algorithm makes it possible to decide if two elements are equal as by basic Groebner basis results two elements of a bracket algebra are equal if and only if their representative after Groebner basis reduction (after straightening in the case of bracket algebras) are equal.

julia> B = BracketAlgebra(6,2)
Bracket algebra over P^2 on 6 points with point ordering 1 < 2 < 3 < 4 < 5 < 6 and coefficient ring Integers.

julia> α = [1,2]
2-element Vector{Int64}:
 1
 2

julia> β = [2,3,4,5]
4-element Vector{Int64}:
 2
 3
 4
 5

julia> γ = Int[]
Int64[]

julia> straighten(straightening_sizyge(α, β, γ, B))
0

julia> straightening_sizyge(α, β, γ, B) == zero(B)
true

julia> b = B([1,4,5])*B([1,5,6])*B([2,3,4])
[2, 3, 4][1, 5, 6][1, 4, 5]

julia> straighten(b)
[2, 5, 6][1, 4, 5][1, 3, 4] - [3, 5, 6][1, 4, 5][1, 2, 4] + [4, 5, 6][1, 4, 5][1, 2, 3]

julia> b + B([2,3,4]) * straightening_sizyge(α, β, γ, B)
[2, 3, 4][1, 5, 6][1, 4, 5] - [2, 3, 4]^2[1, 2, 5] + [2, 3, 5][2, 3, 4][1, 2, 4] - [2, 4, 5][2, 3, 4][1, 2, 3]

julia> straighten(b + B([2,3,4]) * straightening_sizyge(α, β, γ, B))
[2, 5, 6][1, 4, 5][1, 3, 4] - [3, 5, 6][1, 4, 5][1, 2, 4] + [4, 5, 6][1, 4, 5][1, 2, 3]

julia> b == b + B([2,3,4]) * straightening_sizyge(α, β, γ, B)
true

Atomic extensors

BracketAlgebras.atomic_extensorsFunction
atomic_extensors(b::BracketAlgebraElem)

Find all atomic extensors of the bracket algebra elem b. These are the equivalence classes of the relation p1 ~ p2 iff substituting p1 = p2 in b results in the zero element of the parent bracket algebra.

Examples

```jldoctest

source