Symmetric functions

Chevie.SymFuncsModule

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,m

This 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//1

The 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//1

One 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//4

The 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]))
1
source
Chevie.SymFuncs.plethysmFunction

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₂.
source
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₃...
source