Generic dual bases symmetric functions¶
- class sage.combinat.sf.dual.DualBasisFunctor(basis)[source]¶
- Bases: - SymmetricFunctionsFunctor- A constructor for algebras of symmetric functions constructed by duality. - EXAMPLES: - sage: w = SymmetricFunctions(ZZ).witt() sage: w.dual_basis().construction() (SymmetricFunctionsFunctor[dual Witt], Integer Ring) - >>> from sage.all import * >>> w = SymmetricFunctions(ZZ).witt() >>> w.dual_basis().construction() (SymmetricFunctionsFunctor[dual Witt], Integer Ring) 
- class sage.combinat.sf.dual.SymmetricFunctionAlgebra_dual(dual_basis, scalar, scalar_name, basis_name, prefix)[source]¶
- Bases: - SymmetricFunctionAlgebra_classical- Generic dual basis of a basis of symmetric functions. - INPUT: - dual_basis– a basis of the ring of symmetric functions
- scalar– a function \(z\) on partitions which determines the scalar product on the power sum basis by \(\langle p_{\mu}, p_{\mu} \rangle = z(\mu)\). (Independently on the function chosen, the power sum basis will always be orthogonal; the function- scalaronly determines the norms of the basis elements.) This defaults to the function- zeedefined in- sage.combinat.sf.sfa, that is, the function is defined by:\[\lambda \mapsto \prod_{i = 1}^\infty m_i(\lambda)! i^{m_i(\lambda)}`,\]- where \(m_i(\lambda)\) means the number of times \(i\) appears in \(\lambda\). This default function gives the standard Hall scalar product on the ring of symmetric functions. 
- scalar_name– (default: the empty string) a string giving a description of the scalar product specified by the parameter- scalar
- basis_name– (optional) a string to serve as name for the basis to be generated (such as “forgotten” in “the forgotten basis”); don’t set it to any of the already existing basis names (such as- homogeneous,- monomial,- forgotten, etc.).
- prefix– (default:- 'd'and the prefix for- dual_basis) a string to use as the symbol for the basis
 - OUTPUT: - The basis of the ring of symmetric functions dual to the basis - dual_basiswith respect to the scalar product determined by- scalar.- EXAMPLES: - sage: e = SymmetricFunctions(QQ).e() sage: f = e.dual_basis(prefix='m', basis_name="Forgotten symmetric functions"); f Symmetric Functions over Rational Field in the Forgotten symmetric functions basis sage: TestSuite(f).run(elements=[f[1,1]+2*f[2], f[1]+3*f[1,1]]) sage: TestSuite(f).run() # long time (11s on sage.math, 2011) - >>> from sage.all import * >>> e = SymmetricFunctions(QQ).e() >>> f = e.dual_basis(prefix='m', basis_name="Forgotten symmetric functions"); f Symmetric Functions over Rational Field in the Forgotten symmetric functions basis >>> TestSuite(f).run(elements=[f[Integer(1),Integer(1)]+Integer(2)*f[Integer(2)], f[Integer(1)]+Integer(3)*f[Integer(1),Integer(1)]]) >>> TestSuite(f).run() # long time (11s on sage.math, 2011) - This class defines canonical coercions between - selfand- self^*, as follow:- Lookup for the canonical isomorphism from - selfto \(P\) (=powersum), and build the adjoint isomorphism from \(P^*\) to- self^*. Since \(P\) is self-adjoint for this scalar product, derive an isomorphism from \(P\) to- self^*, and by composition with the above get an isomorphism from- selfto- self^*(and similarly for the isomorphism- self^*to- self).- This should be striped down to just (auto?) defining canonical isomorphism by adjunction (as in MuPAD-Combinat), and let the coercion handle the rest. - Inversions may not be possible if the base ring is not a field: - sage: m = SymmetricFunctions(ZZ).m() sage: h = m.dual_basis(lambda x: 1) sage: h[2,1] Traceback (most recent call last): ... TypeError: no conversion of this rational to integer - >>> from sage.all import * >>> m = SymmetricFunctions(ZZ).m() >>> h = m.dual_basis(lambda x: Integer(1)) >>> h[Integer(2),Integer(1)] Traceback (most recent call last): ... TypeError: no conversion of this rational to integer - By transitivity, this defines indirect coercions to and from all other bases: - sage: s = SymmetricFunctions(QQ['t'].fraction_field()).s() sage: t = QQ['t'].fraction_field().gen() sage: zee_hl = lambda x: x.centralizer_size(t=t) sage: S = s.dual_basis(zee_hl) sage: S(s([2,1])) (-t/(t^5-2*t^4+t^3-t^2+2*t-1))*d_s[1, 1, 1] + ((-t^2-1)/(t^5-2*t^4+t^3-t^2+2*t-1))*d_s[2, 1] + (-t/(t^5-2*t^4+t^3-t^2+2*t-1))*d_s[3] - >>> from sage.all import * >>> s = SymmetricFunctions(QQ['t'].fraction_field()).s() >>> t = QQ['t'].fraction_field().gen() >>> zee_hl = lambda x: x.centralizer_size(t=t) >>> S = s.dual_basis(zee_hl) >>> S(s([Integer(2),Integer(1)])) (-t/(t^5-2*t^4+t^3-t^2+2*t-1))*d_s[1, 1, 1] + ((-t^2-1)/(t^5-2*t^4+t^3-t^2+2*t-1))*d_s[2, 1] + (-t/(t^5-2*t^4+t^3-t^2+2*t-1))*d_s[3] - class Element(A, dictionary=None, dual=None)[source]¶
- Bases: - Element- An element in the dual basis. - INPUT: - At least one of the following must be specified. The one (if any) which is not provided will be computed. - dictionary– an internal dictionary for the monomials and coefficients of- self
- dual– self as an element of the dual basis
 - dual()[source]¶
- Return - selfin the dual basis.- OUTPUT: - the element - selfexpanded in the dual basis to- self.parent()
 - EXAMPLES: - sage: m = SymmetricFunctions(QQ).monomial() sage: zee = sage.combinat.sf.sfa.zee sage: h = m.dual_basis(scalar=zee) sage: a = h([2,1]) sage: a.parent() Dual basis to Symmetric Functions over Rational Field in the monomial basis sage: a.dual() 3*m[1, 1, 1] + 2*m[2, 1] + m[3] - >>> from sage.all import * >>> m = SymmetricFunctions(QQ).monomial() >>> zee = sage.combinat.sf.sfa.zee >>> h = m.dual_basis(scalar=zee) >>> a = h([Integer(2),Integer(1)]) >>> a.parent() Dual basis to Symmetric Functions over Rational Field in the monomial basis >>> a.dual() 3*m[1, 1, 1] + 2*m[2, 1] + m[3] 
 - expand(n, alphabet='x')[source]¶
- Expand the symmetric function - selfas a symmetric polynomial in- nvariables.- INPUT: - n– nonnegative integer
- alphabet– (default:- 'x') a variable for the expansion
 - OUTPUT: - A monomial expansion of - selfin the \(n\) variables labelled by- alphabet.- EXAMPLES: - sage: m = SymmetricFunctions(QQ).monomial() sage: zee = sage.combinat.sf.sfa.zee sage: h = m.dual_basis(zee) sage: a = h([2,1])+h([3]) sage: a.expand(2) 2*x0^3 + 3*x0^2*x1 + 3*x0*x1^2 + 2*x1^3 sage: a.dual().expand(2) 2*x0^3 + 3*x0^2*x1 + 3*x0*x1^2 + 2*x1^3 sage: a.expand(2,alphabet='y') 2*y0^3 + 3*y0^2*y1 + 3*y0*y1^2 + 2*y1^3 sage: a.expand(2,alphabet='x,y') 2*x^3 + 3*x^2*y + 3*x*y^2 + 2*y^3 sage: h([1]).expand(0) 0 sage: (3*h([])).expand(0) 3 - >>> from sage.all import * >>> m = SymmetricFunctions(QQ).monomial() >>> zee = sage.combinat.sf.sfa.zee >>> h = m.dual_basis(zee) >>> a = h([Integer(2),Integer(1)])+h([Integer(3)]) >>> a.expand(Integer(2)) 2*x0^3 + 3*x0^2*x1 + 3*x0*x1^2 + 2*x1^3 >>> a.dual().expand(Integer(2)) 2*x0^3 + 3*x0^2*x1 + 3*x0*x1^2 + 2*x1^3 >>> a.expand(Integer(2),alphabet='y') 2*y0^3 + 3*y0^2*y1 + 3*y0*y1^2 + 2*y1^3 >>> a.expand(Integer(2),alphabet='x,y') 2*x^3 + 3*x^2*y + 3*x*y^2 + 2*y^3 >>> h([Integer(1)]).expand(Integer(0)) 0 >>> (Integer(3)*h([])).expand(Integer(0)) 3 
 - omega()[source]¶
- Return the image of - selfunder the omega automorphism.- The omega automorphism is defined to be the unique algebra endomorphism \(\omega\) of the ring of symmetric functions that satisfies \(\omega(e_k) = h_k\) for all positive integers \(k\) (where \(e_k\) stands for the \(k\)-th elementary symmetric function, and \(h_k\) stands for the \(k\)-th complete homogeneous symmetric function). It furthermore is a Hopf algebra endomorphism and an involution, and it is also known as the omega involution. It sends the power-sum symmetric function \(p_k\) to \((-1)^{k-1} p_k\) for every positive integer \(k\). - The images of some bases under the omega automorphism are given by \[\omega(e_{\lambda}) = h_{\lambda}, \qquad \omega(h_{\lambda}) = e_{\lambda}, \qquad \omega(p_{\lambda}) = (-1)^{|\lambda| - \ell(\lambda)} p_{\lambda}, \qquad \omega(s_{\lambda}) = s_{\lambda^{\prime}},\]- where \(\lambda\) is any partition, where \(\ell(\lambda)\) denotes the length ( - length()) of the partition \(\lambda\), where \(\lambda^{\prime}\) denotes the conjugate partition (- conjugate()) of \(\lambda\), and where the usual notations for bases are used (\(e\) = elementary, \(h\) = complete homogeneous, \(p\) = powersum, \(s\) = Schur).- omega_involution()is a synonym for the- omega()method.- OUTPUT: the result of applying omega to - self- EXAMPLES: - sage: m = SymmetricFunctions(QQ).monomial() sage: zee = sage.combinat.sf.sfa.zee sage: h = m.dual_basis(zee) sage: hh = SymmetricFunctions(QQ).homogeneous() sage: hh([2,1]).omega() h[1, 1, 1] - h[2, 1] sage: h([2,1]).omega() d_m[1, 1, 1] - d_m[2, 1] - >>> from sage.all import * >>> m = SymmetricFunctions(QQ).monomial() >>> zee = sage.combinat.sf.sfa.zee >>> h = m.dual_basis(zee) >>> hh = SymmetricFunctions(QQ).homogeneous() >>> hh([Integer(2),Integer(1)]).omega() h[1, 1, 1] - h[2, 1] >>> h([Integer(2),Integer(1)]).omega() d_m[1, 1, 1] - d_m[2, 1] 
 - omega_involution()[source]¶
- Return the image of - selfunder the omega automorphism.- The omega automorphism is defined to be the unique algebra endomorphism \(\omega\) of the ring of symmetric functions that satisfies \(\omega(e_k) = h_k\) for all positive integers \(k\) (where \(e_k\) stands for the \(k\)-th elementary symmetric function, and \(h_k\) stands for the \(k\)-th complete homogeneous symmetric function). It furthermore is a Hopf algebra endomorphism and an involution, and it is also known as the omega involution. It sends the power-sum symmetric function \(p_k\) to \((-1)^{k-1} p_k\) for every positive integer \(k\). - The images of some bases under the omega automorphism are given by \[\omega(e_{\lambda}) = h_{\lambda}, \qquad \omega(h_{\lambda}) = e_{\lambda}, \qquad \omega(p_{\lambda}) = (-1)^{|\lambda| - \ell(\lambda)} p_{\lambda}, \qquad \omega(s_{\lambda}) = s_{\lambda^{\prime}},\]- where \(\lambda\) is any partition, where \(\ell(\lambda)\) denotes the length ( - length()) of the partition \(\lambda\), where \(\lambda^{\prime}\) denotes the conjugate partition (- conjugate()) of \(\lambda\), and where the usual notations for bases are used (\(e\) = elementary, \(h\) = complete homogeneous, \(p\) = powersum, \(s\) = Schur).- omega_involution()is a synonym for the- omega()method.- OUTPUT: the result of applying omega to - self- EXAMPLES: - sage: m = SymmetricFunctions(QQ).monomial() sage: zee = sage.combinat.sf.sfa.zee sage: h = m.dual_basis(zee) sage: hh = SymmetricFunctions(QQ).homogeneous() sage: hh([2,1]).omega() h[1, 1, 1] - h[2, 1] sage: h([2,1]).omega() d_m[1, 1, 1] - d_m[2, 1] - >>> from sage.all import * >>> m = SymmetricFunctions(QQ).monomial() >>> zee = sage.combinat.sf.sfa.zee >>> h = m.dual_basis(zee) >>> hh = SymmetricFunctions(QQ).homogeneous() >>> hh([Integer(2),Integer(1)]).omega() h[1, 1, 1] - h[2, 1] >>> h([Integer(2),Integer(1)]).omega() d_m[1, 1, 1] - d_m[2, 1] 
 - scalar(x)[source]¶
- Return the standard scalar product of - selfand- x.- INPUT: - x– element of the symmetric functions
 - OUTPUT: the scalar product between - xand- self- EXAMPLES: - sage: m = SymmetricFunctions(QQ).monomial() sage: zee = sage.combinat.sf.sfa.zee sage: h = m.dual_basis(scalar=zee) sage: a = h([2,1]) sage: a.scalar(a) 2 - >>> from sage.all import * >>> m = SymmetricFunctions(QQ).monomial() >>> zee = sage.combinat.sf.sfa.zee >>> h = m.dual_basis(scalar=zee) >>> a = h([Integer(2),Integer(1)]) >>> a.scalar(a) 2 
 - scalar_hl(x)[source]¶
- Return the Hall-Littlewood scalar product of - selfand- x.- INPUT: - x– element of the same dual basis as- self
 - OUTPUT: the Hall-Littlewood scalar product between - xand- self- EXAMPLES: - sage: m = SymmetricFunctions(QQ).monomial() sage: zee = sage.combinat.sf.sfa.zee sage: h = m.dual_basis(scalar=zee) sage: a = h([2,1]) sage: a.scalar_hl(a) (-t - 2)/(t^4 - 2*t^3 + 2*t - 1) - >>> from sage.all import * >>> m = SymmetricFunctions(QQ).monomial() >>> zee = sage.combinat.sf.sfa.zee >>> h = m.dual_basis(scalar=zee) >>> a = h([Integer(2),Integer(1)]) >>> a.scalar_hl(a) (-t - 2)/(t^4 - 2*t^3 + 2*t - 1) 
 
 - basis_name()[source]¶
- Return the name of the basis of - self.- This is used for output and, for the classical bases of symmetric functions, to connect this basis with Symmetrica. - EXAMPLES: - sage: Sym = SymmetricFunctions(QQ) sage: f = Sym.f() sage: f.basis_name() 'forgotten' - >>> from sage.all import * >>> Sym = SymmetricFunctions(QQ) >>> f = Sym.f() >>> f.basis_name() 'forgotten' 
 - construction()[source]¶
- Return a pair - (F, R), where- Fis a- SymmetricFunctionsFunctorand \(R\) is a ring, such that- F(R)returns- self.- EXAMPLES: - sage: w = SymmetricFunctions(ZZ).witt() sage: w.dual_basis().construction() (SymmetricFunctionsFunctor[dual Witt], Integer Ring) - >>> from sage.all import * >>> w = SymmetricFunctions(ZZ).witt() >>> w.dual_basis().construction() (SymmetricFunctionsFunctor[dual Witt], Integer Ring) 
 - product(left, right)[source]¶
- Return product of - leftand- right.- Multiplication is done by performing the multiplication in the dual basis of - selfand then converting back to- self.- INPUT: - left,- right– elements of- self
 - OUTPUT: the product of - leftand- rightin the basis- self- EXAMPLES: - sage: m = SymmetricFunctions(QQ).monomial() sage: zee = sage.combinat.sf.sfa.zee sage: h = m.dual_basis(scalar=zee) sage: a = h([2]) sage: b = a*a; b # indirect doctest d_m[2, 2] sage: b.dual() 6*m[1, 1, 1, 1] + 4*m[2, 1, 1] + 3*m[2, 2] + 2*m[3, 1] + m[4] - >>> from sage.all import * >>> m = SymmetricFunctions(QQ).monomial() >>> zee = sage.combinat.sf.sfa.zee >>> h = m.dual_basis(scalar=zee) >>> a = h([Integer(2)]) >>> b = a*a; b # indirect doctest d_m[2, 2] >>> b.dual() 6*m[1, 1, 1, 1] + 4*m[2, 1, 1] + 3*m[2, 2] + 2*m[3, 1] + m[4] 
 - transition_matrix(basis, n)[source]¶
- Return the transition matrix between the \(n\)-th homogeneous components of - selfand- basis.- INPUT: - basis– a target basis of the ring of symmetric functions
- n– nonnegative integer
 - OUTPUT: - A transition matrix from - selfto- basisfor the elements of degree- n. The indexing order of the rows and columns is the order of- Partitions(n).
 - EXAMPLES: - sage: Sym = SymmetricFunctions(QQ) sage: s = Sym.schur() sage: e = Sym.elementary() sage: f = e.dual_basis() sage: f.transition_matrix(s, 5) [ 1 -1 0 1 0 -1 1] [-2 1 1 -1 -1 1 0] [-2 2 -1 -1 1 0 0] [ 3 -1 -1 1 0 0 0] [ 3 -2 1 0 0 0 0] [-4 1 0 0 0 0 0] [ 1 0 0 0 0 0 0] sage: Partitions(5).list() [[5], [4, 1], [3, 2], [3, 1, 1], [2, 2, 1], [2, 1, 1, 1], [1, 1, 1, 1, 1]] sage: s(f[2,2,1]) s[3, 2] - 2*s[4, 1] + 3*s[5] sage: e.transition_matrix(s, 5).inverse().transpose() [ 1 -1 0 1 0 -1 1] [-2 1 1 -1 -1 1 0] [-2 2 -1 -1 1 0 0] [ 3 -1 -1 1 0 0 0] [ 3 -2 1 0 0 0 0] [-4 1 0 0 0 0 0] [ 1 0 0 0 0 0 0] - >>> from sage.all import * >>> Sym = SymmetricFunctions(QQ) >>> s = Sym.schur() >>> e = Sym.elementary() >>> f = e.dual_basis() >>> f.transition_matrix(s, Integer(5)) [ 1 -1 0 1 0 -1 1] [-2 1 1 -1 -1 1 0] [-2 2 -1 -1 1 0 0] [ 3 -1 -1 1 0 0 0] [ 3 -2 1 0 0 0 0] [-4 1 0 0 0 0 0] [ 1 0 0 0 0 0 0] >>> Partitions(Integer(5)).list() [[5], [4, 1], [3, 2], [3, 1, 1], [2, 2, 1], [2, 1, 1, 1], [1, 1, 1, 1, 1]] >>> s(f[Integer(2),Integer(2),Integer(1)]) s[3, 2] - 2*s[4, 1] + 3*s[5] >>> e.transition_matrix(s, Integer(5)).inverse().transpose() [ 1 -1 0 1 0 -1 1] [-2 1 1 -1 -1 1 0] [-2 2 -1 -1 1 0 0] [ 3 -1 -1 1 0 0 0] [ 3 -2 1 0 0 0 0] [-4 1 0 0 0 0 0] [ 1 0 0 0 0 0 0]