Orthogonal Symmetric Functions¶
AUTHORS:
Travis Scrimshaw (2013-11-10): Initial version
- class sage.combinat.sf.orthogonal.SymmetricFunctionAlgebra_orthogonal(Sym)[source]¶
Bases:
SymmetricFunctionAlgebra_generic
The orthogonal symmetric function basis (or orthogonal basis, to be short).
The orthogonal basis \(\{ o_{\lambda} \}\) where \(\lambda\) is taken over all partitions is defined by the following change of basis with the Schur functions:
\[s_{\lambda} = \sum_{\mu} \left( \sum_{\nu \in H} c^{\lambda}_{\mu\nu} \right) o_{\mu}\]where \(H\) is the set of all partitions with even-width rows and \(c^{\lambda}_{\mu\nu}\) is the usual Littlewood-Richardson (LR) coefficients. By the properties of LR coefficients, this can be shown to be a upper unitriangular change of basis.
Note
This is only a filtered basis, not a \(\ZZ\)-graded basis. However this does respect the induced \((\ZZ/2\ZZ)\)-grading.
INPUT:
Sym
– an instance of the ring of the symmetric functions
REFERENCES:
EXAMPLES:
Here are the first few orthogonal symmetric functions, in various bases:
sage: Sym = SymmetricFunctions(QQ) sage: o = Sym.o() sage: e = Sym.e() sage: h = Sym.h() sage: p = Sym.p() sage: s = Sym.s() sage: m = Sym.m() sage: p(o([1])) p[1] sage: m(o([1])) m[1] sage: e(o([1])) e[1] sage: h(o([1])) h[1] sage: s(o([1])) s[1] sage: p(o([2])) -p[] + 1/2*p[1, 1] + 1/2*p[2] sage: m(o([2])) -m[] + m[1, 1] + m[2] sage: e(o([2])) -e[] + e[1, 1] - e[2] sage: h(o([2])) -h[] + h[2] sage: s(o([2])) -s[] + s[2] sage: p(o([3])) -p[1] + 1/6*p[1, 1, 1] + 1/2*p[2, 1] + 1/3*p[3] sage: m(o([3])) -m[1] + m[1, 1, 1] + m[2, 1] + m[3] sage: e(o([3])) -e[1] + e[1, 1, 1] - 2*e[2, 1] + e[3] sage: h(o([3])) -h[1] + h[3] sage: s(o([3])) -s[1] + s[3] sage: Sym = SymmetricFunctions(ZZ) sage: o = Sym.o() sage: e = Sym.e() sage: h = Sym.h() sage: s = Sym.s() sage: m = Sym.m() sage: p = Sym.p() sage: m(o([4])) -m[1, 1] + m[1, 1, 1, 1] - m[2] + m[2, 1, 1] + m[2, 2] + m[3, 1] + m[4] sage: e(o([4])) -e[1, 1] + e[1, 1, 1, 1] + e[2] - 3*e[2, 1, 1] + e[2, 2] + 2*e[3, 1] - e[4] sage: h(o([4])) -h[2] + h[4] sage: s(o([4])) -s[2] + s[4]
>>> from sage.all import * >>> Sym = SymmetricFunctions(QQ) >>> o = Sym.o() >>> e = Sym.e() >>> h = Sym.h() >>> p = Sym.p() >>> s = Sym.s() >>> m = Sym.m() >>> p(o([Integer(1)])) p[1] >>> m(o([Integer(1)])) m[1] >>> e(o([Integer(1)])) e[1] >>> h(o([Integer(1)])) h[1] >>> s(o([Integer(1)])) s[1] >>> p(o([Integer(2)])) -p[] + 1/2*p[1, 1] + 1/2*p[2] >>> m(o([Integer(2)])) -m[] + m[1, 1] + m[2] >>> e(o([Integer(2)])) -e[] + e[1, 1] - e[2] >>> h(o([Integer(2)])) -h[] + h[2] >>> s(o([Integer(2)])) -s[] + s[2] >>> p(o([Integer(3)])) -p[1] + 1/6*p[1, 1, 1] + 1/2*p[2, 1] + 1/3*p[3] >>> m(o([Integer(3)])) -m[1] + m[1, 1, 1] + m[2, 1] + m[3] >>> e(o([Integer(3)])) -e[1] + e[1, 1, 1] - 2*e[2, 1] + e[3] >>> h(o([Integer(3)])) -h[1] + h[3] >>> s(o([Integer(3)])) -s[1] + s[3] >>> Sym = SymmetricFunctions(ZZ) >>> o = Sym.o() >>> e = Sym.e() >>> h = Sym.h() >>> s = Sym.s() >>> m = Sym.m() >>> p = Sym.p() >>> m(o([Integer(4)])) -m[1, 1] + m[1, 1, 1, 1] - m[2] + m[2, 1, 1] + m[2, 2] + m[3, 1] + m[4] >>> e(o([Integer(4)])) -e[1, 1] + e[1, 1, 1, 1] + e[2] - 3*e[2, 1, 1] + e[2, 2] + 2*e[3, 1] - e[4] >>> h(o([Integer(4)])) -h[2] + h[4] >>> s(o([Integer(4)])) -s[2] + s[4]
Sym = SymmetricFunctions(QQ) o = Sym.o() e = Sym.e() h = Sym.h() p = Sym.p() s = Sym.s() m = Sym.m() p(o([1])) m(o([1])) e(o([1])) h(o([1])) s(o([1])) p(o([2])) m(o([2])) e(o([2])) h(o([2])) s(o([2])) p(o([3])) m(o([3])) e(o([3])) h(o([3])) s(o([3])) Sym = SymmetricFunctions(ZZ) o = Sym.o() e = Sym.e() h = Sym.h() s = Sym.s() m = Sym.m() p = Sym.p() m(o([4])) e(o([4])) h(o([4])) s(o([4]))
Some examples of conversions the other way:
sage: o(h[3]) o[1] + o[3] sage: o(e[3]) o[1, 1, 1] sage: o(m[2,1]) o[1] - 2*o[1, 1, 1] + o[2, 1] sage: o(p[3]) o[1, 1, 1] - o[2, 1] + o[3]
>>> from sage.all import * >>> o(h[Integer(3)]) o[1] + o[3] >>> o(e[Integer(3)]) o[1, 1, 1] >>> o(m[Integer(2),Integer(1)]) o[1] - 2*o[1, 1, 1] + o[2, 1] >>> o(p[Integer(3)]) o[1, 1, 1] - o[2, 1] + o[3]
o(h[3]) o(e[3]) o(m[2,1]) o(p[3])
Some multiplication:
sage: o([2]) * o([1,1]) o[1, 1] + o[2] + o[2, 1, 1] + o[3, 1] sage: o([2,1,1]) * o([2]) o[1, 1] + o[1, 1, 1, 1] + 2*o[2, 1, 1] + o[2, 2] + o[2, 2, 1, 1] + o[3, 1] + o[3, 1, 1, 1] + o[3, 2, 1] + o[4, 1, 1] sage: o([1,1]) * o([2,1]) o[1] + o[1, 1, 1] + 2*o[2, 1] + o[2, 1, 1, 1] + o[2, 2, 1] + o[3] + o[3, 1, 1] + o[3, 2]
>>> from sage.all import * >>> o([Integer(2)]) * o([Integer(1),Integer(1)]) o[1, 1] + o[2] + o[2, 1, 1] + o[3, 1] >>> o([Integer(2),Integer(1),Integer(1)]) * o([Integer(2)]) o[1, 1] + o[1, 1, 1, 1] + 2*o[2, 1, 1] + o[2, 2] + o[2, 2, 1, 1] + o[3, 1] + o[3, 1, 1, 1] + o[3, 2, 1] + o[4, 1, 1] >>> o([Integer(1),Integer(1)]) * o([Integer(2),Integer(1)]) o[1] + o[1, 1, 1] + 2*o[2, 1] + o[2, 1, 1, 1] + o[2, 2, 1] + o[3] + o[3, 1, 1] + o[3, 2]
o([2]) * o([1,1]) o([2,1,1]) * o([2]) o([1,1]) * o([2,1])
Examples of the Hopf algebra structure:
sage: o([1]).antipode() -o[1] sage: o([2]).antipode() -o[] + o[1, 1] sage: o([1]).coproduct() o[] # o[1] + o[1] # o[] sage: o([2]).coproduct() o[] # o[] + o[] # o[2] + o[1] # o[1] + o[2] # o[] sage: o([1]).counit() 0 sage: o.one().counit() 1
>>> from sage.all import * >>> o([Integer(1)]).antipode() -o[1] >>> o([Integer(2)]).antipode() -o[] + o[1, 1] >>> o([Integer(1)]).coproduct() o[] # o[1] + o[1] # o[] >>> o([Integer(2)]).coproduct() o[] # o[] + o[] # o[2] + o[1] # o[1] + o[2] # o[] >>> o([Integer(1)]).counit() 0 >>> o.one().counit() 1
o([1]).antipode() o([2]).antipode() o([1]).coproduct() o([2]).coproduct() o([1]).counit() o.one().counit()