def __init__(self, cartan_type, la, mu): """ Initialize ``self``. TESTS:: sage: K = crystals.KacModule(['A', [2,1]], [2,1], [1]) sage: TestSuite(K).run() """ self._cartan_type = cartan_type self._la = la self._mu = mu Parent.__init__(self, category=RegularSuperCrystals()) self._S = CrystalOfOddNegativeRoots(self._cartan_type) self._dual = CrystalOfTableaux(['A', self._cartan_type.m], shape=la) self._reg = CrystalOfTableaux(['A', self._cartan_type.n], shape=mu) data = (self._S.module_generators[0], self._dual.module_generators[0], self._reg.module_generators[0]) self.module_generators = (self.element_class(self, data), )
def example(self): """ Return an example of a quantum group representation as per :meth:`Category.example <sage.categories.category.Category.example>`. EXAMPLES:: sage: from sage.categories.quantum_group_representations import QuantumGroupRepresentations sage: Cat = QuantumGroupRepresentations(ZZ['q'].fraction_field()) sage: Cat.example() V((2, 1, 0)) """ from sage.algebras.quantum_groups.representations import AdjointRepresentation from sage.combinat.crystals.tensor_product import CrystalOfTableaux T = CrystalOfTableaux(['A', 2], shape=[2, 1]) return AdjointRepresentation(self.base_ring(), T)
def _tableaux_isomorphism(self): """ Return the isomorphism from ``self`` to the tableaux model. EXAMPLES:: sage: W = WeylGroup(['A',3,1], prefix='s') sage: w = W.from_reduced_word([3,2,1]) sage: B = crystals.AffineFactorization(w,4) sage: B._tableaux_isomorphism ['A', 3] Crystal morphism: From: Crystal on affine factorizations of type A3 associated to s3*s2*s1 To: The crystal of tableaux of type ['A', 3] and shape(s) [[3]] 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: B._tableaux_isomorphism ['A', 2] Crystal morphism: From: Crystal on affine factorizations of type A2 associated to s2*s3*s1*s2 To: The crystal of tableaux of type ['A', 2] and shape(s) [[2, 2]] """ # Constructing the tableaux crystal from sage.combinat.crystals.tensor_product import CrystalOfTableaux def mg_to_shape(mg): l = list(mg.weight().to_vector()) while l and l[-1] == 0: l.pop() return l sh = [mg_to_shape(mg) for mg in self.highest_weight_vectors()] C = CrystalOfTableaux(self.cartan_type(), shapes=sh) phi = FactorizationToTableaux(Hom(self, C, category=self.category())) phi.register_as_coercion() return phi
def HighestWeightCrystal(dominant_weight, model=None): r""" Return the highest weight crystal of highest weight ``dominant_weight`` of the given ``model``. INPUT: - ``dominant_weight`` -- a dominant weight - ``model`` -- (optional) if not specified, then we have the following default models: * types `A_n, B_n, C_n, D_n, G_2` - :class:`tableaux <sage.combinat.crystals.tensor_product.CrystalOfTableaux>` * types `E_{6,7}` - :class:`type E finite dimensional crystal <FiniteDimensionalHighestWeightCrystal_TypeE>` * all other types - :class:`LS paths <sage.combinat.crystals.littelmann_path.CrystalOfLSPaths>` otherwise can be one of the following: * ``'Tableaux'`` - :class:`KN tableaux <sage.combinat.crystals.tensor_product.CrystalOfTableaux>` * ``'TypeE'`` - :class:`type E finite dimensional crystal <FiniteDimensionalHighestWeightCrystal_TypeE>` * ``'NakajimaMonomials'`` - :class:`Nakajima monomials <sage.combinat.crystals.monomial_crystals.CrystalOfNakajimaMonomials>` * ``'LSPaths'`` - :class:`LS paths <sage.combinat.crystals.littelmann_path.CrystalOfLSPaths>` * ``'AlcovePaths'`` - :class:`alcove paths <sage.combinat.crystals.alcove_path.CrystalOfAlcovePaths>` * ``'GeneralizedYoungWalls'`` - :class:`generalized Young walls <sage.combinat.crystals.generalized_young_walls.CrystalOfGeneralizedYoungWalls>` * ``'RiggedConfigurations'`` - :class:`rigged configurations <sage.combinat.rigged_configurations.rc_crystal.CrystalOfRiggedConfigurations>` EXAMPLES:: sage: La = RootSystem(['A',2]).weight_lattice().fundamental_weights() sage: wt = La[1] + La[2] sage: crystals.HighestWeight(wt) The crystal of tableaux of type ['A', 2] and shape(s) [[2, 1]] sage: La = RootSystem(['C',2]).weight_lattice().fundamental_weights() sage: wt = 5*La[1] + La[2] sage: crystals.HighestWeight(wt) The crystal of tableaux of type ['C', 2] and shape(s) [[6, 1]] Some type `E` examples:: sage: C = CartanType(['E',6]) sage: La = C.root_system().weight_lattice().fundamental_weights() sage: T = crystals.HighestWeight(La[1]) sage: T.cardinality() 27 sage: T = crystals.HighestWeight(La[6]) sage: T.cardinality() 27 sage: T = crystals.HighestWeight(La[2]) sage: T.cardinality() 78 sage: T = crystals.HighestWeight(La[4]) sage: T.cardinality() 2925 sage: T = crystals.HighestWeight(La[3]) sage: T.cardinality() 351 sage: T = crystals.HighestWeight(La[5]) sage: T.cardinality() 351 sage: C = CartanType(['E',7]) sage: La = C.root_system().weight_lattice().fundamental_weights() sage: T = crystals.HighestWeight(La[1]) sage: T.cardinality() 133 sage: T = crystals.HighestWeight(La[2]) sage: T.cardinality() 912 sage: T = crystals.HighestWeight(La[3]) sage: T.cardinality() 8645 sage: T = crystals.HighestWeight(La[4]) sage: T.cardinality() 365750 sage: T = crystals.HighestWeight(La[5]) sage: T.cardinality() 27664 sage: T = crystals.HighestWeight(La[6]) sage: T.cardinality() 1539 sage: T = crystals.HighestWeight(La[7]) sage: T.cardinality() 56 An example with an affine type:: sage: C = CartanType(['C',2,1]) sage: La = C.root_system().weight_lattice().fundamental_weights() sage: T = crystals.HighestWeight(La[1]) sage: sorted(T.subcrystal(max_depth=3), key=str) [(-Lambda[0] + 3*Lambda[1] - Lambda[2] - delta,), (-Lambda[0] + Lambda[1] + Lambda[2] - delta,), (-Lambda[1] + 2*Lambda[2] - delta,), (2*Lambda[0] - Lambda[1],), (Lambda[0] + Lambda[1] - Lambda[2],), (Lambda[0] - Lambda[1] + Lambda[2],), (Lambda[1],)] Using the various models:: sage: La = RootSystem(['F',4]).weight_lattice().fundamental_weights() sage: wt = La[1] + La[4] sage: crystals.HighestWeight(wt) The crystal of LS paths of type ['F', 4] and weight Lambda[1] + Lambda[4] sage: crystals.HighestWeight(wt, model='NakajimaMonomials') Highest weight crystal of modified Nakajima monomials of Cartan type ['F', 4] and highest weight Lambda[1] + Lambda[4] sage: crystals.HighestWeight(wt, model='AlcovePaths') Highest weight crystal of alcove paths of type ['F', 4] and weight Lambda[1] + Lambda[4] sage: crystals.HighestWeight(wt, model='RiggedConfigurations') Crystal of rigged configurations of type ['F', 4] and weight Lambda[1] + Lambda[4] sage: La = RootSystem(['A',3,1]).weight_lattice().fundamental_weights() sage: wt = La[0] + La[2] sage: crystals.HighestWeight(wt, model='GeneralizedYoungWalls') Highest weight crystal of generalized Young walls of Cartan type ['A', 3, 1] and highest weight Lambda[0] + Lambda[2] """ cartan_type = dominant_weight.parent().cartan_type() if model is None: if cartan_type.is_finite(): if cartan_type.type() == 'E': model = 'TypeE' elif cartan_type.type() in ['A','B','C','D','G']: model = 'Tableaux' else: model = 'LSPaths' else: model = 'LSPaths' if model == 'Tableaux': sh = sum([[i]*c for i,c in dominant_weight], []) sh = Partition(reversed(sh)) return CrystalOfTableaux(cartan_type, shape=sh.conjugate()) if model == 'TypeE': if not cartan_type.is_finite() or cartan_type.type() != 'E': raise ValueError("only for finite type E") if cartan_type.rank() == 6: return FiniteDimensionalHighestWeightCrystal_TypeE6(dominant_weight) elif cartan_type.rank() == 7: return FiniteDimensionalHighestWeightCrystal_TypeE7(dominant_weight) raise NotImplementedError if model == 'NakajimaMonomials': # Make sure it's in the weight lattice P = dominant_weight.parent().root_system.weight_lattice() wt = P.sum_of_terms((i, c) for i,c in dominant_weight) return CrystalOfNakajimaMonomials(cartan_type, wt) if model == 'LSPaths': # Make sure it's in the (extended) weight space if cartan_type.is_affine(): P = dominant_weight.parent().root_system.weight_space(extended=True) else: P = dominant_weight.parent().root_system.weight_space() wt = P.sum_of_terms((i, c) for i,c in dominant_weight) return CrystalOfLSPaths(wt) if model == 'AlcovePaths': # Make sure it's in the weight space P = dominant_weight.parent().root_system.weight_space() wt = P.sum_of_terms((i, c) for i,c in dominant_weight) return CrystalOfAlcovePaths(wt, highest_weight_crystal=True) if model == 'GeneralizedYoungWalls': if not cartan_type.is_affine(): raise ValueError("only for affine types") if cartan_type.type() != 'A': raise NotImplementedError("only for affine type A") # Make sure it's in the weight lattice P = dominant_weight.parent().root_system.weight_lattice(extended=True) wt = P.sum_of_terms((i, c) for i,c in dominant_weight) return CrystalOfGeneralizedYoungWalls(cartan_type.rank()-1, wt) if model == 'RiggedConfigurations': # Make sure it's in the weight lattice P = dominant_weight.parent().root_system.weight_lattice() wt = P.sum_of_terms((i, c) for i,c in dominant_weight) return CrystalOfRiggedConfigurations(cartan_type, wt) raise ValueError("invalid model")
def HighestWeightCrystal(dominant_weight, model=None): r""" Return the highest weight crystal of highest weight ``dominant_weight`` of the given ``model``. INPUT: - ``dominant_weight`` -- a dominant weight - ``model`` -- (optional) if not specified, then we have the following default models: * types `A_n, B_n, C_n, D_n, G_2` - :class:`tableaux <sage.combinat.crystals.tensor_product.CrystalOfTableaux>` * types `E_{6,7}` - :class:`type E finite dimensional crystal <FiniteDimensionalHighestWeightCrystal_TypeE>` * all other types - :class:`LS paths <sage.combinat.crystals.littelmann_path.CrystalOfLSPaths>` otherwise can be one of the following: * ``'Tableaux'`` - :class:`KN tableaux <sage.combinat.crystals.tensor_product.CrystalOfTableaux>` * ``'TypeE'`` - :class:`type E finite dimensional crystal <FiniteDimensionalHighestWeightCrystal_TypeE>` * ``'NakajimaMonomials'`` - :class:`Nakajima monomials <sage.combinat.crystals.monomial_crystals.CrystalOfNakajimaMonomials>` * ``'LSPaths'`` - :class:`LS paths <sage.combinat.crystals.littelmann_path.CrystalOfLSPaths>` * ``'AlcovePaths'`` - :class:`alcove paths <sage.combinat.crystals.alcove_path.CrystalOfAlcovePaths>` * ``'GeneralizedYoungWalls'`` - :class:`generalized Young walls <sage.combinat.crystals.generalized_young_walls.CrystalOfGeneralizedYoungWalls>` * ``'RiggedConfigurations'`` - :class:`rigged configurations <sage.combinat.rigged_configurations.rc_crystal.CrystalOfRiggedConfigurations>` EXAMPLES:: sage: La = RootSystem(['A',2]).weight_lattice().fundamental_weights() sage: wt = La[1] + La[2] sage: crystals.HighestWeight(wt) The crystal of tableaux of type ['A', 2] and shape(s) [[2, 1]] sage: La = RootSystem(['C',2]).weight_lattice().fundamental_weights() sage: wt = 5*La[1] + La[2] sage: crystals.HighestWeight(wt) The crystal of tableaux of type ['C', 2] and shape(s) [[6, 1]] sage: La = RootSystem(['B',2]).weight_lattice().fundamental_weights() sage: wt = La[1] + La[2] sage: crystals.HighestWeight(wt) The crystal of tableaux of type ['B', 2] and shape(s) [[3/2, 1/2]] Some type `E` examples:: sage: C = CartanType(['E',6]) sage: La = C.root_system().weight_lattice().fundamental_weights() sage: T = crystals.HighestWeight(La[1]) sage: T.cardinality() 27 sage: T = crystals.HighestWeight(La[6]) sage: T.cardinality() 27 sage: T = crystals.HighestWeight(La[2]) sage: T.cardinality() 78 sage: T = crystals.HighestWeight(La[4]) sage: T.cardinality() 2925 sage: T = crystals.HighestWeight(La[3]) sage: T.cardinality() 351 sage: T = crystals.HighestWeight(La[5]) sage: T.cardinality() 351 sage: C = CartanType(['E',7]) sage: La = C.root_system().weight_lattice().fundamental_weights() sage: T = crystals.HighestWeight(La[1]) sage: T.cardinality() 133 sage: T = crystals.HighestWeight(La[2]) sage: T.cardinality() 912 sage: T = crystals.HighestWeight(La[3]) sage: T.cardinality() 8645 sage: T = crystals.HighestWeight(La[4]) sage: T.cardinality() 365750 sage: T = crystals.HighestWeight(La[5]) sage: T.cardinality() 27664 sage: T = crystals.HighestWeight(La[6]) sage: T.cardinality() 1539 sage: T = crystals.HighestWeight(La[7]) sage: T.cardinality() 56 An example with an affine type:: sage: C = CartanType(['C',2,1]) sage: La = C.root_system().weight_lattice().fundamental_weights() sage: T = crystals.HighestWeight(La[1]) sage: sorted(T.subcrystal(max_depth=3), key=str) [(-Lambda[0] + 3*Lambda[1] - Lambda[2] - delta,), (-Lambda[0] + Lambda[1] + Lambda[2] - delta,), (-Lambda[1] + 2*Lambda[2] - delta,), (2*Lambda[0] - Lambda[1],), (Lambda[0] + Lambda[1] - Lambda[2],), (Lambda[0] - Lambda[1] + Lambda[2],), (Lambda[1],)] Using the various models:: sage: La = RootSystem(['F',4]).weight_lattice().fundamental_weights() sage: wt = La[1] + La[4] sage: crystals.HighestWeight(wt) The crystal of LS paths of type ['F', 4] and weight Lambda[1] + Lambda[4] sage: crystals.HighestWeight(wt, model='NakajimaMonomials') Highest weight crystal of modified Nakajima monomials of Cartan type ['F', 4] and highest weight Lambda[1] + Lambda[4] sage: crystals.HighestWeight(wt, model='AlcovePaths') Highest weight crystal of alcove paths of type ['F', 4] and weight Lambda[1] + Lambda[4] sage: crystals.HighestWeight(wt, model='RiggedConfigurations') Crystal of rigged configurations of type ['F', 4] and weight Lambda[1] + Lambda[4] sage: La = RootSystem(['A',3,1]).weight_lattice().fundamental_weights() sage: wt = La[0] + La[2] sage: crystals.HighestWeight(wt, model='GeneralizedYoungWalls') Highest weight crystal of generalized Young walls of Cartan type ['A', 3, 1] and highest weight Lambda[0] + Lambda[2] TESTS: Check that the correct crystal is constructed for the fundamental weights:: sage: for ct in CartanType.samples(finite=True, crystallographic=True): ....: L = ct.root_system().weight_lattice() ....: La = L.fundamental_weights() ....: for model in ['Tableaux', 'NakajimaMonomials', 'AlcovePaths', 'RiggedConfigurations']: ....: if model == 'Tableaux' and ct.type() in ["E", "F"]: ....: continue ....: for wt in La: ....: C = crystals.HighestWeight(wt, model=model) ....: assert L.weyl_dimension(wt) == C.cardinality(), "wrong cardinality in %s, weight %s" % (ct, wt) ....: assert C.highest_weight_vector().weight() == wt, "wrong weight in %s, weight %s" % (ct, wt) Same thing for weights constructed from the simple roots:: sage: for ct in CartanType.samples(finite=True, crystallographic=True): ....: L = ct.root_system().root_space() ....: La = L.fundamental_weights_from_simple_roots() ....: for model in ['Tableaux', 'NakajimaMonomials', 'AlcovePaths', 'RiggedConfigurations']: ....: if model == 'Tableaux' and ct.type() in ["E", "F"]: ....: continue ....: for wt in La: ....: C1 = crystals.HighestWeight(wt.to_ambient().to_weight_space(ZZ), model=model) ....: C2 = crystals.HighestWeight(wt, model=model) ....: assert C1 == C2 """ cartan_type = dominant_weight.parent().cartan_type() if model is None: if cartan_type.is_finite(): if cartan_type.type() == 'E': model = 'TypeE' elif cartan_type.type() in ['A', 'B', 'C', 'D', 'G']: model = 'Tableaux' else: model = 'LSPaths' else: model = 'LSPaths' # Make sure dominant_weight in the weight space if cartan_type.is_finite(): dominant_weight = dominant_weight.to_ambient().to_weight_space(ZZ) if model == 'Tableaux': # we rely on the specific choice of positive roots here # except in type G_2, the fundamental weights are realized by # vectors with weakly decreasing nonnegative integer (or in # type B_n and D_n, half-integer) entries sh = dominant_weight.to_ambient().to_vector() if cartan_type.type() == "G": sh = (-sh)[2:0:-1] return CrystalOfTableaux(cartan_type, shape=sh) if model == 'TypeE': if not cartan_type.is_finite() or cartan_type.type() != 'E': raise ValueError("only for finite type E") if cartan_type.rank() == 6: return FiniteDimensionalHighestWeightCrystal_TypeE6( dominant_weight) elif cartan_type.rank() == 7: return FiniteDimensionalHighestWeightCrystal_TypeE7( dominant_weight) raise NotImplementedError if model == 'NakajimaMonomials': return CrystalOfNakajimaMonomials(cartan_type, dominant_weight) if model == 'LSPaths': # Make sure it's in the (extended) weight space if cartan_type.is_affine(): P = dominant_weight.parent().root_system.weight_space( extended=True) else: P = dominant_weight.parent().root_system.weight_space() wt = P.sum_of_terms((i, c) for i, c in dominant_weight) return CrystalOfLSPaths(wt) if model == 'AlcovePaths': return CrystalOfAlcovePaths(dominant_weight, highest_weight_crystal=True) if model == 'GeneralizedYoungWalls': if not cartan_type.is_affine(): raise ValueError("only for affine types") if cartan_type.type() != 'A': raise NotImplementedError("only for affine type A") # Make sure it's in the weight lattice P = dominant_weight.parent().root_system.weight_lattice(extended=True) wt = P.sum_of_terms((i, c) for i, c in dominant_weight) return CrystalOfGeneralizedYoungWalls(cartan_type.rank() - 1, wt) if model == 'RiggedConfigurations': return CrystalOfRiggedConfigurations(cartan_type, dominant_weight) raise ValueError("invalid model")