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 `B_n^{(1)}`.
Part of the (internal) classes which runs the bijection between rigged configurations and KR tableaux of type `B_n^{(1)}`.
AUTHORS:
- Travis Scrimshaw (2012-12-21): Initial version
TESTS::
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['B', 3, 1], [[2,1]]) sage: from sage.combinat.rigged_configurations.bij_type_B import KRTToRCBijectionTypeB sage: bijection = KRTToRCBijectionTypeB(KRT(pathlist=[[-1,2]])) sage: TestSuite(bijection).run() sage: RC = RiggedConfigurations(['B', 3, 1], [[2, 1]]) sage: from sage.combinat.rigged_configurations.bij_type_B import RCToKRTBijectionTypeB sage: bijection = RCToKRTBijectionTypeB(RC(partition_list=[[],[],[]])) sage: TestSuite(bijection).run() """
#***************************************************************************** # Copyright (C) 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 `B_n^{(1)}`. """ """ Run the bijection from a tensor product of KR tableaux to a rigged configuration.
INPUT:
- ``tp_krt`` -- A tensor product of KR tableaux
- ``verbose`` -- (Default: ``False``) Display each step in the bijection
EXAMPLES::
sage: from sage.combinat.rigged_configurations.bij_type_B import KRTToRCBijectionTypeB sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['B', 3, 1], [[2, 1]]) sage: KRTToRCBijectionTypeB(KRT(pathlist=[[0,3]])).run() <BLANKLINE> 0[ ]0 <BLANKLINE> -1[ ]-1 -1[ ]-1 <BLANKLINE> 0[]0 <BLANKLINE> sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['B', 3, 1], [[3, 1]]) sage: KRTToRCBijectionTypeB(KRT(pathlist=[[-2,3,1]])).run() <BLANKLINE> (/) <BLANKLINE> -1[ ]-1 <BLANKLINE> 0[]0 <BLANKLINE>
TESTS:
Check that :trac:`19384` is fixed::
sage: RC = RiggedConfigurations(['B',3,1], [[3,1],[3,1]]) sage: RC._test_bijection() sage: RC = RiggedConfigurations(['B',3,1], [[1,1],[3,1],[1,1]]) sage: RC._test_bijection() """ from sage.combinat.rigged_configurations.tensor_product_kr_tableaux_element \ import TensorProductOfKirillovReshetikhinTableauxElement
# Check if it is a spinor # Perform the spinor bijection by converting to type A_{2n-1}^{(2)} # doing the bijection there and pulling back
print("====================") if len(self.cur_path) == 0: print(repr([])) # Special case for displaying when the rightmost factor is a spinor else: print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path))) print("--------------------") print(repr(self.ret_rig_con)) print("--------------------\n") print("Applying doubling map")
# Convert to a type A_{2n-1}^{(2)} RC # Convert the n-th partition into a regular rigged partition self.ret_rig_con[-1].rigging, self.ret_rig_con[-1].vacancy_numbers) # Placeholder element
# Perform the type A_{2n-1}^{(2)} bijection # Iterate through the columns
# Note that we do not need to worry about iterating over columns # (see previous note about the data structure).
print("====================") print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), bij.cur_path))) print("--------------------") print(repr(bij.ret_rig_con)) print("--------------------\n")
# Build the next state
# 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
print("====================") print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), bij.cur_path))) print("--------------------") print(repr(bij.ret_rig_con)) print("--------------------\n") print("Applying halving map")
# Convert back to a type B_n^{(1)} # Make it mutable so we don't have to keep making copies, at the # end of the bijection, we will make it immutable again else: # Perform the regular type B_n^{(1)} bijection # Iterate through the columns
# Note that we do not need to worry about iterating over columns # (see previous note about the data structure).
print("====================") print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path))) print("--------------------") print(repr(self.ret_rig_con)) print("--------------------\n")
# Build the next state
# If we've split off a column, we need to merge the current column # to the current crystal tableau print("====================") print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path))) print("--------------------") print(repr(self.ret_rig_con)) print("--------------------\n") print("Applying column merge")
# And perform the inverse column splitting map on the RC
r""" Build the next state for type `B_n^{(1)}`.
TESTS::
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['B', 3, 1], [[2,1]]) sage: from sage.combinat.rigged_configurations.bij_type_B import KRTToRCBijectionTypeB sage: bijection = KRTToRCBijectionTypeB(KRT(pathlist=[[-1,2]])) 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) """
# If it is a regular value, we follow the A_n rules
# Special case for 0 else:
# Check to see if we need to make the new string quasi-singular else: max_width = -1
# Check if we need to make the new string at n quasi-singular # Note that max width is 1 less than the corresponding string length and p.vacancy_numbers[j] == p.rigging[j]: j += 1
# Follow regular A_n rules
# Always add a cell to the first singular value in the first # tableau we are updating. else:
# Add cells similar to type A_n but we move to the right until n
# Handle the special behavior at n
# Find either the quasi-singular string and the next largest singular, # the largest singular string if smaller than the max width # or the two largest singular strings # Note, case_QS and singular_max_width will never both be True # If we are in case (QS), we will be adding a box # If we have not found a (quasi)singular string, we must add 2 boxes # Go through our partition until we find a length of greater than 2
p._list[i] += 1 p.rigging[i] = None width_n = max_width + 1 else: # Add 2 boxes p.rigging[j+1] = p.rigging[j] # Shuffle it along j -= 1
width_n = p._list[i] break # If we can't add 2 boxes, we must be in case (QS)
# There are 2 possibilities, case (S) and case (QS), we might need # to attempt both # Make a *deep* copy of the element # We attempt case (S) first
# We need to do the next partition in order to determine the step at n else: max_width = -1
# If we need to make the smaller added string quasisingular # Note that max width is 1 less than the corresponding string length for i in range(num_rows): if p._list[i] == width_n: j = i+1 while j < num_rows and p._list[j] == width_n \ and p.vacancy_numbers[j] == p.rigging[j]: j += 1 p.rigging[j-1] -= 1 break
# Continue back following the regular A_n rules
# Update the final rigged partitions
for a in range(pos_val-1, tableau_height): self._update_vacancy_nums(a) self._update_partition_values(a) if pos_val > 1: self._update_vacancy_nums(pos_val - 2) self._update_partition_values(pos_val - 2)
except Exception: self.other_outcome(cp, pos_val, width_n)
r""" Do the other case `(QS)` possibility.
This arises from the ambiguity when we found a singular string at the max width in `\nu^{(n)}`. We had first attempted case `(S)`, and if that resulted in an invalid rigged configuration, we now finish the bijection using case `(QS)`.
EXAMPLES::
sage: RC = RiggedConfigurations(['B',3,1], [[2,1],[1,2]]) sage: rc = RC(partition_list=[[2,1], [2,1,1], [5,1]]) sage: t = rc.to_tensor_product_of_kirillov_reshetikhin_tableaux() sage: t.to_rigged_configuration() == rc # indirect doctest True """ n = self.n tableau_height = len(self.cur_path[0]) - 1 self.ret_rig_con = rc
# We need to do the next partition in order to determine the step at n max_width = self.ret_rig_con[n-2].insert_cell(width_n // 2)
# We now attempt case (QS) case_QS = False p = self.ret_rig_con[n-1] num_rows = len(p) for i in range(len(p._list)): if p._list[i] == width_n: p._list[i] += 1 p.rigging[i] = None case_QS = True break if not case_QS: # we have not added a box yet p._list.append(1) p.rigging.append(None) p.vacancy_numbers.append(None) case_QS = True width_n += 1
self._update_vacancy_nums(n - 1) self._update_partition_values(n - 1)
# If we need to make the smaller added string quasisingular # Note that max width is 1 less than the corresponding string length if case_QS and max_width*2 + 1 != width_n: for i in range(num_rows): if p._list[i] == width_n: j = i+1 while j < num_rows and p._list[j] == width_n \ and p.vacancy_numbers[j] == p.rigging[j]: j += 1 p.rigging[j-1] -= 1 break
# Continue back following the regular A_n rules for a in reversed(range(tableau_height, n - 2)): max_width = self.ret_rig_con[a].insert_cell(max_width) self._update_vacancy_nums(a + 1) self._update_partition_values(a + 1)
# Update the final rigged partitions if tableau_height < n: self._update_vacancy_nums(tableau_height) self._update_partition_values(tableau_height)
assert pos_val > 0 if pos_val <= tableau_height: for a in range(pos_val-1, tableau_height): self._update_vacancy_nums(a) self._update_partition_values(a) if pos_val > 1: self._update_vacancy_nums(pos_val - 2) self._update_partition_values(pos_val - 2) elif tableau_height > 0: self._update_vacancy_nums(tableau_height - 1) self._update_partition_values(tableau_height - 1)
r""" Specific implementation of the bijection from rigged configurations to tensor products of KR tableaux for type `B_n^{(1)}`. """ """ Run the bijection from rigged configurations to tensor product of KR tableaux for type `B_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(['B', 3, 1], [[2, 1]]) sage: from sage.combinat.rigged_configurations.bij_type_B import RCToKRTBijectionTypeB sage: RCToKRTBijectionTypeB(RC(partition_list=[[1],[1,1],[1]])).run() [[3], [0]]
sage: RC = RiggedConfigurations(['B', 3, 1], [[3, 1]]) sage: x = RC(partition_list=[[],[1],[1]]) sage: RCToKRTBijectionTypeB(x).run() [[1], [3], [-2]] sage: bij = RCToKRTBijectionTypeB(x) sage: bij.run(build_graph=True) [[1], [3], [-2]] sage: bij._graph Digraph on 6 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.
# Check to see if we are a spinor # Perform the spinor bijection by converting to type A_{2n-1}^{(2)} # doing the bijection there and pulling back
# Convert to a type A_{2n-1}^{(2)} RC print("====================") print(repr(RC(*self.cur_partitions, use_vacancy_numbers=True))) print("--------------------") print(ret_crystal_path) print("--------------------\n") print("Applying doubling map\n") # Convert the n-th partition into a regular rigged partition self.cur_partitions[-1].rigging, self.cur_partitions[-1].vacancy_numbers)
# Perform the type A_{2n-1}^{(2)} bijection
# 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
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)), 'ls'])
print("====================") print(repr(RC(*bij.cur_partitions, use_vacancy_numbers=True))) print("--------------------") print(ret_crystal_path) print("--------------------\n")
# Make sure we have a crystal letter
# Convert the n-th partition back into the special type B one
# Convert back to a type B_n^{(1)} print("====================") print(repr(self.rigged_con.parent()(*bij.cur_partitions, use_vacancy_numbers=True))) print("--------------------") print(ret_crystal_path) print("--------------------\n") print("Applying halving map\n")
else: # Perform the regular type B_n^{(1)} bijection
# Iterate over each column # Split off a new column if necessary print("====================") print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True))) print("--------------------") print(ret_crystal_path) print("--------------------\n") print("Applying column split")
# Perform the corresponding splitting map on rigged configurations # All it does is update the vacancy numbers on the RC side
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")
# Make sure we have a crystal letter
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)])
self._graph.set_latex_options(format="dot2tex", edge_labels=True)
r""" Build the next state for type `B_n^{(1)}`.
TESTS::
sage: RC = RiggedConfigurations(['B', 3, 1], [[2, 1]]) sage: from sage.combinat.rigged_configurations.bij_type_B import RCToKRTBijectionTypeB sage: bijection = RCToKRTBijectionTypeB(RC(partition_list=[[1],[1,1],[1]])) sage: bijection.next_state(0) 0 """
# Calculate the rank and ell values
else:
# Special case for n # Modified version of _find_singular_string() and partition.vacancy_numbers[i] == partition.rigging[i]: # Check if the block is singular as well if partition[j] != block_size: break elif partition.vacancy_numbers[j] == partition.rigging[j]: case_Q = False ell[2*n-1] = j last_size = partition[j] case_S = True break break # Now check for case QS
else:
# Now go back # Modified form of _find_singular_string end = len(self.cur_partitions[a]) self.cur_partitions[a].vacancy_numbers[i] == self.cur_partitions[a].rigging[i]:
else:
# Determine the new rigged configuration by removing boxes from the # selected string and then making the new string singular
# Determine if we need to make the n-th string quasisingular (ell[2*n-2] is None or self.cur_partitions[n-1][ell[2*n-1]] < 2*self.cur_partitions[n-2][ell[2*n-2]])
else: else:
# Find the place for the quasisingular rigging and self.cur_partitions[n-1].rigging[j] == vac_num: j += 1
|