Fock Space

AUTHORS:

  • Travis Scrimshaw (2013-05-03): Initial version
sage.algebras.quantum_groups.fock_space.FockSpace

The (fermionic) Fock space of \(U_q(\widehat{\mathfrak{sl}}_n)\) with multicharge \((\gamma_1, \ldots, \gamma_m)\).

Fix a positive integer \(n > 1\) and fix a sequence \(\gamma = (\gamma_1, \ldots, \gamma_m)\), where \(\gamma_i \in \ZZ / n \ZZ\). (fermionic) Fock space \(\mathcal{F}\) with multicharge \(\gamma\) is a \(U_q(\widehat{\mathfrak{gl}}_n)\)-representation with a basis \(\{ |\lambda \rangle \}\), where \(\lambda\) is a partition tuple of level \(m\). By considering \(\mathcal{F}\) as a \(U_q(\widehat{\mathfrak{sl}}_n)\)-representation, it is not irreducible, but the submodule generated by \(| \emptyset^m \rangle\) is isomorphic to the highest weight module \(V(\mu)\), where the highest weight \(\mu = \sum_i \Lambda_{\gamma_i}\).

Let \(R_i(\lambda)\) and \(A_i(\lambda)\) be the set of removable and addable, respectively, \(i\)-cells of \(\lambda\), where an \(i\)-cell is a cell of residue \(i\) (i.e., content modulo n). The action of \(U_q(\widehat{\mathfrak{sl}}_n)\) is given as follows:

\[\begin{split}\begin{aligned} e_i | \lambda \rangle & = \sum_{c \in R_i(\lambda)} q^{M_i(\lambda, c)} | \lambda + c \rangle, \\ f_i | \lambda \rangle & = \sum_{c \in A_i(\lambda)} q^{N_i(\lambda, c)} | \lambda - c \rangle, \\ q^{h_i} | \lambda \rangle & = q^{N_i(\lambda)} | \lambda \rangle, \\ q^d | \lambda \rangle & = q^{-N^{(0)}(\lambda)} | \lambda \rangle, \end{aligned}\end{split}\]

where

  • \(M_i(\lambda, c)\) (resp. \(N_i(\lambda, c)\)) is the number of removable (resp. addable) \(i\)-cells of \(\lambda\) below (resp. above) \(c\) minus the number of addable (resp. removable) \(i\)-cells of \(\lambda\) below (resp. above) \(c\),
  • \(N_i(\lambda)\) is the number of addable \(i\)-cells minus the number of removable \(i\)-cells, and
  • \(N^{(0)}(\lambda)\) is the total number of \(0\)-cells of \(\lambda\).

Another interpretation of Fock space is as a semi-infinite wedge product (which each factor we can think of as fermions). This allows a description of the \(U_q(\widehat{\mathfrak{gl}}_n)\) action, as well as an explicit description of the bar involution. In particular, the bar involution is the unique semi-linear map satisfying

  • \(q \mapsto q^{-1}\),
  • \(\overline{| \emptyset \rangle} = | \emptyset \rangle\), and
  • \(\overline{f_i | \lambda \rangle} = f_i \overline{| \lambda \rangle}\).

We then define the canonical basis or (lower) global crystal basis as the unique basis of \(\mathcal{F}\) such that

  • \(\overline{G(\lambda)} = G(\lambda)\),
  • \(G(\lambda) \equiv | \lambda \rangle \mod q \ZZ[q]\).

It is also known that this basis is upper unitriangular with respect to dominance order and that both the natural basis and the canonical basis of \(\mathcal{F}\) are \(\ZZ\)-graded by \(|\lambda|\). Additionally, the transition matrices \((d_{\lambda, \nu})_{\lambda,\nu \vdash n}\) given by

\[G(\nu) = \sum_{\lambda \vdash |\nu|} d_{\lambda,\nu} |\lambda \rangle\]

described the decomposition matrices of the Hecke algebras when restricting to \(V(\mu)\) [Ariki1996].

To go between the canonical basis and the natural basis, for level 1 Fock space, we follow the LLT algorithm [LLT1996]. Indeed, we first construct an basis \(\{ A(\nu) \}\) that is an approximation to the lower global crystal basis, in the sense that it is bar-invariant, and then use Gaussian elimination to construct the lower global crystal basis. For higher level Fock space, we follow [Fayers2010], where the higher level is considered as a tensor product space of the corresponding level 1 Fock spaces.

There are three bases currently implemented:

  • The natural basis: F.
  • The approximation basis that comes from LLT(-type) algorithms: A.
  • The lower global crystal basis: G.

Todo

  • Implement the approximation and lower global crystal bases on all partition tuples.
  • Implement the bar involution.
  • Implement the full \(U_q(\widehat{\mathfrak{gl}})\)-action.

INPUT:

  • n – the value \(n\)
  • multicharge – (default: [0]) the multicharge
  • q – (optional) the parameter \(q\)
  • base_ring – (optional) the base ring containing q

EXAMPLES:

We start by constructing the natural basis and doing some computations:

sage: Fock = FockSpace(3)
sage: F = Fock.natural()
sage: u = F.highest_weight_vector()
sage: u.f(0,2,(1,2),0)
|2, 2, 1> + q*|2, 1, 1, 1>
sage: u.f(0,2,(1,2),0,2)
|3, 2, 1> + q*|3, 1, 1, 1> + q*|2, 2, 2> + q^2*|2, 1, 1, 1, 1>
sage: x = u.f(0,2,(1,2),0,2)
sage: [x.h(i) for i in range(3)]
[q*|3, 2, 1> + q^2*|3, 1, 1, 1> + q^2*|2, 2, 2> + q^3*|2, 1, 1, 1, 1>,
 |3, 2, 1> + q*|3, 1, 1, 1> + q*|2, 2, 2> + q^2*|2, 1, 1, 1, 1>,
 |3, 2, 1> + q*|3, 1, 1, 1> + q*|2, 2, 2> + q^2*|2, 1, 1, 1, 1>]
sage: [x.h_inverse(i) for i in range(3)]
[1/q*|3, 2, 1> + |3, 1, 1, 1> + |2, 2, 2> + q*|2, 1, 1, 1, 1>,
 |3, 2, 1> + q*|3, 1, 1, 1> + q*|2, 2, 2> + q^2*|2, 1, 1, 1, 1>,
 |3, 2, 1> + q*|3, 1, 1, 1> + q*|2, 2, 2> + q^2*|2, 1, 1, 1, 1>]
sage: x.d()
1/q^2*|3, 2, 1> + 1/q*|3, 1, 1, 1> + 1/q*|2, 2, 2> + |2, 1, 1, 1, 1>

Next, we construct the approximation and lower global crystal bases and convert to the natural basis:

sage: A = Fock.A()
sage: G = Fock.G()
sage: F(A[4,2,2,1])
|4, 2, 2, 1> + q*|4, 2, 1, 1, 1>
sage: F(G[4,2,2,1])
|4, 2, 2, 1> + q*|4, 2, 1, 1, 1>
sage: F(A[7,3,2,1,1])
|7, 3, 2, 1, 1> + q*|7, 2, 2, 2, 1> + q^2*|7, 2, 2, 1, 1, 1>
 + q*|6, 3, 3, 1, 1> + q^2*|6, 2, 2, 2, 2> + q^3*|6, 2, 2, 1, 1, 1, 1>
 + q*|5, 5, 2, 1, 1> + q^2*|5, 4, 3, 1, 1> + (q^2+1)*|4, 4, 3, 2, 1>
 + (q^3+q)*|4, 4, 3, 1, 1, 1> + (q^3+q)*|4, 4, 2, 2, 2>
 + (q^4+q^2)*|4, 4, 2, 1, 1, 1, 1> + q*|4, 3, 3, 3, 1>
 + q^2*|4, 3, 2, 1, 1, 1, 1, 1> + q^2*|4, 2, 2, 2, 2, 2>
 + q^3*|4, 2, 2, 2, 1, 1, 1, 1> + q^2*|3, 3, 3, 3, 2>
 + q^3*|3, 3, 3, 1, 1, 1, 1, 1> + q^3*|3, 2, 2, 2, 2, 2, 1>
 + q^4*|3, 2, 2, 2, 2, 1, 1, 1>
sage: F(G[7,3,2,1,1])
|7, 3, 2, 1, 1> + q*|7, 2, 2, 2, 1> + q^2*|7, 2, 2, 1, 1, 1>
 + q*|6, 3, 3, 1, 1> + q^2*|6, 2, 2, 2, 2>
 + q^3*|6, 2, 2, 1, 1, 1, 1> + q*|5, 5, 2, 1, 1>
 + q^2*|5, 4, 3, 1, 1> + q^2*|4, 4, 3, 2, 1>
 + q^3*|4, 4, 3, 1, 1, 1> + q^3*|4, 4, 2, 2, 2>
 + q^4*|4, 4, 2, 1, 1, 1, 1>
sage: A(F(G[7,3,2,1,1]))
A[7, 3, 2, 1, 1] - A[4, 4, 3, 2, 1]
sage: G(F(A[7,3,2,1,1]))
G[7, 3, 2, 1, 1] + G[4, 4, 3, 2, 1]
sage: A(F(G[8,4,3,2,2,1]))
A[8, 4, 3, 2, 2, 1] - A[6, 4, 4, 2, 2, 1, 1] - A[5, 5, 4, 3, 2, 1]
 + ((-q^2-1)/q)*A[5, 4, 4, 3, 2, 1, 1]
sage: G(F(A[8,4,3,2,2,1]))
G[8, 4, 3, 2, 2, 1] + G[6, 4, 4, 2, 2, 1, 1] + G[5, 5, 4, 3, 2, 1]
 + ((q^2+1)/q)*G[5, 4, 4, 3, 2, 1, 1]

We can also construct higher level Fock spaces and perform similar computations:

sage: Fock = FockSpace(3, [1,0])
sage: F = Fock.natural()
sage: A = Fock.A()
sage: G = Fock.G()
sage: F(G[[2,1],[4,1,1]])
|[2, 1], [4, 1, 1]> + q*|[2, 1], [3, 2, 1]>
 + q^2*|[2, 1], [3, 1, 1, 1]> + q^2*|[2], [4, 2, 1]>
 + q^3*|[2], [4, 1, 1, 1]> + q^4*|[2], [3, 2, 1, 1]>
 + q*|[1, 1, 1], [4, 1, 1]> + q^2*|[1, 1, 1], [3, 2, 1]>
 + q^3*|[1, 1, 1], [3, 1, 1, 1]> + q^2*|[1, 1], [3, 2, 2]>
 + q^3*|[1, 1], [3, 1, 1, 1, 1]> + q^3*|[1], [4, 2, 2]>
 + q^4*|[1], [4, 1, 1, 1, 1]> + q^4*|[1], [3, 2, 2, 1]>
 + q^5*|[1], [3, 2, 1, 1, 1]>
sage: A(F(G[[2,1],[4,1,1]]))
A([2, 1], [4, 1, 1]) - A([2], [4, 2, 1])
sage: G(F(A[[2,1],[4,1,1]]))
G([2, 1], [4, 1, 1]) + G([2], [4, 2, 1])

For level \(0\), the truncated Fock space of [GW1999] is implemented. This can be used to improve the speed of the computation of the lower global crystal basis, provided the truncation is not too small:

sage: FS = FockSpace(2)
sage: F = FS.natural()
sage: G = FS.G()
sage: FS3 = FockSpace(2, truncated=3)
sage: F3 = FS3.natural()
sage: G3 = FS3.G()
sage: F(G[6,2,1])
|6, 2, 1> + q*|5, 3, 1> + q^2*|5, 2, 2> + q^3*|5, 2, 1, 1>
 + q*|4, 2, 1, 1, 1> + q^2*|3, 3, 1, 1, 1> + q^3*|3, 2, 2, 1, 1>
 + q^4*|3, 2, 1, 1, 1, 1>
sage: F3(G3[6,2,1])
|6, 2, 1> + q*|5, 3, 1> + q^2*|5, 2, 2>
sage: FS5 = FockSpace(2, truncated=5)
sage: F5 = FS5.natural()
sage: G5 = FS5.G()
sage: F5(G5[6,2,1])
|6, 2, 1> + q*|5, 3, 1> + q^2*|5, 2, 2> + q^3*|5, 2, 1, 1>
 + q*|4, 2, 1, 1, 1> + q^2*|3, 3, 1, 1, 1> + q^3*|3, 2, 2, 1, 1>

REFERENCES:

sage.algebras.quantum_groups.fock_space.FockSpaceBases

The category of bases of a (truncated) Fock space.

sage.algebras.quantum_groups.fock_space.FockSpaceOptions(*get_value, **set_value)

Sets and displays the global options for elements of the Fock space classes. If no parameters are set, then the function returns a copy of the options dictionary.

The options to Fock space can be accessed as the method FockSpaceOptions of FockSpace and related parent classes.

OPTIONS:

  • display – (default: ket) Specifies how terms of the natural basis of Fock space should be printed
    • ket – displayed as a ket in bra-ket notation
    • list – displayed as a list

EXAMPLES:

sage: FS = FockSpace(4)
sage: F = FS.natural()
sage: x = F.an_element()
sage: y = x.f(3,2,2,0,1)
sage: y
((3*q^2+3)/q)*|3, 3, 1> + (3*q^2+3)*|3, 2, 1, 1>
sage: Partitions.options.display = 'diagram'
sage: y
((3*q^2+3)/q)*|3, 3, 1> + (3*q^2+3)*|3, 2, 1, 1>
sage: ascii_art(y)
((3*q^2+3)/q)*|***\  + (3*q^2+3)*|***\
              |*** >             |**  \
              |*  /              |*   /
                                 |*  /
sage: FockSpace.options.display = 'list'
sage: ascii_art(y)
((3*q^2+3)/q)*F    + (3*q^2+3)*F
               ***              ***
               ***              **
               *                *
                                *
sage: Partitions.options.display = 'compact_high'
sage: y
((3*q^2+3)/q)*F3^2,1 + (3*q^2+3)*F3,2,1^2

sage: Partitions.options._reset()
sage: FockSpace.options._reset()

See GlobalOptions for more features of these options.

sage.algebras.quantum_groups.fock_space.FockSpaceTruncated

This is the Fock space given by partitions of length no more than \(k\).

This can be formed as the quotient \(\mathcal{F} / \mathcal{F}_k\), where \(\mathcal{F}_k\) is the submodule spanned by all diagrams of length (strictly) more than \(k\).

We have three bases:

  • The natural basis indexed by trucated \(n\)-regular partitions: F.
  • The approximation basis that comes from LLT(-type) algorithms: A.
  • The lower global crystal basis: G.

See also

FockSpace

EXAMPLES:

sage: F = FockSpace(2, truncated=2)
sage: mg = F.highest_weight_vector()
sage: mg.f(0)
|1>
sage: mg.f(0).f(1)
|2> + q*|1, 1>
sage: mg.f(0).f(1).f(0)
|3>

Compare this to the full Fock space:

sage: F = FockSpace(2)
sage: mg = F.highest_weight_vector()
sage: mg.f(0).f(1).f(0)
|3> + q*|1, 1, 1>

REFERENCES: