Down-Up Algebras

AUTHORS:

  • Travis Scrimshaw (2023-4): initial version

class sage.algebras.down_up_algebra.DownUpAlgebra(alpha, beta, gamma, base_ring)[source]

Bases: CombinatorialFreeModule

The down-up algebra.

Let R be a commutative ring, and let α,β,γR. The down-up algebra is the associative unital algebra DU(α,β,γ) generated by d,u with relations

d2u=αdud+βud2+γd,du2=αudu+βu2d+γu.

The down-up algebra has a PBW-type basis given by

{ui(du)jdki,j,kZ0}.

This algebra originates in the study of posets. For a poset P, we define operators acting on R[P] by

d(y)=xxu(y)=zz,

where y covers x and z covers y. For r-differential posets we have duud=r1, and thus it affords a representation of a Weyl algebra. This Weyl algebra is obtained as the quotient of DU(0,1,2r) by the ideal generated by duudr. For a (q,r)-differential poset, we have the d and u operators satisfying

d2u=q(q+1)dudq3ud2+rd,du2=q(q+1)uduq3u2d+ru,

or α=q(q+1), β=q3, and γ=r. Specializing q=1 recovers the r-differential poset relation.

Two other noteworthy quotients are:

  • the q-Weyl algebra from DU(0,q2,q+1) by the ideal generated by duqud1, and

  • the quantum plane Rq[d,u], where du=qud, from DU(2q,q2,0) by the ideal generated by duqud.

EXAMPLES:

We begin by constructing the down-up algebra and perform some basic computations:

sage: R.<a,b,g> = QQ[]
sage: DU = algebras.DownUp(a, b, g)
sage: d, u = DU.gens()
sage: d * u
(d*u)
sage: u * d
u*d
sage: d^2 * u
b*u*d^2 + a*(d*u)*d + g*d
sage: d * u^2
b*u^2*d + a*u*(d*u) + g*u
>>> from sage.all import *
>>> R = QQ['a, b, g']; (a, b, g,) = R._first_ngens(3)
>>> DU = algebras.DownUp(a, b, g)
>>> d, u = DU.gens()
>>> d * u
(d*u)
>>> u * d
u*d
>>> d**Integer(2) * u
b*u*d^2 + a*(d*u)*d + g*d
>>> d * u**Integer(2)
b*u^2*d + a*u*(d*u) + g*u
R.<a,b,g> = QQ[]
DU = algebras.DownUp(a, b, g)
d, u = DU.gens()
d * u
u * d
d^2 * u
d * u^2

We verify some examples of Proposition 3.5 in [BR1998], which states that the 0-th degree part is commutative:

sage: DU0 = [u^i * (d*u)^j * d^i for i,j in
....:        cartesian_product([range(3), range(3)])]
sage: all(x.degree() == 0 for x in DU0)
True
sage: all(x * y == y * x for x, y in cartesian_product([DU0, DU0]))
True
>>> from sage.all import *
>>> DU0 = [u**i * (d*u)**j * d**i for i,j in
...        cartesian_product([range(Integer(3)), range(Integer(3))])]
>>> all(x.degree() == Integer(0) for x in DU0)
True
>>> all(x * y == y * x for x, y in cartesian_product([DU0, DU0]))
True
DU0 = [u^i * (d*u)^j * d^i for i,j in
       cartesian_product([range(3), range(3)])]
all(x.degree() == 0 for x in DU0)
all(x * y == y * x for x, y in cartesian_product([DU0, DU0]))

We verify that DU(2,1,γ) can be described as the universal enveloping algebra of the 3-dimensional Lie algebra spanned by x,y,z satisfying z=[x,y], [x,z]=γx, and [z,y]=γy:

sage: R.<g> = QQ[]
sage: L = LieAlgebra(R, {('x','y'): {'z': 1}, ('x','z'): {'x': g}, ('z','y'): {'y': g}},
....:                names='x,y,z')
sage: x, y, z = L.basis()
sage: (L[x, y], L[x, z], L[z, y])
(z, g*x, g*y)
sage: x, y, z = L.pbw_basis().gens()
sage: x^2*y - 2*x*y*x + y*x^2 == g*x
True
sage: x*y^2 - 2*y*x*y + y^2*x == g*y
True
sage: DU = algebras.DownUp(2, -1, g)
sage: d, u = DU.gens()
sage: d^2*u - 2*d*u*d + u*d^2 == g*d
True
sage: d*u^2 - 2*u*d*u + u^2*d == g*u
True
>>> from sage.all import *
>>> R = QQ['g']; (g,) = R._first_ngens(1)
>>> L = LieAlgebra(R, {('x','y'): {'z': Integer(1)}, ('x','z'): {'x': g}, ('z','y'): {'y': g}},
...                names='x,y,z')
>>> x, y, z = L.basis()
>>> (L[x, y], L[x, z], L[z, y])
(z, g*x, g*y)
>>> x, y, z = L.pbw_basis().gens()
>>> x**Integer(2)*y - Integer(2)*x*y*x + y*x**Integer(2) == g*x
True
>>> x*y**Integer(2) - Integer(2)*y*x*y + y**Integer(2)*x == g*y
True
>>> DU = algebras.DownUp(Integer(2), -Integer(1), g)
>>> d, u = DU.gens()
>>> d**Integer(2)*u - Integer(2)*d*u*d + u*d**Integer(2) == g*d
True
>>> d*u**Integer(2) - Integer(2)*u*d*u + u**Integer(2)*d == g*u
True
R.<g> = QQ[]
L = LieAlgebra(R, {('x','y'): {'z': 1}, ('x','z'): {'x': g}, ('z','y'): {'y': g}},
               names='x,y,z')
x, y, z = L.basis()
(L[x, y], L[x, z], L[z, y])
x, y, z = L.pbw_basis().gens()
x^2*y - 2*x*y*x + y*x^2 == g*x
x*y^2 - 2*y*x*y + y^2*x == g*y
DU = algebras.DownUp(2, -1, g)
d, u = DU.gens()
d^2*u - 2*d*u*d + u*d^2 == g*d
d*u^2 - 2*u*d*u + u^2*d == g*u

Young’s lattice is known to be a differential poset. Thus we can construct a representation of DU(0,1,2) on this poset (which gives a proof that Fomin’s growth diagrams are equivalent to edge local rules or shadow lines construction for RSK()):

sage: DU = algebras.DownUp(0, 1, 2)
sage: d, u = DU.gens()
sage: d^2*u == 0*d*u*d + 1*u*d*d + 2*d
True
sage: d*u^2 == 0*u*d*u + 1*u*u*d + 2*u
True

sage: YL = CombinatorialFreeModule(DU.base_ring(), Partitions())
sage: def d_action(la):
....:     return YL.sum_of_monomials(la.remove_cell(*c) for c in la.removable_cells())
sage: def u_action(la):
....:     return YL.sum_of_monomials(la.add_cell(*c) for c in la.addable_cells())
sage: D = YL.module_morphism(on_basis=d_action, codomain=YL)
sage: U = YL.module_morphism(on_basis=u_action, codomain=YL)
sage: for la in PartitionsInBox(5, 5):
....:     b = YL.basis()[la]
....:     assert (D*D*U)(b) == 0*(D*U*D)(b) + 1*(U*D*D)(b) + 2*D(b)
....:     assert (D*U*U)(b) == 0*(U*D*U)(la) + 1*(U*U*D)(b) + 2*U(b)
....:     assert (D*U)(b) == (U*D)(b) + b  # the Weyl algebra relation
>>> from sage.all import *
>>> DU = algebras.DownUp(Integer(0), Integer(1), Integer(2))
>>> d, u = DU.gens()
>>> d**Integer(2)*u == Integer(0)*d*u*d + Integer(1)*u*d*d + Integer(2)*d
True
>>> d*u**Integer(2) == Integer(0)*u*d*u + Integer(1)*u*u*d + Integer(2)*u
True

>>> YL = CombinatorialFreeModule(DU.base_ring(), Partitions())
>>> def d_action(la):
...     return YL.sum_of_monomials(la.remove_cell(*c) for c in la.removable_cells())
>>> def u_action(la):
...     return YL.sum_of_monomials(la.add_cell(*c) for c in la.addable_cells())
>>> D = YL.module_morphism(on_basis=d_action, codomain=YL)
>>> U = YL.module_morphism(on_basis=u_action, codomain=YL)
>>> for la in PartitionsInBox(Integer(5), Integer(5)):
...     b = YL.basis()[la]
...     assert (D*D*U)(b) == Integer(0)*(D*U*D)(b) + Integer(1)*(U*D*D)(b) + Integer(2)*D(b)
...     assert (D*U*U)(b) == Integer(0)*(U*D*U)(la) + Integer(1)*(U*U*D)(b) + Integer(2)*U(b)
...     assert (D*U)(b) == (U*D)(b) + b  # the Weyl algebra relation
DU = algebras.DownUp(0, 1, 2)
d, u = DU.gens()
d^2*u == 0*d*u*d + 1*u*d*d + 2*d
d*u^2 == 0*u*d*u + 1*u*u*d + 2*u
YL = CombinatorialFreeModule(DU.base_ring(), Partitions())
def d_action(la):
    return YL.sum_of_monomials(la.remove_cell(*c) for c in la.removable_cells())
def u_action(la):
    return YL.sum_of_monomials(la.add_cell(*c) for c in la.addable_cells())
D = YL.module_morphism(on_basis=d_action, codomain=YL)
U = YL.module_morphism(on_basis=u_action, codomain=YL)
for la in PartitionsInBox(5, 5):
    b = YL.basis()[la]
    assert (D*D*U)(b) == 0*(D*U*D)(b) + 1*(U*D*D)(b) + 2*D(b)
    assert (D*U*U)(b) == 0*(U*D*U)(la) + 1*(U*U*D)(b) + 2*U(b)
    assert (D*U)(b) == (U*D)(b) + b  # the Weyl algebra relation

Todo

Implement the homogenized version.

REFERENCES:

algebra_generators()[source]

Return the algebra generators of self.

EXAMPLES:

sage: DU = algebras.DownUp(2, 3, 4)
sage: dict(DU.algebra_generators())
{'d': d, 'u': u}
>>> from sage.all import *
>>> DU = algebras.DownUp(Integer(2), Integer(3), Integer(4))
>>> dict(DU.algebra_generators())
{'d': d, 'u': u}
DU = algebras.DownUp(2, 3, 4)
dict(DU.algebra_generators())
degree_on_basis(m)[source]

Return the degree of the basis element indexed by m.

EXAMPLES:

sage: R.<a,b,g> = QQ[]
sage: DU = algebras.DownUp(a, b, g)
sage: I = DU.indices()
sage: DU.degree_on_basis(I([0, 3, 2]))
-2
sage: DU.degree_on_basis(I([2, 3, 0]))
2
sage: DU.degree_on_basis(I([2, 0, 3]))
-1
sage: DU.degree_on_basis(I([3, 10, 3]))
0
>>> from sage.all import *
>>> R = QQ['a, b, g']; (a, b, g,) = R._first_ngens(3)
>>> DU = algebras.DownUp(a, b, g)
>>> I = DU.indices()
>>> DU.degree_on_basis(I([Integer(0), Integer(3), Integer(2)]))
-2
>>> DU.degree_on_basis(I([Integer(2), Integer(3), Integer(0)]))
2
>>> DU.degree_on_basis(I([Integer(2), Integer(0), Integer(3)]))
-1
>>> DU.degree_on_basis(I([Integer(3), Integer(10), Integer(3)]))
0
R.<a,b,g> = QQ[]
DU = algebras.DownUp(a, b, g)
I = DU.indices()
DU.degree_on_basis(I([0, 3, 2]))
DU.degree_on_basis(I([2, 3, 0]))
DU.degree_on_basis(I([2, 0, 3]))
DU.degree_on_basis(I([3, 10, 3]))
gens()[source]

Return the generators of self.

EXAMPLES:

sage: DU = algebras.DownUp(2, 3, 4)
sage: DU.gens()
(d, u)
>>> from sage.all import *
>>> DU = algebras.DownUp(Integer(2), Integer(3), Integer(4))
>>> DU.gens()
(d, u)
DU = algebras.DownUp(2, 3, 4)
DU.gens()
one_basis()[source]

Return the index of the basis element of 1.

EXAMPLES:

sage: DU = algebras.DownUp(2, 3, 4)
sage: DU.one_basis()
(0, 0, 0)
>>> from sage.all import *
>>> DU = algebras.DownUp(Integer(2), Integer(3), Integer(4))
>>> DU.one_basis()
(0, 0, 0)
DU = algebras.DownUp(2, 3, 4)
DU.one_basis()
product_on_basis(m1, m2)[source]

Return the product of the basis elements indexed by m1 and m2.

EXAMPLES:

sage: R.<a,b,g> = QQ[]
sage: DU = algebras.DownUp(a, b, g)
sage: I = DU.indices()
sage: DU.product_on_basis(I([2,0,0]), I([4,0,0]))
u^6
sage: DU.product_on_basis(I([2,0,0]), I([0,4,0]))
u^2*(d*u)^4
sage: DU.product_on_basis(I([2,0,0]), I([0,0,4]))
u^2*d^4
sage: DU.product_on_basis(I([0,2,0]), I([0,4,0]))
(d*u)^6
sage: DU.product_on_basis(I([0,2,0]), I([0,0,4]))
(d*u)^2*d^4
sage: DU.product_on_basis(I([0,0,2]), I([0,0,4]))
d^6
sage: DU.product_on_basis(I([5,3,1]), I([1,0,4]))
u^5*(d*u)^4*d^4

sage: DU.product_on_basis(I([0,1,0]), I([1,0,0]))
b*u^2*d + a*u*(d*u) + g*u
sage: DU.product_on_basis(I([0,0,2]), I([1,0,0]))
b*u*d^2 + a*(d*u)*d + g*d
sage: DU.product_on_basis(I([0,0,1]), I([2,0,0]))
b*u^2*d + a*u*(d*u) + g*u
sage: DU.product_on_basis(I([0,0,1]), I([0,1,0]))
b*u*d^2 + a*(d*u)*d + g*d

sage: DU.product_on_basis(I([0,1,0]), I([3,0,0]))
(a^2*b+b^2)*u^4*d + (a^3+2*a*b)*u^3*(d*u) + (a^2*g+a*g+b*g+g)*u^3
sage: DU.product_on_basis(I([1,1,3]), I([0,1,1]))
(a^2*b^2+b^3)*u^3*d^6 + (a^3*b+a*b^2)*u^2*(d*u)*d^5 + (a^2*b*g+b^2*g)*u^2*d^5
 + (a^3+2*a*b)*u*(d*u)^2*d^4 + (a^2*g+a*g+b*g+g)*u*(d*u)*d^4
>>> from sage.all import *
>>> R = QQ['a, b, g']; (a, b, g,) = R._first_ngens(3)
>>> DU = algebras.DownUp(a, b, g)
>>> I = DU.indices()
>>> DU.product_on_basis(I([Integer(2),Integer(0),Integer(0)]), I([Integer(4),Integer(0),Integer(0)]))
u^6
>>> DU.product_on_basis(I([Integer(2),Integer(0),Integer(0)]), I([Integer(0),Integer(4),Integer(0)]))
u^2*(d*u)^4
>>> DU.product_on_basis(I([Integer(2),Integer(0),Integer(0)]), I([Integer(0),Integer(0),Integer(4)]))
u^2*d^4
>>> DU.product_on_basis(I([Integer(0),Integer(2),Integer(0)]), I([Integer(0),Integer(4),Integer(0)]))
(d*u)^6
>>> DU.product_on_basis(I([Integer(0),Integer(2),Integer(0)]), I([Integer(0),Integer(0),Integer(4)]))
(d*u)^2*d^4
>>> DU.product_on_basis(I([Integer(0),Integer(0),Integer(2)]), I([Integer(0),Integer(0),Integer(4)]))
d^6
>>> DU.product_on_basis(I([Integer(5),Integer(3),Integer(1)]), I([Integer(1),Integer(0),Integer(4)]))
u^5*(d*u)^4*d^4

>>> DU.product_on_basis(I([Integer(0),Integer(1),Integer(0)]), I([Integer(1),Integer(0),Integer(0)]))
b*u^2*d + a*u*(d*u) + g*u
>>> DU.product_on_basis(I([Integer(0),Integer(0),Integer(2)]), I([Integer(1),Integer(0),Integer(0)]))
b*u*d^2 + a*(d*u)*d + g*d
>>> DU.product_on_basis(I([Integer(0),Integer(0),Integer(1)]), I([Integer(2),Integer(0),Integer(0)]))
b*u^2*d + a*u*(d*u) + g*u
>>> DU.product_on_basis(I([Integer(0),Integer(0),Integer(1)]), I([Integer(0),Integer(1),Integer(0)]))
b*u*d^2 + a*(d*u)*d + g*d

>>> DU.product_on_basis(I([Integer(0),Integer(1),Integer(0)]), I([Integer(3),Integer(0),Integer(0)]))
(a^2*b+b^2)*u^4*d + (a^3+2*a*b)*u^3*(d*u) + (a^2*g+a*g+b*g+g)*u^3
>>> DU.product_on_basis(I([Integer(1),Integer(1),Integer(3)]), I([Integer(0),Integer(1),Integer(1)]))
(a^2*b^2+b^3)*u^3*d^6 + (a^3*b+a*b^2)*u^2*(d*u)*d^5 + (a^2*b*g+b^2*g)*u^2*d^5
 + (a^3+2*a*b)*u*(d*u)^2*d^4 + (a^2*g+a*g+b*g+g)*u*(d*u)*d^4
R.<a,b,g> = QQ[]
DU = algebras.DownUp(a, b, g)
I = DU.indices()
DU.product_on_basis(I([2,0,0]), I([4,0,0]))
DU.product_on_basis(I([2,0,0]), I([0,4,0]))
DU.product_on_basis(I([2,0,0]), I([0,0,4]))
DU.product_on_basis(I([0,2,0]), I([0,4,0]))
DU.product_on_basis(I([0,2,0]), I([0,0,4]))
DU.product_on_basis(I([0,0,2]), I([0,0,4]))
DU.product_on_basis(I([5,3,1]), I([1,0,4]))
DU.product_on_basis(I([0,1,0]), I([1,0,0]))
DU.product_on_basis(I([0,0,2]), I([1,0,0]))
DU.product_on_basis(I([0,0,1]), I([2,0,0]))
DU.product_on_basis(I([0,0,1]), I([0,1,0]))
DU.product_on_basis(I([0,1,0]), I([3,0,0]))
DU.product_on_basis(I([1,1,3]), I([0,1,1]))
verma_module(la)[source]

Return the Verma module V(λ) of self.

EXAMPLES:

sage: R.<a,b,g> = QQ[]
sage: DU = algebras.DownUp(a, b, g)
sage: DU.verma_module(5)
Verma module of weight 5 of Down-Up algebra with parameters (a, b, g)
 over Multivariate Polynomial Ring in a, b, g over Rational Field
>>> from sage.all import *
>>> R = QQ['a, b, g']; (a, b, g,) = R._first_ngens(3)
>>> DU = algebras.DownUp(a, b, g)
>>> DU.verma_module(Integer(5))
Verma module of weight 5 of Down-Up algebra with parameters (a, b, g)
 over Multivariate Polynomial Ring in a, b, g over Rational Field
R.<a,b,g> = QQ[]
DU = algebras.DownUp(a, b, g)
DU.verma_module(5)
class sage.algebras.down_up_algebra.VermaModule(DU, la)[source]

Bases: CombinatorialFreeModule

The Verma module V(λ) of a down-up algebra.

The Verma module V(λ) for the down-up algebra generated by d,u is the span of {vnnZ0} satisfying the relations

dvn=λn1vn1,uvn=vn+1,

where λn=αλn1+βλn2+γ and we set λ0=λ and λ1=0.

By Proposition 2.4 in [BR1998], V(λ) is simple if and only if λn0 for all n0. Moreover, a maximal submodule is spanned by {vnn>m}, where m is the minimal index such that λm=0. Moreover, this is unique unless γ=λ=0.

EXAMPLES:

sage: R.<a,b> = QQ[]
sage: DU = algebras.DownUp(0, b, 1)
sage: d, u = DU.gens()
sage: V = DU.verma_module(a)
sage: list(V.weights()[:6])
[a, 1, a*b + 1, b + 1, a*b^2 + b + 1, b^2 + b + 1]
sage: v = V.basis()
sage: d^2 * v[2]
a*v[0]
sage: d * (d * v[2])
a*v[0]
>>> from sage.all import *
>>> R = QQ['a, b']; (a, b,) = R._first_ngens(2)
>>> DU = algebras.DownUp(Integer(0), b, Integer(1))
>>> d, u = DU.gens()
>>> V = DU.verma_module(a)
>>> list(V.weights()[:Integer(6)])
[a, 1, a*b + 1, b + 1, a*b^2 + b + 1, b^2 + b + 1]
>>> v = V.basis()
>>> d**Integer(2) * v[Integer(2)]
a*v[0]
>>> d * (d * v[Integer(2)])
a*v[0]
R.<a,b> = QQ[]
DU = algebras.DownUp(0, b, 1)
d, u = DU.gens()
V = DU.verma_module(a)
list(V.weights()[:6])
v = V.basis()
d^2 * v[2]
d * (d * v[2])

The weight is computed by looking at the scalars associated to the action of du and ud:

sage: d*u * v[3]
(b+1)*v[3]
sage: u*d * v[3]
(a*b+1)*v[3]
sage: v[3].weight()
(b + 1, a*b + 1)
>>> from sage.all import *
>>> d*u * v[Integer(3)]
(b+1)*v[3]
>>> u*d * v[Integer(3)]
(a*b+1)*v[3]
>>> v[Integer(3)].weight()
(b + 1, a*b + 1)
d*u * v[3]
u*d * v[3]
v[3].weight()

An U(sl2) example:

sage: DU = algebras.DownUp(2, -1, -2)
sage: d, u = DU.gens()
sage: V = DU.verma_module(5)
sage: list(V.weights()[:10])
[5, 8, 9, 8, 5, 0, -7, -16, -27, -40]
sage: v6 = V.basis()[6]
sage: d * v6
0
sage: [V.basis()[i].weight() for i in range(6)]
[(5, 0), (8, 5), (9, 8), (8, 9), (5, 8), (0, 5)]
>>> from sage.all import *
>>> DU = algebras.DownUp(Integer(2), -Integer(1), -Integer(2))
>>> d, u = DU.gens()
>>> V = DU.verma_module(Integer(5))
>>> list(V.weights()[:Integer(10)])
[5, 8, 9, 8, 5, 0, -7, -16, -27, -40]
>>> v6 = V.basis()[Integer(6)]
>>> d * v6
0
>>> [V.basis()[i].weight() for i in range(Integer(6))]
[(5, 0), (8, 5), (9, 8), (8, 9), (5, 8), (0, 5)]
DU = algebras.DownUp(2, -1, -2)
d, u = DU.gens()
V = DU.verma_module(5)
list(V.weights()[:10])
v6 = V.basis()[6]
d * v6
[V.basis()[i].weight() for i in range(6)]

Note that these are the same sl2 weights from the usual construction of the irreducible representation V(5) (but they are different as gl2 weights):

sage: B = crystals.Tableaux(['A',1], shape=[5])                                 # needs sage.graphs
sage: [b.weight() for b in B]                                                   # needs sage.graphs
[(5, 0), (4, 1), (3, 2), (2, 3), (1, 4), (0, 5)]
>>> from sage.all import *
>>> B = crystals.Tableaux(['A',Integer(1)], shape=[Integer(5)])                                 # needs sage.graphs
>>> [b.weight() for b in B]                                                   # needs sage.graphs
[(5, 0), (4, 1), (3, 2), (2, 3), (1, 4), (0, 5)]
B = crystals.Tableaux(['A',1], shape=[5])                                 # needs sage.graphs
[b.weight() for b in B]                                                   # needs sage.graphs

An example with periodic weights (see Theorem 2.13 of [BR1998]):

sage: # needs sage.rings.number_field
sage: k.<z6> = CyclotomicField(6)
sage: al = z6 + 1
sage: (al - 1)^6 == 1
True
sage: DU = algebras.DownUp(al, 1-al, 0)
sage: V = DU.verma_module(5)
sage: list(V.weights()[:8])
[5, 5*z6 + 5, 10*z6, 10*z6 - 5, 5*z6 - 5, 0, 5, 5*z6 + 5]
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> k = CyclotomicField(Integer(6), names=('z6',)); (z6,) = k._first_ngens(1)
>>> al = z6 + Integer(1)
>>> (al - Integer(1))**Integer(6) == Integer(1)
True
>>> DU = algebras.DownUp(al, Integer(1)-al, Integer(0))
>>> V = DU.verma_module(Integer(5))
>>> list(V.weights()[:Integer(8)])
[5, 5*z6 + 5, 10*z6, 10*z6 - 5, 5*z6 - 5, 0, 5, 5*z6 + 5]
# needs sage.rings.number_field
k.<z6> = CyclotomicField(6)
al = z6 + 1
(al - 1)^6 == 1
DU = algebras.DownUp(al, 1-al, 0)
V = DU.verma_module(5)
list(V.weights()[:8])
class Element[source]

Bases: IndexedFreeModuleElement

An element of a Verma module of a down-up algebra.

is_weight_vector()[source]

Return if self is a weight vector.

EXAMPLES:

sage: DU = algebras.DownUp(2, -1, -2)
sage: V = DU.verma_module(5)
sage: V.zero().is_weight_vector()
False
sage: B = V.basis()
sage: [B[i].weight() for i in range(6)]
[(5, 0), (8, 5), (9, 8), (8, 9), (5, 8), (0, 5)]
sage: B[5].is_weight_vector()
True
sage: v = B[0] + B[1]
sage: v.is_weight_vector()
False

sage: DU = algebras.DownUp(2, -1, 0)
sage: V = DU.verma_module(0)
sage: B = V.basis()
sage: v = sum(i*B[i] for i in range(1,5))
sage: v.is_weight_vector()
True
>>> from sage.all import *
>>> DU = algebras.DownUp(Integer(2), -Integer(1), -Integer(2))
>>> V = DU.verma_module(Integer(5))
>>> V.zero().is_weight_vector()
False
>>> B = V.basis()
>>> [B[i].weight() for i in range(Integer(6))]
[(5, 0), (8, 5), (9, 8), (8, 9), (5, 8), (0, 5)]
>>> B[Integer(5)].is_weight_vector()
True
>>> v = B[Integer(0)] + B[Integer(1)]
>>> v.is_weight_vector()
False

>>> DU = algebras.DownUp(Integer(2), -Integer(1), Integer(0))
>>> V = DU.verma_module(Integer(0))
>>> B = V.basis()
>>> v = sum(i*B[i] for i in range(Integer(1),Integer(5)))
>>> v.is_weight_vector()
True
DU = algebras.DownUp(2, -1, -2)
V = DU.verma_module(5)
V.zero().is_weight_vector()
B = V.basis()
[B[i].weight() for i in range(6)]
B[5].is_weight_vector()
v = B[0] + B[1]
v.is_weight_vector()
DU = algebras.DownUp(2, -1, 0)
V = DU.verma_module(0)
B = V.basis()
v = sum(i*B[i] for i in range(1,5))
v.is_weight_vector()
weight()[source]

Return the weight of self.

For vn, this is the vector with the pair (λn,λn1).

EXAMPLES:

sage: R.<a,b,g> = QQ[]
sage: DU = algebras.DownUp(a, b, g)
sage: V = DU.verma_module(5)
sage: B = V.basis()
sage: B[0].weight()
(5, 0)
sage: B[1].weight()
(5*a + g, 5)
sage: B[2].weight()
(5*a^2 + a*g + 5*b + g, 5*a + g)

sage: V.zero().weight()
Traceback (most recent call last):
...
ValueError: the zero element does not have well-defined weight
sage: (B[0] + B[1]).weight()
Traceback (most recent call last):
...
ValueError: not a weight vector
>>> from sage.all import *
>>> R = QQ['a, b, g']; (a, b, g,) = R._first_ngens(3)
>>> DU = algebras.DownUp(a, b, g)
>>> V = DU.verma_module(Integer(5))
>>> B = V.basis()
>>> B[Integer(0)].weight()
(5, 0)
>>> B[Integer(1)].weight()
(5*a + g, 5)
>>> B[Integer(2)].weight()
(5*a^2 + a*g + 5*b + g, 5*a + g)

>>> V.zero().weight()
Traceback (most recent call last):
...
ValueError: the zero element does not have well-defined weight
>>> (B[Integer(0)] + B[Integer(1)]).weight()
Traceback (most recent call last):
...
ValueError: not a weight vector
R.<a,b,g> = QQ[]
DU = algebras.DownUp(a, b, g)
V = DU.verma_module(5)
B = V.basis()
B[0].weight()
B[1].weight()
B[2].weight()
V.zero().weight()
(B[0] + B[1]).weight()
highest_weight_vector()[source]

Return the highest weight vector of self that generates self as a down-up module.

EXAMPLES:

sage: DU = algebras.DownUp(1, 2, 3)
sage: V = DU.verma_module(5)
sage: V.highest_weight_vector()
v[0]
>>> from sage.all import *
>>> DU = algebras.DownUp(Integer(1), Integer(2), Integer(3))
>>> V = DU.verma_module(Integer(5))
>>> V.highest_weight_vector()
v[0]
DU = algebras.DownUp(1, 2, 3)
V = DU.verma_module(5)
V.highest_weight_vector()
weights()[source]

Return the sequence of weights (λn)n=0.

EXAMPLES:

sage: R.<a,b,g> = QQ[]
sage: DU = algebras.DownUp(a, b, g)
sage: V = DU.verma_module(5)
sage: V.weights()
lazy list [5, 5*a + g, 5*a^2 + a*g + 5*b + g, ...]

sage: V = DU.verma_module(0)
sage: DU = algebras.DownUp(a, 1-a, 0)
sage: V = DU.verma_module(0)
sage: V.weights()
lazy list [0, 0, 0, ...]
>>> from sage.all import *
>>> R = QQ['a, b, g']; (a, b, g,) = R._first_ngens(3)
>>> DU = algebras.DownUp(a, b, g)
>>> V = DU.verma_module(Integer(5))
>>> V.weights()
lazy list [5, 5*a + g, 5*a^2 + a*g + 5*b + g, ...]

>>> V = DU.verma_module(Integer(0))
>>> DU = algebras.DownUp(a, Integer(1)-a, Integer(0))
>>> V = DU.verma_module(Integer(0))
>>> V.weights()
lazy list [0, 0, 0, ...]
R.<a,b,g> = QQ[]
DU = algebras.DownUp(a, b, g)
V = DU.verma_module(5)
V.weights()
V = DU.verma_module(0)
DU = algebras.DownUp(a, 1-a, 0)
V = DU.verma_module(0)
V.weights()

We reproduce the Fibonacci numbers example from [BR1998]:

sage: R.<la> = QQ[]
sage: DU = algebras.DownUp(1, 1, 0, R)
sage: V = DU.verma_module(la)
sage: list(V.weights()[:11])
[la, la, 2*la, 3*la, 5*la, 8*la, 13*la, 21*la, 34*la, 55*la, 89*la]
>>> from sage.all import *
>>> R = QQ['la']; (la,) = R._first_ngens(1)
>>> DU = algebras.DownUp(Integer(1), Integer(1), Integer(0), R)
>>> V = DU.verma_module(la)
>>> list(V.weights()[:Integer(11)])
[la, la, 2*la, 3*la, 5*la, 8*la, 13*la, 21*la, 34*la, 55*la, 89*la]
R.<la> = QQ[]
DU = algebras.DownUp(1, 1, 0, R)
V = DU.verma_module(la)
list(V.weights()[:11])