elsympoly := proc(x,m) local p; convert( [seq( convert(p,`*`), p = combinat[choose](x,m) )], `+` ) end: explist := proc(mon::monomial) if nops(indets(mon)) = 1 then [degree(mon)]; else map(degree, [op(select(has,mon,indets(mon)))]) fi; end: symlist := proc(l) local n,l1,l2; n := nops(l); l1 := [op(l),0]; l2 := [l1[i]$i=2..n+1]; [l[i]-l2[i]$i=1..n]; end: `type/symmetricpoly` := proc( poly::polynom ) local v,n,i,var,var1,newvar; v := indets(poly); n := nops(v); var := [op(v)]; var1 := [op(v),op(1,v)]; var1 := subs( { seq( op(i,var1)=op(i+1,var1),i=1..n) }, var1); newvar := [seq(var1[i], i=1..n)]; if n > 1 then evalb( poly = subs( {seq(op(i,newvar)=op(i,var), i=1..n)}, poly) and poly = subs( {op(1,var)=op(2,var), op(2,var)=op(1,var)}, poly) ); else true fi; end: symmetric := proc( poly::symmetricpoly, x ) local i,l,m,n,p,s,mon,symmon,sympoly; sympoly := 0; n := nops(x); s := array(1..n); p := sort(poly); while evalb( p<>0 ) do p := sort(p); if type( p, 'monomial' ) then mon := p; else mon := op(1,p) fi; m := nops(indets(mon)); l := symlist(explist(mon)); symmon := convert( [s[i]^l[i]$i=1..m] ,`*` ); sympoly := sympoly + lcoeff(mon)*symmon; p := p - lcoeff(mon)*expand( subs( [seq(s[i]=elsympoly(x,i), i=1..m)], symmon) ) ; od; sympoly; end: