Symmetric functions
Chevie.SymFuncs — Module
This module deals with symmetric functions. For details look at the books (Macdonald, 2015) or (Zelevinsky, 1981).
The algebra R of symmetric functions over the integers is isomorphic to the sum of the Grothendieck groups $⊕_{n≥0}R[𝔖ₙ]$. The multiplication in the algebra is given by $\hbox{Ind}_{𝔖ₙ×𝔖ₘ}^{𝔖_{n+m}}$.
This module implements the following bases of R:
p(power sums)h(complete symmetric functions)e(elementary symmetric functions)m(monomial symmetric functions)s(Schur functions)
Note that p is only a basis over the rationals (we accept arbitrary coefficients). Each of these bases in degree n is indexed by the partitions of n.
Interpreted as class functions on 𝔖ₙ, the basis s corresponds to the irreducible characters, the basis p to the normalized characteristic functions of the classes, the basis h to the induced of the identity from Young subgroups (standard parabolic subgroups), and the basis e to the induced of the sign from Young subgroups.
A typical session would begin by defining these bases:
julia> using .SymFuncs: p,h,s,e,mThis is necessary since is would not be a good policy to pollute the namespace by exporting all these 1-letter names.
Then make elements in one of these bases. The following forms are equivalent:
julia> p(Partition(3,2,1))
p₃₂₁
julia> p([3,2,1])
p₃₂₁
julia> p(3,2,1)
p₃₂₁The functions can be used to convert between bases:
julia> s(p(3,2,1))
-s₁₁₁₁₁₁-s₂₂₂+s₃₁₁₁+s₃₃-s₄₁₁+s₆
julia> h(p(3,2,1))
-h₁₁₁₁₁₁+5h₂₁₁₁₁-6h₂₂₁₁-3h₃₁₁₁+6h₃₂₁
julia> h(p(3,2,1))[3,2,1] # you can find a coefficient by indexing
6//1The following operations are defined on symmetric functions, in addition to + and -:
julia> s(2,1)*s(2,1) # product
s₂₂₁₁+s₂₂₂+s₃₁₁₁+2s₃₂₁+s₃₃+s₄₁₁+s₄₂
julia> s(2,1)⊗s(2,1) # inner product
s₁₁₁+s₂₁+s₃
julia> scalar_product(p(1,1,1),s(2,1))
2//1One can mix bases in these operations. The basis of the left argument wins:
julia> s(2,1)+p(3)
s₁₁₁+s₃The plethysm is implemented with two possible notations:
julia> plethysm(p(2,1),s(2,1))
(1//9)p₂₂₂₁₁₁+(-1//9)p₃₂₂₂+(-1//9)p₆₁₁₁+(1//9)p₆₃
julia> p(2,1)[s(2,1)] # the same thing
(1//9)p₂₂₂₁₁₁+(-1//9)p₃₂₂₂+(-1//9)p₆₁₁₁+(1//9)p₆₃
julia> @Mvp u,v
julia> p(2,1)[u*p(2)+v*p(3)] # plethysm acts on Mvp coefficients
u³p₄₂+u²vp₄₃+uv²p₆₂+v³p₆₃finally one can convert a symmetric function to a symmetric polynomial. The number of variables by default is the highest degree in the function.
julia> Mvp(p(2)+p(3))
Mvp{Int64}: x₁³+x₁²+x₂³+x₂²+x₃³+x₃²
julia> Mvp(p(2),[:u,:v,:w]) # one can choose the variables used and their number
Mvp{Int64}: u²+v²+w²Wreath Symmetric functions
We also implement symmetric functions for the group Gₑ,₁,ₙ, isomorphic to μₑ≀𝔖ₙ=(μₑⁿ)⋊𝔖ₙ, where μₑ is the group of e-th roots of unity. The algebra Rₑ of wreath symmetric function is the sum of Grothendieck groups ⊕ₙR(Gₑ,₁,ₙ), with product given by $\hbox{Ind}_{Gₑ,₁,ₘ×Gₑ,₁,ₙ}^{Gₑ,₁,ₙ₊ₘ}$.
The algebra Rₑ is isomorphic to a tensor product of e copies of the algebra R of symmetric functions, indexed by the irreducible characters of μₑ. The copy indexed by $γ∈\hbox{Irr(μₑ)}$ has as basis in degree n the irreducible characters appearing in $\hbox{Ind}_{μₑⁿ}^{Gₑ,₁,ₙ}γ^{⊗n}$.
Each of the bases of R gives thus by tensor product a basis of Rₑ indexed by e-tuples of partitions. The basis s still represents irreducible characters, but the basis p does not represent conjugacy classes.
The conjugacy class of an element (ζ₁,…,ζₙ).σ∈(μₑⁿ)⋊𝔖ₙ is obtained has follows: decompose σ in cycles, and record the product of the corresponding ζᵢ. This distributes the cycles in e classes, thus builds an e-tuple of partitions. The normalized characteristic function of the corresponding class is represented by a basis π indexed by e-tuples. Then the character table of Gₑ,₁,ₙ is encoded in the decomposition of the basis π in the basis s.
To use the basis π, we recommend that you do
julia> Pi=SymFuncs.π;end in order not to destroy the constant π.
The following are equivalent
julia> p(2,1)⊠p(1)
p₂₁.₁
julia> p([[2,1],[1]])
p₂₁.₁
julia> p(PartitionTuple([2,1],[1]))
p₂₁.₁
julia> p([2,1],[1])
p₂₁.₁for the basis Pi only the last 3 methods are allowed since it cannot be build as an external tensor.
julia> s(Pi([1],[1])) # The values of the characters on the class 1.1
-s.₁₁-s.₂+s₁₁.+s₂.
julia> Pi(p([2],[1]))
(-1//4)π.₂₁+(1//4)π₁.₂+(-1//4)π₂.₁+(1//4)π₂₁.
julia> Pi(p([2],[1]))[[2],[1]] # you can get a coefficient by indexing
-1//4The function Mvp converts a wreath symmetric function to a symmetric polynomial using a different set of variables for each factor of the tensor product:
julia> Mvp(p(3)⊠p(2))
Mvp{Int64}: x₁³y₁²+x₁³y₂²+x₂³y₁²+x₂³y₂²+x₃³y₁²+x₃³y₂²For the scalar product the bases p and Pi are orthogonal and the basis s is orthonormal
julia> scalar_product(Pi([1],[1]),Pi([1],[1]))
4
julia> scalar_product(p([1],[1]),p([1],[1]))
1FinitePosets.:⊗ — Method
a⊗b is the inner product of the symmetric functions a and b
Chevie.Chars.scalar_product — Method
scalar_product(a,b) the scalar product of the symmetric functions a and b
Chevie.SymFuncs.plethysm — Function
plethysm(a::SymFunc,b::SymFunc) or a[b].
Plethysm is an operation which associates to every symmetric function f a function g↦f[g] on the ring of symmetric functions which is defined by the rules
(f₁+f₂)[g]=f₁[g]+f₂[g]f₁*f₂[g]=f₁[g]*f₂[g]pₙ[g₁+g₂]=pₙ[g₁]+[g₂]pₙ[g₁*g₂]=pₙ[g₁]*[g₂]pₙ[pₘ]=pₙₘ
In addition, for Mvp or Frac{Mvp} coefficients, g↦pₙ[g] is no more an algebra homomorphism but acts semi-linearly. If a is an Mvp or a Frac{Mvp} we have pₙ[a]=SymFuncs.pow(a,n) where Symfuncs.pow(a,n) is the operation which raises all variables of a to the n-th power.
julia> @Mvp u,v
julia> p(3)[(u+v^2)p()]
(u³+v⁶)p₋
julia> p(3,2)[(u+v^2)p()]
(u⁵+u³v⁴+u²v⁶+v¹⁰)p₋We implement also the plethysm for hyperoctahedral groups, which associates to each element f of R₂ a function R₂⊗R₂→R₂:(f₀,f₁)↦ f[f₀,f₁]) which is defined by the rules:
(f+f')[f₀,f₁]=f[f₀,f₁]+f'[f₀,f₁](f*f')[f₀,f₁]=f[f₀,f₁]*f'[f₀,f₁](pₙ⊠1)[f₀,f₁]=(pₙ⊠1)[f₀,0](pₙ⊠1)[f₀+f'₀,0]=(pₙ⊠1)[f₀,0]+(pₙ⊠1)[f'₀,0](pₙ⊠1)[a⊠b,0]=pₙ[a]⊠pₙ[b](1⊠pₙ)[f₀,f₁]=(1⊠pₙ)[0,f₁](1⊠pₙ)[0,f₁+f'₁]=(1⊠pₙ)[0,f₁]+(1⊠pₙ)[0,f'₁](1⊠pₙ)[0,a⊠b]=pₙ[a]⊠pₙ[b]
julia> s([1],[1])[p(1)⊠p()+u*p()⊠p(1),p(1)⊠p()+v*p()⊠p(1)]
uvs.₁₁+uvs.₂+(u+v)s₁.₁+s₁₁.+s₂.Chevie.SymFuncs.π — Function
π(λ::PartitionTuple) Normalized characteristic function of a class
The basis π represents the characteristic function of the class parameterized by the e-tuple of partitions λ times the cardinality of the centralizer in Gₑ,₁,ₙ of an element of that class (where n is the rank of λ). This cardinality can be obtained by Symbols.z(λ).
It can be related to the basis p as follows: both bases satisfy the property that the product does the union of the partition tuples: p(λ)*p(μ)==p(union(λ,μ)) and similarly for π. And if [n]ᵢ represents the PartitionTuple which is empty at all places excepted at the place i where it is the partition [n] we have
$p(π([n]ᵢ))=∑_{j=1}^{j=e}ζ_e^{(1-j)*(i-1)}p([n]ⱼ)$
and
$π(p([n]ᵢ))=(∑_{j=1}^{j=e}ζ_e^{(j-1)*(i-1)}π([n]ⱼ))/e$
julia> p(Pi(Int[],Int[],[3],Int[]))
-ζ₄p...₃-p..₃.+ζ₄p.₃..+p₃...