Abreu-Nigro symmetric functions

class sage.combinat.sf.abreu_nigro.SymmetricFunctionAlgebra_AbreuNigro(Sym, q)[source]

Bases: SymmetricFunctionAlgebra_multiplicative

The Abreu-Nigro (symmetric function) basis.

The Abreu-Nigro basis \(\{\rho_{\lambda}(x; q)\}_{\lambda}\) is the multiplicative basis defined by

\[[n]_q h_n(x) = \sum_{i=1}^n h_{n-i}(x) \rho_i(x; q), \qquad\qquad \rho_{\lambda}(x; q) = \rho_{\lambda_1}(x; q) \rho_{\lambda_2}(x; q) \cdots \rho_{\lambda_{\ell}}(x; q).\]

Here \([n]_q = 1 + q + \cdots + q^{n-1}\) is a \(q\)-integer. An alternative definition is given by \(\rho_n = q^{n-1} P_n(x; q^{-1})\), where \(P_n(x; q)\) is the Hall-Littlewood \(P\) function for the one-row partition \(n\).

INPUT:

  • Sym – the ring of the symmetric functions

  • q – the parameter \(q\)

REFERENCES:

EXAMPLES:

We verify the change of basis formula for the first few \(n\):

sage: q = ZZ['q'].fraction_field().gen()
sage: Sym = SymmetricFunctions(q.parent())
sage: an = Sym.abreu_nigro(q)
sage: h = Sym.h()
sage: from sage.combinat.q_analogues import q_int, q_factorial
sage: all(q_int(n, q) * h[n] == sum(h[n-i] * an[i] for i in range(1,n+1))
....:     for n in range(1, 5))
True

sage: P = Sym.hall_littlewood(q).P()
sage: all(h(P[n]).map_coefficients(lambda c: q^(n-1) * c(q=~q)) == h(an[n])
....:     for n in range(1, 6))
True
>>> from sage.all import *
>>> q = ZZ['q'].fraction_field().gen()
>>> Sym = SymmetricFunctions(q.parent())
>>> an = Sym.abreu_nigro(q)
>>> h = Sym.h()
>>> from sage.combinat.q_analogues import q_int, q_factorial
>>> all(q_int(n, q) * h[n] == sum(h[n-i] * an[i] for i in range(Integer(1),n+Integer(1)))
...     for n in range(Integer(1), Integer(5)))
True

>>> P = Sym.hall_littlewood(q).P()
>>> all(h(P[n]).map_coefficients(lambda c: q**(n-Integer(1)) * c(q=~q)) == h(an[n])
...     for n in range(Integer(1), Integer(6)))
True

Next, we give the expansion in a few other bases:

sage: p = Sym.p()
sage: s = Sym.s()
sage: m = Sym.m()
sage: e = Sym.e()

sage: p(an([1]))
p[1]
sage: m(an([1]))
m[1]
sage: e(an([1]))
e[1]
sage: h(an([1]))
h[1]
sage: s(an([1]))
s[1]

sage: p(an([2]))
((q-1)/2)*p[1, 1] + ((q+1)/2)*p[2]
sage: m(an([2]))
(q-1)*m[1, 1] + q*m[2]
sage: e(an([2]))
q*e[1, 1] + (-q-1)*e[2]
sage: h(an([2]))
-h[1, 1] + (q+1)*h[2]
sage: s(an([2]))
-s[1, 1] + q*s[2]

sage: p(an([3]))
((q^2-2*q+1)/6)*p[1, 1, 1] + ((q^2-1)/2)*p[2, 1] + ((q^2+q+1)/3)*p[3]
sage: m(an([3]))
(q^2-2*q+1)*m[1, 1, 1] + (q^2-q)*m[2, 1] + q^2*m[3]
sage: e(an([3]))
q^2*e[1, 1, 1] + (-2*q^2-q)*e[2, 1] + (q^2+q+1)*e[3]
sage: h(an([3]))
h[1, 1, 1] + (-q-2)*h[2, 1] + (q^2+q+1)*h[3]
sage: s(an([3]))
s[1, 1, 1] - q*s[2, 1] + q^2*s[3]
>>> from sage.all import *
>>> p = Sym.p()
>>> s = Sym.s()
>>> m = Sym.m()
>>> e = Sym.e()

>>> p(an([Integer(1)]))
p[1]
>>> m(an([Integer(1)]))
m[1]
>>> e(an([Integer(1)]))
e[1]
>>> h(an([Integer(1)]))
h[1]
>>> s(an([Integer(1)]))
s[1]

>>> p(an([Integer(2)]))
((q-1)/2)*p[1, 1] + ((q+1)/2)*p[2]
>>> m(an([Integer(2)]))
(q-1)*m[1, 1] + q*m[2]
>>> e(an([Integer(2)]))
q*e[1, 1] + (-q-1)*e[2]
>>> h(an([Integer(2)]))
-h[1, 1] + (q+1)*h[2]
>>> s(an([Integer(2)]))
-s[1, 1] + q*s[2]

>>> p(an([Integer(3)]))
((q^2-2*q+1)/6)*p[1, 1, 1] + ((q^2-1)/2)*p[2, 1] + ((q^2+q+1)/3)*p[3]
>>> m(an([Integer(3)]))
(q^2-2*q+1)*m[1, 1, 1] + (q^2-q)*m[2, 1] + q^2*m[3]
>>> e(an([Integer(3)]))
q^2*e[1, 1, 1] + (-2*q^2-q)*e[2, 1] + (q^2+q+1)*e[3]
>>> h(an([Integer(3)]))
h[1, 1, 1] + (-q-2)*h[2, 1] + (q^2+q+1)*h[3]
>>> s(an([Integer(3)]))
s[1, 1, 1] - q*s[2, 1] + q^2*s[3]

Some examples of conversions the other way:

sage: q_int(3, q) * an(h[3])
(1/(q+1))*an[1, 1, 1] + ((q+2)/(q+1))*an[2, 1] + an[3]
sage: q_int(3, q) * an(e[3])
(q^3/(q+1))*an[1, 1, 1] + ((-2*q^2-q)/(q+1))*an[2, 1] + an[3]
sage: q_int(3, q) * an(m[2,1])
((-2*q^3+q^2+q)/(q+1))*an[1, 1, 1] + ((5*q^2+2*q-1)/(q+1))*an[2, 1] - 3*an[3]
sage: q_int(3, q) * an(p[3])
(q^2-2*q+1)*an[1, 1, 1] + (-3*q+3)*an[2, 1] + 3*an[3]
>>> from sage.all import *
>>> q_int(Integer(3), q) * an(h[Integer(3)])
(1/(q+1))*an[1, 1, 1] + ((q+2)/(q+1))*an[2, 1] + an[3]
>>> q_int(Integer(3), q) * an(e[Integer(3)])
(q^3/(q+1))*an[1, 1, 1] + ((-2*q^2-q)/(q+1))*an[2, 1] + an[3]
>>> q_int(Integer(3), q) * an(m[Integer(2),Integer(1)])
((-2*q^3+q^2+q)/(q+1))*an[1, 1, 1] + ((5*q^2+2*q-1)/(q+1))*an[2, 1] - 3*an[3]
>>> q_int(Integer(3), q) * an(p[Integer(3)])
(q^2-2*q+1)*an[1, 1, 1] + (-3*q+3)*an[2, 1] + 3*an[3]

We verify the determinant formulas of [AN2021II] Proposition 2.1, but correcting a parity issue with (3):

sage: def h_det(n):
....:     ret = matrix.zero(an, n)
....:     for i in range(n):
....:         if i != 0:
....:             ret[i,i-1] = -q_int(i)
....:         for j in range(i, n):
....:             ret[i,j] = an[j-i+1]
....:     return ret.det()
sage: all(q_factorial(n, q) * h[n] == h(h_det(n)) for n in range(6))
True
sage: all(q_factorial(n, q) * an(h[n]) == h_det(n) for n in range(6))
True

sage: def rho_det(n):
....:     ret = matrix.zero(h, n)
....:     for i in range(n):
....:         if i == 0:
....:             for j in range(n):
....:                 ret[0,j] = q_int(j+1, q) * h[j+1]
....:         else:
....:             for j in range(i-1, n):
....:                 ret[i,j] = h[j-i+1]
....:     return ret.det()
sage: all((-1)^(n+1) * an[n] == an(rho_det(n)) for n in range(1, 6))
True
sage: all((-1)^(n+1) * h(an[n]) == rho_det(n) for n in range(1, 6))
True
>>> from sage.all import *
>>> def h_det(n):
...     ret = matrix.zero(an, n)
...     for i in range(n):
...         if i != Integer(0):
...             ret[i,i-Integer(1)] = -q_int(i)
...         for j in range(i, n):
...             ret[i,j] = an[j-i+Integer(1)]
...     return ret.det()
>>> all(q_factorial(n, q) * h[n] == h(h_det(n)) for n in range(Integer(6)))
True
>>> all(q_factorial(n, q) * an(h[n]) == h_det(n) for n in range(Integer(6)))
True

>>> def rho_det(n):
...     ret = matrix.zero(h, n)
...     for i in range(n):
...         if i == Integer(0):
...             for j in range(n):
...                 ret[Integer(0),j] = q_int(j+Integer(1), q) * h[j+Integer(1)]
...         else:
...             for j in range(i-Integer(1), n):
...                 ret[i,j] = h[j-i+Integer(1)]
...     return ret.det()
>>> all((-Integer(1))**(n+Integer(1)) * an[n] == an(rho_det(n)) for n in range(Integer(1), Integer(6)))
True
>>> all((-Integer(1))**(n+Integer(1)) * h(an[n]) == rho_det(n) for n in range(Integer(1), Integer(6)))
True

Antipodes:

sage: an([1]).antipode()
-an[1]
sage: an([2]).antipode()
(q-1)*an[1, 1] - an[2]
sage: an([3]).antipode()
(-q^2+2*q-1)*an[1, 1, 1] + (2*q-2)*an[2, 1] - an[3]
>>> from sage.all import *
>>> an([Integer(1)]).antipode()
-an[1]
>>> an([Integer(2)]).antipode()
(q-1)*an[1, 1] - an[2]
>>> an([Integer(3)]).antipode()
(-q^2+2*q-1)*an[1, 1, 1] + (2*q-2)*an[2, 1] - an[3]

For single row partitions, the antipode is given by the formula \(S(\rho_n(x; q)) = -P_n(x; q)\), where \(P_n\) is the Hall-Littlewood P-function:

sage: P = Sym.hall_littlewood(q).P()
sage: all(P(an[n].antipode()) == -P[n] for n in range(1, 6))
True
>>> from sage.all import *
>>> P = Sym.hall_littlewood(q).P()
>>> all(P(an[n].antipode()) == -P[n] for n in range(Integer(1), Integer(6)))
True
coproduct_on_generators(n)[source]

Return the coproduct on the n-th generator of self.

For any \(n \geq 1\), we have

\[\Delta(\rho_n) = \rho_0 \otimes \rho_n + (q-1) \sum_{k=1}^{n-1} \rho_k \otimes \rho_{n-k} + \rho_n \otimes \rho_0.\]

INPUT:

  • n – a nonnegative integer

OUTPUT:

an element of the tensor squared of the basis self

EXAMPLES:

sage: q = ZZ['q'].fraction_field().gen()
sage: Sym = SymmetricFunctions(q.parent())
sage: h = Sym.h()
sage: an = Sym.abreu_nigro(q)
sage: an.coproduct_on_generators(2)
an[] # an[2] + (q-1)*an[1] # an[1] + an[2] # an[]
sage: an[2].coproduct()
an[] # an[2] + (q-1)*an[1] # an[1] + an[2] # an[]
sage: an.coproduct(an[2])
an[] # an[2] + (q-1)*an[1] # an[1] + an[2] # an[]
sage: an.tensor_square()(h(an[5]).coproduct()) == an[5].coproduct()
True
sage: an[2,1].coproduct()
an[] # an[2, 1] + (q-1)*an[1] # an[1, 1] + an[1] # an[2]
 + (q-1)*an[1, 1] # an[1] + an[2] # an[1] + an[2, 1] # an[]
sage: an.tensor_square()(h(an[2,1]).coproduct())
an[] # an[2, 1] + (q-1)*an[1] # an[1, 1] + an[1] # an[2]
 + (q-1)*an[1, 1] # an[1] + an[2] # an[1] + an[2, 1] # an[]
>>> from sage.all import *
>>> q = ZZ['q'].fraction_field().gen()
>>> Sym = SymmetricFunctions(q.parent())
>>> h = Sym.h()
>>> an = Sym.abreu_nigro(q)
>>> an.coproduct_on_generators(Integer(2))
an[] # an[2] + (q-1)*an[1] # an[1] + an[2] # an[]
>>> an[Integer(2)].coproduct()
an[] # an[2] + (q-1)*an[1] # an[1] + an[2] # an[]
>>> an.coproduct(an[Integer(2)])
an[] # an[2] + (q-1)*an[1] # an[1] + an[2] # an[]
>>> an.tensor_square()(h(an[Integer(5)]).coproduct()) == an[Integer(5)].coproduct()
True
>>> an[Integer(2),Integer(1)].coproduct()
an[] # an[2, 1] + (q-1)*an[1] # an[1, 1] + an[1] # an[2]
 + (q-1)*an[1, 1] # an[1] + an[2] # an[1] + an[2, 1] # an[]
>>> an.tensor_square()(h(an[Integer(2),Integer(1)]).coproduct())
an[] # an[2, 1] + (q-1)*an[1] # an[1, 1] + an[1] # an[2]
 + (q-1)*an[1, 1] # an[1] + an[2] # an[1] + an[2, 1] # an[]