Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
r""" Bijection classes for type `D_n^{(1)}`
Part of the (internal) classes which runs the bijection between rigged configurations and KR tableaux of type `D_n^{(1)}`.
AUTHORS:
- Travis Scrimshaw (2011-04-15): Initial version
TESTS::
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[3, 2]])) sage: TestSuite(bijection).run() sage: RC = RiggedConfigurations(['D', 4, 1], [[2, 1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[]])) sage: TestSuite(bijection).run() """
#***************************************************************************** # Copyright (C) 2011, 2012 Travis Scrimshaw <tscrim@ucdavis.edu> # # Distributed under the terms of the GNU General Public License (GPL) # # This code is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # The full text of the GPL is available at: # # http://www.gnu.org/licenses/ #*****************************************************************************
r""" Specific implementation of the bijection from KR tableaux to rigged configurations for type `D_n^{(1)}`.
This inherits from type `A_n^{(1)}` because we use the same methods in some places. """
""" Run the bijection from a tensor product of KR tableaux to a rigged configuration for type `D_n^{(1)}`.
INPUT:
- ``tp_krt`` -- A tensor product of KR tableaux
- ``verbose`` -- (Default: ``False``) Display each step in the bijection
EXAMPLES::
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD sage: KRTToRCBijectionTypeD(KRT(pathlist=[[-3,2]])).run() <BLANKLINE> -1[ ]-1 <BLANKLINE> 2[ ]2 <BLANKLINE> -1[ ]-1 <BLANKLINE> -1[ ]-1 <BLANKLINE> """ from sage.combinat.rigged_configurations.tensor_product_kr_tableaux_element \ import TensorProductOfKirillovReshetikhinTableauxElement
# Iterate through the columns
# Check to see if we are a spinor column print("====================") print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path))) print("--------------------") print(repr(self.ret_rig_con)) print("--------------------\n") print("Applying doubling map")
# This check is needed for the n-1 spin column
print("====================") print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path))) print("--------------------") print(repr(self.ret_rig_con)) print("--------------------\n")
# Build the next state
# Check to see if we are a spinor column print("====================") print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path))) print("--------------------") print(repr(self.ret_rig_con)) print("--------------------\n") print("Applying halving map")
# If we've split off a column, we need to merge the current column # to the current crystal tableau
# And perform the inverse column splitting map on the RC
r""" Build the next state for type `D_n^{(1)}`.
TESTS::
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[5,3]])) sage: bijection.cur_path.insert(0, []) sage: bijection.cur_dims.insert(0, [0, 1]) sage: bijection.cur_path[0].insert(0, [3]) sage: bijection.next_state(3) """ # Note that type D_n only contains the (absolute) values between 1 and n # (unlike type A_n which is 1 to n+1). Thus we only need to subtract 1 # to match the indices. # Also note that we must subtract 1 from n to match the indices as well.
# If it is a regular value, we follow the A_n rules
# If we are inserting n-1 (which will only update nu[a] for a <= # n-1), we need to update the vacancy number of nu[n] as well
# Special case for `\overline{n}` and adding to make height `n` # where we only update the vacancy numbers # This only occurs with `r = n - 1`
else:
# Update the last one and skip a rigged partition
# Update all other effected remaining values
# Always add a cell to the first singular value in the first # tableau we are updating. else: # Special case for `\overline{n-1}` to take the larger of the last two self.ret_rig_con[n - 1][0] + 1 > max_width:
# Add cells similar to type A_n but we move to the right until we reach # the value of n-2
# Handle the special behavior near values of n # Special case when the height will become n
# Go back following the regular A_n rules
# Update the final rigged partitions
self._update_vacancy_nums(pos_val-2) self._update_partition_values(pos_val-2)
r""" Correct the vacancy numbers with special considerations for spinor columns.
This should only be called when we are going to have a (left-most) spinor column of height `n-1` or `n` in type `D^{(1)_n`.
This is a correction for the spinor column where we consider the weight `\overline{\Lambda_k}` where `k = n-1,n` during the spinor bijection. This adds 1 to each of the respective vacancy numbers to account for this.
TESTS::
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[-1,4,3,2]])) sage: bijection.doubling_map() sage: bijection.cur_path.insert(0, []) sage: bijection.cur_dims.insert(0, [0, 1]) sage: bijection.cur_path[0].insert(0, [2]) sage: bijection.next_state(2) # indirect doctest sage: bijection.ret_rig_con <BLANKLINE> -2[ ]-2 <BLANKLINE> (/) <BLANKLINE> (/) <BLANKLINE> (/) <BLANKLINE> """ # The current r value is never greater than the height of the current column # Thus if we do not enter into this if block, then r < height and # we adjust the (n-1)-th partition.
r""" Perform the doubling map of the rigged configuration at the current state of the bijection.
This is the map `B(\Lambda) \hookrightarrow B(2 \Lambda)` which doubles each of the rigged partitions and updates the vacancy numbers accordingly.
TESTS::
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[4,1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[-1,4,3,2]])) sage: bijection.cur_path.insert(0, []) sage: bijection.cur_dims.insert(0, [0, 1]) sage: bijection.cur_path[0].insert(0, [2]) sage: bijection.next_state(2) sage: bijection.ret_rig_con <BLANKLINE> -2[ ]-2 <BLANKLINE> (/) <BLANKLINE> (/) <BLANKLINE> (/) <BLANKLINE> sage: bijection.cur_dims [[0, 1]] sage: bijection.doubling_map() sage: bijection.ret_rig_con <BLANKLINE> -4[ ][ ]-4 <BLANKLINE> (/) <BLANKLINE> (/) <BLANKLINE> (/) <BLANKLINE> sage: bijection.cur_dims [[0, 2]] """
""" Perform the halving map of the rigged configuration at the current state of the bijection.
This is the inverse map to `B(\Lambda) \hookrightarrow B(2 \Lambda)` which halves each of the rigged partitions and updates the vacancy numbers accordingly.
TESTS::
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[4,1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[-1,4,3,2]])) sage: bijection.cur_path.insert(0, []) sage: bijection.cur_dims.insert(0, [0, 1]) sage: bijection.cur_path[0].insert(0, [2]) sage: bijection.next_state(2) sage: test = bijection.ret_rig_con sage: bijection.doubling_map() sage: bijection.halving_map() sage: test == bijection.ret_rig_con True """ # Skip the first column since it is a spinor
r""" Specific implementation of the bijection from rigged configurations to tensor products of KR tableaux for type `D_n^{(1)}`. """ """ Run the bijection from rigged configurations to tensor product of KR tableaux for type `D_n^{(1)}`.
INPUT:
- ``verbose`` -- (default: ``False``) display each step in the bijection - ``build_graph`` -- (default: ``False``) build the graph of each step of the bijection
EXAMPLES::
sage: RC = RiggedConfigurations(['D', 4, 1], [[2, 1]]) sage: x = RC(partition_list=[[1],[1],[1],[1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD sage: RCToKRTBijectionTypeD(x).run() [[2], [-3]] sage: bij = RCToKRTBijectionTypeD(x) sage: bij.run(build_graph=True) [[2], [-3]] sage: bij._graph Digraph on 3 vertices """
# This is technically bad, but because the first thing we do is append # an empty list to ret_crystal_path, we correct this. We do it this # way so that we do not have to remove an empty list after the # bijection has been performed.
# Iterate over each column # Split off a new column if necessary
# Perform the corresponding splitting map on rigged configurations # All it does is update the vacancy numbers on the RC side
# Check to see if we are a spinor print("====================") print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True))) print("--------------------") print(ret_crystal_path) print("--------------------\n") print("Applying doubling map")
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True) self._graph.append([self._graph[-1][1], (y, len(self._graph)), '2x'])
print("====================") print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True))) print("--------------------") print(ret_crystal_path) print("--------------------\n") b = -self.n
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True) self._graph.append([self._graph[-1][1], (y, len(self._graph)), letters(b)])
# Corrections for spinor and self.cur_dims[0][0] == self.n - 1: b = -(self.n-1)
# Make sure we have a crystal letter
# Check to see if we were a spinor print("====================") print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True))) print("--------------------") print(ret_crystal_path) print("--------------------\n") print("Applying halving map")
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True) self._graph.append([self._graph[-1][1], (y, len(self._graph)), '1/2x'])
self._graph.set_latex_options(format="dot2tex", edge_labels=True)
r""" Build the next state for type `D_n^{(1)}`.
TESTS::
sage: RC = RiggedConfigurations(['D', 4, 1], [[2, 1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[1,1],[1],[1]])) sage: bijection.next_state(0) 1 """
# Calculate the rank and ell values
else:
# Special case from height `n` spinor with `r = n-1` else: # Special case for height `n-1` spinor last_size = self.cur_partitions[n - 1][ell[n - 1]] else: # Do the special cases when we've reached n - 2
else: else: else:
# Now go back # Modified form of _find_singular_string self.cur_partitions[a].vacancy_numbers[i] == self.cur_partitions[a].rigging[i]:
else:
# Determine the new rigged configuration by removing a box from the selected # string and then making the new string singular
self.cur_partitions[a - 1].vacancy_numbers[ret_row] self.cur_partitions[a - 1].vacancy_numbers[ret_row_bar]
# Special behavior for all a > n-3
self.cur_partitions[n - 3].vacancy_numbers[ret_row] self.cur_partitions[n - 3].vacancy_numbers[ret_row_bar]
self.cur_partitions[n - 2].vacancy_numbers[ret_row_next]
self.cur_partitions[n - 1].vacancy_numbers[ret_row_bar_next]
""" Perform the doubling map of the rigged configuration at the current state of the bijection.
This is the map `B(\Lambda) \hookrightarrow B(2 \Lambda)` which doubles each of the rigged partitions and updates the vacancy numbers accordingly.
TESTS::
sage: RC = RiggedConfigurations(['D', 4, 1], [[4, 1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[1]])) sage: bijection.cur_partitions [(/) , (/) , (/) , -1[ ]-1 ] sage: bijection.doubling_map() sage: bijection.cur_partitions [(/) , (/) , (/) , -2[ ][ ]-2 ] """ # Skip the first column since it is a spinor
""" Perform the halving map of the rigged configuration at the current state of the bijection.
This is the inverse map to `B(\Lambda) \hookrightarrow B(2 \Lambda)` which halves each of the rigged partitions and updates the vacancy numbers accordingly.
TESTS::
sage: RC = RiggedConfigurations(['D', 4, 1], [[4, 1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[1]])) sage: test = bijection.cur_partitions sage: bijection.doubling_map() sage: bijection.halving_map() sage: test == bijection.cur_partitions True """
""" Correct the vacancy numbers with special considerations for spinor columns.
This should only be called when we are going to have a (left-most) spinor column of height `n-1` or `n`.
This is a correction for the spinor column where we consider the weight `\overline{\Lambda_k}` where `k = n-1,n` during the spinor bijection. This adds 1 to each of the respective vacancy numbers to account for this.
TESTS::
sage: RC = RiggedConfigurations(['D', 4, 1], [[4, 1]]) sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[1]])) sage: bijection.doubling_map() sage: bijection.next_state(4) # indirect doctest -4 """
|