Affine factorization crystal of type \(A\) - Combinatorics

Skip to content
Back to top
View this page
Edit this page

# Affine factorization crystal of type \(A\)

class sage.combinat.crystals.affine_factorization.AffineFactorizationCrystal(w, n, x=None)

  Bases: `UniqueRepresentation`, `Parent`

  The crystal on affine factorizations with a cut-point, as introduced by [MS2015].

  INPUT:

  - `w` – an element in an (affine) Weyl group or a skew shape of \(k\)-bounded partitions (if \(k\) was specified)

  - `n` – the number of factors in the factorization

  - `x` – (default: `None`) the cut point; if not specified it is determined as the minimal missing residue in `w`

  - `k` – (default: `None`) positive integer, specifies that `w` is \(k\)-bounded or a \(k+1\)-core when specified

  EXAMPLES:

  Sage

      sage: W = WeylGroup(['A',3,1], prefix='s')
      sage: w = W.from_reduced_word([2,3,2,1])
      sage: B = crystals.AffineFactorization(w,3); B
      Crystal on affine factorizations of type A2 associated to s2*s3*s2*s1
      sage: B.list()
      [(1, s2, s3*s2*s1),
       (1, s3*s2, s3*s1),
       (1, s3*s2*s1, s3),
       (s3, s2, s3*s1),
       (s3, s2*s1, s3),
       (s3*s2, s1, s3),
       (s3*s2*s1, 1, s3),
       (s3*s2*s1, s3, 1),
       (s3*s2, 1, s3*s1),
       (s3*s2, s3, s1),
       (s3*s2, s3*s1, 1),
       (s2, 1, s3*s2*s1),
       (s2, s3, s2*s1),
       (s2, s3*s2, s1),
       (s2, s3*s2*s1, 1)]

  Python

      >>> from sage.all import *
      >>> W = WeylGroup(['A',Integer(3),Integer(1)], prefix='s')
      >>> w = W.from_reduced_word([Integer(2),Integer(3),Integer(2),Integer(1)])
      >>> B = crystals.AffineFactorization(w,Integer(3)); B
      Crystal on affine factorizations of type A2 associated to s2*s3*s2*s1
      >>> B.list()
      [(1, s2, s3*s2*s1),
       (1, s3*s2, s3*s1),
       (1, s3*s2*s1, s3),
       (s3, s2, s3*s1),
       (s3, s2*s1, s3),
       (s3*s2, s1, s3),
       (s3*s2*s1, 1, s3),
       (s3*s2*s1, s3, 1),
       (s3*s2, 1, s3*s1),
       (s3*s2, s3, s1),
       (s3*s2, s3*s1, 1),
       (s2, 1, s3*s2*s1),
       (s2, s3, s2*s1),
       (s2, s3*s2, s1),
       (s2, s3*s2*s1, 1)]

  We can also access the crystal by specifying a skew shape in terms of \(k\)-bounded partitions:

  Sage

      sage: crystals.AffineFactorization([[3,1,1],[1]], 3, k=3)
      Crystal on affine factorizations of type A2 associated to s2*s3*s2*s1

  [Python]

      >>> from sage.all import *
      >>> crystals.AffineFactorization([[Integer(3),Integer(1),Integer(1)],[Integer(1)]], Integer(3), k=Integer(3))
      Crystal on affine factorizations of type A2 associated to s2*s3*s2*s1

  We can compute the highest weight elements:

  Sage

      sage: hw = [w for w in B if w.is_highest_weight()]
      sage: hw
      [(1, s2, s3*s2*s1)]
      sage: hw[0].weight()
      (3, 1, 0)

  Python

      >>> from sage.all import *
      >>> hw = [w for w in B if w.is_highest_weight()]
      >>> hw
      [(1, s2, s3*s2*s1)]
      >>> hw[Integer(0)].weight()
      (3, 1, 0)

  And show that this crystal is isomorphic to the tableau model of the same weight:

  Sage

      sage: C = crystals.Tableaux(['A',2],shape=[3,1])
      sage: GC = C.digraph()
      sage: GB = B.digraph()
      sage: GC.is_isomorphic(GB, edge_labels=True)
      True

  [Python]

      >>> from sage.all import *
      >>> C = crystals.Tableaux(['A',Integer(2)],shape=[Integer(3),Integer(1)])
      >>> GC = C.digraph()
      >>> GB = B.digraph()
      >>> GC.is_isomorphic(GB, edge_labels=True)
      True

  The crystal operators themselves move elements between adjacent factors:

  Sage

      sage: b = hw[0];b
      (1, s2, s3*s2*s1)
      sage: b.f(1)
      (1, s3*s2, s3*s1)

  Python

      >>> from sage.all import *
      >>> b = hw[Integer(0)];b
      (1, s2, s3*s2*s1)
      >>> b.f(Integer(1))
      (1, s3*s2, s3*s1)

  The cut point \(x\) is not supposed to occur in the reduced words for \(w\):

  Sage

      sage: B = crystals.AffineFactorization([[3,2],[2]],4,x=0,k=3)
      Traceback (most recent call last):
      ...
      ValueError: x cannot be in reduced word of s0*s3*s2

  [Python]

      >>> from sage.all import *
      >>> B = crystals.AffineFactorization([[Integer(3),Integer(2)],[Integer(2)]],Integer(4),x=Integer(0),k=Integer(3))
      Traceback (most recent call last):
      ...
      ValueError: x cannot be in reduced word of s0*s3*s2

  class Element

    Bases: `ElementWrapper`

    bracketing(i)

      Removes all bracketed letters between \(i\)-th and \(i+1\)-th entry.

      EXAMPLES:

      Sage

          sage: B = crystals.AffineFactorization([[3,1],[1]], 3, k=3, x=4)
          sage: W = B.w.parent()
          sage: t = B((W.one(),W.from_reduced_word([3]),W.from_reduced_word([2,1]))); t
          (1, s3, s2*s1)
          sage: t.bracketing(1)
          [[3], [2, 1]]

      Python

          >>> from sage.all import *
          >>> B = crystals.AffineFactorization([[Integer(3),Integer(1)],[Integer(1)]], Integer(3), k=Integer(3), x=Integer(4))
          >>> W = B.w.parent()
          >>> t = B((W.one(),W.from_reduced_word([Integer(3)]),W.from_reduced_word([Integer(2),Integer(1)]))); t
          (1, s3, s2*s1)
          >>> t.bracketing(Integer(1))
          [[3], [2, 1]]

    e(i)

      Return the action of \(e_i\) on `self`.

      EXAMPLES:

      Sage

          sage: B = crystals.AffineFactorization([[3,1],[1]], 4, k=3)
          sage: W = B.w.parent()
          sage: t = B((W.one(),W.one(),W.from_reduced_word([3]),W.from_reduced_word([2,1]))); t
          (1, 1, s3, s2*s1)
          sage: t.e(1)
          (1, 1, 1, s3*s2*s1)

      Python

          >>> from sage.all import *
          >>> B = crystals.AffineFactorization([[Integer(3),Integer(1)],[Integer(1)]], Integer(4), k=Integer(3))
          >>> W = B.w.parent()
          >>> t = B((W.one(),W.one(),W.from_reduced_word([Integer(3)]),W.from_reduced_word([Integer(2),Integer(1)]))); t
          (1, 1, s3, s2*s1)
          >>> t.e(Integer(1))
          (1, 1, 1, s3*s2*s1)

    f(i)

      Return the action of \(f_i\) on `self`.

      EXAMPLES:

      Sage

          sage: B = crystals.AffineFactorization([[3,1],[1]], 4, k=3)
          sage: W = B.w.parent()
          sage: t = B((W.one(),W.one(),W.from_reduced_word([3]),W.from_reduced_word([2,1]))); t
          (1, 1, s3, s2*s1)
          sage: t.f(2)
          (1, s3, 1, s2*s1)
          sage: t.f(1)
          (1, 1, s3*s2, s1)

      Python

          >>> from sage.all import *
          >>> B = crystals.AffineFactorization([[Integer(3),Integer(1)],[Integer(1)]], Integer(4), k=Integer(3))
          >>> W = B.w.parent()
          >>> t = B((W.one(),W.one(),W.from_reduced_word([Integer(3)]),W.from_reduced_word([Integer(2),Integer(1)]))); t
          (1, 1, s3, s2*s1)
          >>> t.f(Integer(2))
          (1, s3, 1, s2*s1)
          >>> t.f(Integer(1))
          (1, 1, s3*s2, s1)

    to_tableau()

      Return the tableau representation of `self`.

      Uses the recording tableau of a minor variation of Edelman-Greene insertion. See Theorem 4.11 in [MS2015].

      EXAMPLES:

      Sage

          sage: W = WeylGroup(['A',3,1], prefix='s')
          sage: w = W.from_reduced_word([2,1,3,2])
          sage: B = crystals.AffineFactorization(w,3)
          sage: for x in B:
          ....:     x
          ....:     x.to_tableau().pp()
          (1, s2*s1, s3*s2)
            1  1
            2  2
          (s2, s1, s3*s2)
            1  1
            2  3
          (s2, s3*s1, s2)
            1  2
            2  3
          (s2*s1, 1, s3*s2)
            1  1
            3  3
          (s2*s1, s3, s2)
            1  2
            3  3
          (s2*s1, s3*s2, 1)
            2  2
            3  3

      Python

          >>> from sage.all import *
          >>> W = WeylGroup(['A',Integer(3),Integer(1)], prefix='s')
          >>> w = W.from_reduced_word([Integer(2),Integer(1),Integer(3),Integer(2)])
          >>> B = crystals.AffineFactorization(w,Integer(3))
          >>> for x in B:
          ...     x
          ...     x.to_tableau().pp()
          (1, s2*s1, s3*s2)
            1  1
            2  2
          (s2, s1, s3*s2)
            1  1
            2  3
          (s2, s3*s1, s2)
            1  2
            2  3
          (s2*s1, 1, s3*s2)
            1  1
            3  3
          (s2*s1, s3, s2)
            1  2
            3  3
          (s2*s1, s3*s2, 1)
            2  2
            3  3

class sage.combinat.crystals.affine_factorization.FactorizationToTableaux(parent, cartan_type=None, virtualization=None, scaling_factors=None)

  Bases: `CrystalMorphism`

  is_embedding()

    alias of `is_isomorphism()`.

  is_isomorphism()

    Return `True` as this is an isomorphism.

    EXAMPLES:

    Sage

        sage: W = WeylGroup(['A',3,1], prefix='s')
        sage: w = W.from_reduced_word([2,1,3,2])
        sage: B = crystals.AffineFactorization(w,3)
        sage: phi = B._tableaux_isomorphism
        sage: phi.is_isomorphism()
        True

    Python

        >>> from sage.all import *
        >>> W = WeylGroup(['A',Integer(3),Integer(1)], prefix='s')
        >>> w = W.from_reduced_word([Integer(2),Integer(1),Integer(3),Integer(2)])
        >>> B = crystals.AffineFactorization(w,Integer(3))
        >>> phi = B._tableaux_isomorphism
        >>> phi.is_isomorphism()
        True

  is_surjective()

    alias of `is_isomorphism()`.

sage.combinat.crystals.affine_factorization.affine_factorizations(w, l, weight=None)

  Return all factorizations of \(w\) into \(l\) factors or of weight `weight`.

  INPUT:

  - `w` – an (affine) permutation or element of the (affine) Weyl group

  - `l` – nonnegative integer

  - `weight` – (default: `None`) tuple of nonnegative integers specifying the length of the factors

  EXAMPLES:

  Sage

      sage: W = WeylGroup(['A',3,1], prefix='s')
      sage: w = W.from_reduced_word([3,2,3,1,0,1])
      sage: from sage.combinat.crystals.affine_factorization import affine_factorizations
      sage: affine_factorizations(w,4)
      [[s2, s3, s0, s2*s1*s0],
      [s2, s3, s2*s0, s1*s0],
      [s2, s3, s2*s1*s0, s1],
      [s2, s3*s2, s0, s1*s0],
      [s2, s3*s2, s1*s0, s1],
      [s2, s3*s2*s1, s0, s1],
      [s3*s2, s3, s0, s1*s0],
      [s3*s2, s3, s1*s0, s1],
      [s3*s2, s3*s1, s0, s1],
      [s3*s2*s1, s3, s0, s1]]

      sage: W = WeylGroup(['A',2], prefix='s')
      sage: w0 = W.long_element()
      sage: affine_factorizations(w0,3)
      [[1, s1, s2*s1],
      [1, s2*s1, s2],
      [s1, 1, s2*s1],
      [s1, s2, s1],
      [s1, s2*s1, 1],
      [s2, s1, s2],
      [s2*s1, 1, s2],
      [s2*s1, s2, 1]]
      sage: affine_factorizations(w0,3,(0,1,2))
      [[1, s1, s2*s1]]
      sage: affine_factorizations(w0,3,(1,1,1))
      [[s1, s2, s1], [s2, s1, s2]]
      sage: W = WeylGroup(['A',3], prefix='s')
      sage: w0 = W.long_element()
      sage: affine_factorizations(w0,6,(1,1,1,1,1,1))  # long time
      [[s1, s2, s1, s3, s2, s1],
      [s1, s2, s3, s1, s2, s1],
      [s1, s2, s3, s2, s1, s2],
      [s1, s3, s2, s1, s3, s2],
      [s1, s3, s2, s3, s1, s2],
      [s2, s1, s2, s3, s2, s1],
      [s2, s1, s3, s2, s1, s3],
      [s2, s1, s3, s2, s3, s1],
      [s2, s3, s1, s2, s1, s3],
      [s2, s3, s1, s2, s3, s1],
      [s2, s3, s2, s1, s2, s3],
      [s3, s1, s2, s1, s3, s2],
      [s3, s1, s2, s3, s1, s2],
      [s3, s2, s1, s2, s3, s2],
      [s3, s2, s1, s3, s2, s3],
      [s3, s2, s3, s1, s2, s3]]
      sage: affine_factorizations(w0,6,(0,0,0,1,2,3))
      [[1, 1, 1, s1, s2*s1, s3*s2*s1]]

  Python

      >>> from sage.all import *
      >>> W = WeylGroup(['A',Integer(3),Integer(1)], prefix='s')
      >>> w = W.from_reduced_word([Integer(3),Integer(2),Integer(3),Integer(1),Integer(0),Integer(1)])
      >>> from sage.combinat.crystals.affine_factorization import affine_factorizations
      >>> affine_factorizations(w,Integer(4))
      [[s2, s3, s0, s2*s1*s0],
      [s2, s3, s2*s0, s1*s0],
      [s2, s3, s2*s1*s0, s1],
      [s2, s3*s2, s0, s1*s0],
      [s2, s3*s2, s1*s0, s1],
      [s2, s3*s2*s1, s0, s1],
      [s3*s2, s3, s0, s1*s0],
      [s3*s2, s3, s1*s0, s1],
      [s3*s2, s3*s1, s0, s1],
      [s3*s2*s1, s3, s0, s1]]

      >>> W = WeylGroup(['A',Integer(2)], prefix='s')
      >>> w0 = W.long_element()
      >>> affine_factorizations(w0,Integer(3))
      [[1, s1, s2*s1],
      [1, s2*s1, s2],
      [s1, 1, s2*s1],
      [s1, s2, s1],
      [s1, s2*s1, 1],
      [s2, s1, s2],
      [s2*s1, 1, s2],
      [s2*s1, s2, 1]]
      >>> affine_factorizations(w0,Integer(3),(Integer(0),Integer(1),Integer(2)))
      [[1, s1, s2*s1]]
      >>> affine_factorizations(w0,Integer(3),(Integer(1),Integer(1),Integer(1)))
      [[s1, s2, s1], [s2, s1, s2]]
      >>> W = WeylGroup(['A',Integer(3)], prefix='s')
      >>> w0 = W.long_element()
      >>> affine_factorizations(w0,Integer(6),(Integer(1),Integer(1),Integer(1),Integer(1),Integer(1),Integer(1)))  # long time
      [[s1, s2, s1, s3, s2, s1],
      [s1, s2, s3, s1, s2, s1],
      [s1, s2, s3, s2, s1, s2],
      [s1, s3, s2, s1, s3, s2],
      [s1, s3, s2, s3, s1, s2],
      [s2, s1, s2, s3, s2, s1],
      [s2, s1, s3, s2, s1, s3],
      [s2, s1, s3, s2, s3, s1],
      [s2, s3, s1, s2, s1, s3],
      [s2, s3, s1, s2, s3, s1],
      [s2, s3, s2, s1, s2, s3],
      [s3, s1, s2, s1, s3, s2],
      [s3, s1, s2, s3, s1, s2],
      [s3, s2, s1, s2, s3, s2],
      [s3, s2, s1, s3, s2, s3],
      [s3, s2, s3, s1, s2, s3]]
      >>> affine_factorizations(w0,Integer(6),(Integer(0),Integer(0),Integer(0),Integer(1),Integer(2),Integer(3)))
      [[1, 1, 1, s1, s2*s1, s3*s2*s1]]