def _multiply(self, left, right): # TODO: factor out this code for all bases (as is done for coercions) """ Returns the product of ``left`` and ``right``. INPUT: - ``self`` -- a Schur symmetric function basis - ``left``, ``right`` -- symmetric functions written in the Schur basis ``self``. OUPUT: - an element of the Schur basis, the product of ``left`` and ``right`` TESTS:: sage: s = SymmetricFunctions(QQ).s() sage: a = s([2,1]) + 1; a s[] + s[2, 1] sage: a^2 # indirect doctest s[] + 2*s[2, 1] + s[2, 2, 1, 1] + s[2, 2, 2] + s[3, 1, 1, 1] + 2*s[3, 2, 1] + s[3, 3] + s[4, 1, 1] + s[4, 2] :: sage: QQx.<x> = QQ[] sage: s = SymmetricFunctions(QQx).s() sage: a = x^2*s([2,1]) + 2*x; a 2*x*s[] + x^2*s[2, 1] sage: a^2 4*x^2*s[] + 4*x^3*s[2, 1] + x^4*s[2, 2, 1, 1] + x^4*s[2, 2, 2] + x^4*s[3, 1, 1, 1] + 2*x^4*s[3, 2, 1] + x^4*s[3, 3] + x^4*s[4, 1, 1] + x^4*s[4, 2] :: :: sage: 0*s([2,1]) 0 """ #Use symmetrica to do the multiplication A = left.parent() R = A.base_ring() if R is ZZ or R is QQ: if left and right: return symmetrica.mult_schur_schur(left, right) else: return A._from_dict({}) z_elt = {} for (left_m, left_c) in left._monomial_coefficients.iteritems(): for (right_m, right_c) in right._monomial_coefficients.iteritems(): c = left_c * right_c d = symmetrica.mult_schur_schur({left_m:Integer(1)}, {right_m:Integer(1)})._monomial_coefficients for m in d: if m in z_elt: z_elt[ m ] = z_elt[m] + c * d[m] else: z_elt[ m ] = c * d[m] return A._from_dict(z_elt)
def _multiply(self, left, right): # TODO: factor out this code for all bases (as is done for coercions) """ Returns the product of ``left`` and ``right``. INPUT: - ``self`` -- a Schur symmetric function basis - ``left``, ``right`` -- instances of the Schur basis ``self``. OUPUT: - an element of the Schur basis, the product of ``left`` and ``right`` TESTS:: sage: s = SymmetricFunctions(QQ).s() sage: a = s([2,1]) + 1; a s[] + s[2, 1] sage: a^2 # indirect doctest s[] + 2*s[2, 1] + s[2, 2, 1, 1] + s[2, 2, 2] + s[3, 1, 1, 1] + 2*s[3, 2, 1] + s[3, 3] + s[4, 1, 1] + s[4, 2] :: sage: QQx.<x> = QQ[] sage: s = SymmetricFunctions(QQx).s() sage: a = x^2*s([2,1]) + 2*x; a 2*x*s[] + x^2*s[2, 1] sage: a^2 4*x^2*s[] + 4*x^3*s[2, 1] + x^4*s[2, 2, 1, 1] + x^4*s[2, 2, 2] + x^4*s[3, 1, 1, 1] + 2*x^4*s[3, 2, 1] + x^4*s[3, 3] + x^4*s[4, 1, 1] + x^4*s[4, 2] :: :: sage: 0*s([2,1]) 0 """ #Use symmetrica to do the multiplication A = left.parent() R = A.base_ring() if R is ZZ or R is QQ: if left and right: return symmetrica.mult_schur_schur(left, right) else: return A._from_dict({}) z_elt = {} for (left_m, left_c) in left._monomial_coefficients.iteritems(): for (right_m, right_c) in right._monomial_coefficients.iteritems(): c = left_c * right_c d = symmetrica.mult_schur_schur({left_m:Integer(1)}, {right_m:Integer(1)})._monomial_coefficients for m in d: if m in z_elt: z_elt[ m ] = z_elt[m] + c * d[m] else: z_elt[ m ] = c * d[m] return A._from_dict(z_elt)