def get_initial_chain(self, highest_weight): """ Called internally by __init__() to construct the chain of roots associated to the highest weight element. EXAMPLES:: sage: C = ClassicalCrystalOfAlcovePaths(['A',3],[0,1,0]) sage: C.get_initial_chain(RootSystem(['A',3]).weight_space().basis()[1]) [[alpha[1], alpha[1]], [alpha[1] + alpha[2], alpha[1] + alpha[2]], [alpha[1] + alpha[2] + alpha[3], alpha[1] + alpha[2] + alpha[3]]] """ pos_roots = self.positive_roots tis = self.R.index_set() tis.reverse() cv_to_pos_root = {} to_sort = [] for r in pos_roots: j = highest_weight.scalar( r.associated_coroot() ) if (int(math.floor(j)) - j == Integer(0)): j = j - Integer(1) j = int(math.floor(j)) for k in (ellipsis_range(Integer(0),Ellipsis,j)): cv = [] cv.append((Integer(1)/highest_weight.scalar(r.associated_coroot()))*k) for i in tis: cv.append((Integer(1)/highest_weight.scalar(r.associated_coroot()))*r.associated_coroot().coefficient(i)) cv_to_pos_root[ str(cv) ] = r to_sort.append( cv ) to_sort.sort() # Note: Python sorts nested lists lexicographically by default. lambda_chain = [] for t in to_sort: lambda_chain.append( [ cv_to_pos_root[str(t)], cv_to_pos_root[str(t)] ] ) return lambda_chain
def fold(self, i, chain, endweight): r""" Returns a new chain that results from folding at position i. Called internally by __init__(). TESTS:: sage: C = ClassicalCrystalOfAlcovePaths(['A',3],[0,1,0]) sage: C([0]).get_chain_from_subset() ([[alpha[2], -alpha[2]], [alpha[1], alpha[1]], [alpha[3], alpha[3]], [alpha[1] + alpha[2] + alpha[3], alpha[1] + alpha[2] + alpha[3]]], 3/2*alpha[1] + alpha[2] + 3/2*alpha[3]) """ s = self.parent().R.root_space().reflection(chain[i][Integer(0)]) chain[i][Integer(1)] = s(chain[i][Integer(1)]) for j in (ellipsis_range((i+Integer(1)),Ellipsis,len(chain)-Integer(1))): pair = chain[j] pair[Integer(0)] = s(pair[Integer(0)]) pair[Integer(1)] = s(pair[Integer(1)]) return (chain, s(endweight))
def fold(self, i, chain, endweight): r""" Returns a new chain that results from folding at position i. Called internally by __init__(). TESTS:: sage: C = ClassicalCrystalOfAlcovePaths(['A',3],[0,1,0]) sage: C([0]).get_chain_from_subset() ([[alpha[2], -alpha[2]], [alpha[1], alpha[1]], [alpha[3], alpha[3]], [alpha[1] + alpha[2] + alpha[3], alpha[1] + alpha[2] + alpha[3]]], 3/2*alpha[1] + alpha[2] + 3/2*alpha[3]) """ s = self.parent().R.root_space().reflection(chain[i][Integer(0)]) chain[i][Integer(1)] = s(chain[i][Integer(1)]) for j in (ellipsis_range((i + Integer(1)), Ellipsis, len(chain) - Integer(1))): pair = chain[j] pair[Integer(0)] = s(pair[Integer(0)]) pair[Integer(1)] = s(pair[Integer(1)]) return (chain, s(endweight))
def get_initial_chain(self, highest_weight): """ Called internally by __init__() to construct the chain of roots associated to the highest weight element. EXAMPLES:: sage: C = ClassicalCrystalOfAlcovePaths(['A',3],[0,1,0]) sage: C.get_initial_chain(RootSystem(['A',3]).weight_space().basis()[1]) [[alpha[1], alpha[1]], [alpha[1] + alpha[2], alpha[1] + alpha[2]], [alpha[1] + alpha[2] + alpha[3], alpha[1] + alpha[2] + alpha[3]]] """ pos_roots = self.positive_roots tis = self.R.index_set() tis.reverse() cv_to_pos_root = {} to_sort = [] for r in pos_roots: j = highest_weight.scalar(r.associated_coroot()) if (int(math.floor(j)) - j == Integer(0)): j = j - Integer(1) j = int(math.floor(j)) for k in (ellipsis_range(Integer(0), Ellipsis, j)): cv = [] cv.append( (Integer(1) / highest_weight.scalar(r.associated_coroot())) * k) for i in tis: cv.append((Integer(1) / highest_weight.scalar(r.associated_coroot())) * r.associated_coroot().coefficient(i)) cv_to_pos_root[str(cv)] = r to_sort.append(cv) to_sort.sort( ) # Note: Python sorts nested lists lexicographically by default. lambda_chain = [] for t in to_sort: lambda_chain.append( [cv_to_pos_root[str(t)], cv_to_pos_root[str(t)]]) return lambda_chain
def f(self, i, verbose=False): r""" Returns the action of `f_i` on self. EXAMPLES:: sage: C = ClassicalCrystalOfAlcovePaths(['E',6],[1,0,0,0,0,0]) # long time (21s on sage.math, 2011) sage: C.module_generators # long time [[]] sage: C([]).f(1) # long time [0] sage: C([]).f(1).f(3) # long time [0, 1] sage: C([]).f(1).f(3).f(4) # long time [0, 1, 2] sage: C([]).f(1).f(3).f(4).f(5) # long time [0, 1, 2, 4] sage: C([]).f(1).f(3).f(4).f(2) # long time [0, 1, 2, 3] """ assert i in self.index_set() # Construct the chain associated to the subset self.value if self.chain is None: if (str(self.value) in self.parent().chain_cache.keys()): self.chain = self.parent().chain_cache[ str(self.value) ] self.endweight = self.parent().endweight_cache[ str(self.value) ] else: (self.chain, self.endweight) = self.get_chain_from_subset() self.parent().chain_cache[str(self.value)] = copy.deepcopy(self.chain) self.parent().endweight_cache[str(self.value)] = copy.deepcopy(self.endweight) ai = self.parent().R.root_space().simple_root(i) if verbose == True: print "( self.value, i = ", self.value, i, " ) " print "( chain = ", self.chain, " ) " IJp = filter( lambda j: self.chain[j][Integer(0)] == ai or self.chain[j][Integer(0)] == (-Integer(1))*ai, (ellipsis_range(Integer(0) ,Ellipsis, len(self.chain)-Integer(1))) ) if verbose == True: print "( IJp = ", IJp, ") " SJp = [] for j in IJp: pair = self.chain[j] if ( pair[Integer(0)].coefficients()[Integer(0)] < Integer(0) ): SJp.append( -Integer(1) ) else: SJp.append( Integer(1) ) if ( pair[Integer(1)].coefficients()[Integer(0)] < Integer(0) ): SJp.append( -Integer(1) ) else: SJp.append( Integer(1) ) # Incidentally, the vector at infinity in LJp is <mu(J), a_p^check>. # This gives an alternative way to calculate the last SJp/LJp entries. if (self.endweight.scalar( ai.associated_coroot() ) < Integer(0)): SJp.append( -Integer(1) ) else: SJp.append( Integer(1) ) if verbose == True: print "( SJp = ", SJp, ") " LJp = [] t = Integer(0)-(Integer(1)/Integer(2)) for j in (ellipsis_range(Integer(0),Ellipsis,len(SJp)-Integer(1))): if SJp[j] == Integer(1): t = t+(Integer(1)/Integer(2)) elif SJp[j] == -Integer(1): t = t-(Integer(1)/Integer(2)) if ((j % Integer(2)) == Integer(0)): LJp.append(t) if verbose == True: print "( LJp = ", LJp, " ) " MJp = max(LJp) if verbose == True: print "( MJp = ", MJp, " ) " if (MJp <= Integer(0)): return None m = LJp.index(MJp) k = m - Integer(1) rsubseq = [] rsubseq.extend(self.value) if (m < len(IJp)): rsubseq.remove(IJp[m]) rsubseq.append(IJp[k]) rsubseq.sort() return self.parent()(rsubseq)
def e(self, i, verbose=False): r""" Returns the action of `e_i` on self. EXAMPLES:: sage: C = ClassicalCrystalOfAlcovePaths(['E',6],[1,0,0,0,0,0]) # long time (20s on sage.math, 2011) sage: C.module_generators # long time [[]] sage: C([]).f(1) # long time [0] sage: C([]).f(1).e(1) # long time [] """ assert i in self.index_set() # Construct the chain associated to the subset self.value if self.chain is None: if (str(self.value) in self.parent().chain_cache.keys()): self.chain = self.parent().chain_cache[ str(self.value) ] self.endweight = self.parent().endweight_cache[ str(self.value) ] else: (self.chain, self.endweight) = self.get_chain_from_subset() self.parent().chain_cache[str(self.value)] = copy.deepcopy(self.chain) self.parent().endweight_cache[str(self.value)] = copy.deepcopy(self.endweight) ai = self.parent().R.root_space().simple_root(i) if verbose == True: print "( self.value, i = ", self.value, i, " ) " print "( chain = ", self.chain, " ) " IJp = filter( lambda j: self.chain[j][Integer(0)] == ai or self.chain[j][Integer(0)] == (-Integer(1))*ai, (ellipsis_range(Integer(0) ,Ellipsis, len(self.chain)-Integer(1))) ) if verbose == True: print "( IJp = ", IJp, ") " SJp = [] for j in IJp: pair = self.chain[j] if ( pair[Integer(0)].coefficients()[Integer(0)] < Integer(0) ): SJp.append( -Integer(1) ) else: SJp.append( Integer(1) ) if ( pair[Integer(1)].coefficients()[Integer(0)] < Integer(0) ): SJp.append( -Integer(1) ) else: SJp.append( Integer(1) ) if (self.endweight.scalar( ai.associated_coroot() ) < Integer(0)): SJp.append( -Integer(1) ) else: SJp.append( Integer(1) ) if verbose == True: print "( SJp = ", SJp, ") " LJp = [] t = Integer(0)-(Integer(1)/Integer(2)) for j in (ellipsis_range(Integer(0),Ellipsis,len(SJp)-Integer(1))): if SJp[j] == Integer(1): t = t+(Integer(1)/Integer(2)) elif SJp[j] == -Integer(1): t = t-(Integer(1)/Integer(2)) if ((j % Integer(2)) == Integer(0)): LJp.append(t) if verbose == True: print "( LJp = ", LJp, " ) " MJp = max(LJp) if verbose == True: print "( MJp = ", MJp, " ) " if (MJp <= LJp[ len(LJp)-1 ]): return None rLJp = copy.deepcopy(LJp) rLJp.reverse() k = rLJp.index(MJp) k = (len(LJp)-1) - k m = k + 1 rsubseq = [] rsubseq.extend(self.value) rsubseq.remove(IJp[k]) if (m < len(IJp)): rsubseq.append(IJp[m]) rsubseq.sort() return self.parent()(rsubseq)
def f(self, i, verbose=False): r""" Returns the action of `f_i` on self. EXAMPLES:: sage: C = ClassicalCrystalOfAlcovePaths(['E',6],[1,0,0,0,0,0]) # long time (21s on sage.math, 2011) sage: C.module_generators # long time [[]] sage: C([]).f(1) # long time [0] sage: C([]).f(1).f(3) # long time [0, 1] sage: C([]).f(1).f(3).f(4) # long time [0, 1, 2] sage: C([]).f(1).f(3).f(4).f(5) # long time [0, 1, 2, 4] sage: C([]).f(1).f(3).f(4).f(2) # long time [0, 1, 2, 3] """ assert i in self.index_set() # Construct the chain associated to the subset self.value if self.chain is None: if (str(self.value) in self.parent().chain_cache.keys()): self.chain = self.parent().chain_cache[str(self.value)] self.endweight = self.parent().endweight_cache[str(self.value)] else: (self.chain, self.endweight) = self.get_chain_from_subset() self.parent().chain_cache[str(self.value)] = copy.deepcopy( self.chain) self.parent().endweight_cache[str(self.value)] = copy.deepcopy( self.endweight) ai = self.parent().R.root_space().simple_root(i) if verbose == True: print "( self.value, i = ", self.value, i, " ) " print "( chain = ", self.chain, " ) " IJp = filter( lambda j: self.chain[j][Integer(0)] == ai or self.chain[j][Integer( 0)] == (-Integer(1)) * ai, (ellipsis_range(Integer(0), Ellipsis, len(self.chain) - Integer(1)))) if verbose == True: print "( IJp = ", IJp, ") " SJp = [] for j in IJp: pair = self.chain[j] if (pair[Integer(0)].coefficients()[Integer(0)] < Integer(0)): SJp.append(-Integer(1)) else: SJp.append(Integer(1)) if (pair[Integer(1)].coefficients()[Integer(0)] < Integer(0)): SJp.append(-Integer(1)) else: SJp.append(Integer(1)) # Incidentally, the vector at infinity in LJp is <mu(J), a_p^check>. # This gives an alternative way to calculate the last SJp/LJp entries. if (self.endweight.scalar(ai.associated_coroot()) < Integer(0)): SJp.append(-Integer(1)) else: SJp.append(Integer(1)) if verbose == True: print "( SJp = ", SJp, ") " LJp = [] t = Integer(0) - (Integer(1) / Integer(2)) for j in (ellipsis_range(Integer(0), Ellipsis, len(SJp) - Integer(1))): if SJp[j] == Integer(1): t = t + (Integer(1) / Integer(2)) elif SJp[j] == -Integer(1): t = t - (Integer(1) / Integer(2)) if ((j % Integer(2)) == Integer(0)): LJp.append(t) if verbose == True: print "( LJp = ", LJp, " ) " MJp = max(LJp) if verbose == True: print "( MJp = ", MJp, " ) " if (MJp <= Integer(0)): return None m = LJp.index(MJp) k = m - Integer(1) rsubseq = [] rsubseq.extend(self.value) if (m < len(IJp)): rsubseq.remove(IJp[m]) rsubseq.append(IJp[k]) rsubseq.sort() return self.parent()(rsubseq)
def e(self, i, verbose=False): r""" Returns the action of `e_i` on self. EXAMPLES:: sage: C = ClassicalCrystalOfAlcovePaths(['E',6],[1,0,0,0,0,0]) # long time (20s on sage.math, 2011) sage: C.module_generators # long time [[]] sage: C([]).f(1) # long time [0] sage: C([]).f(1).e(1) # long time [] """ assert i in self.index_set() # Construct the chain associated to the subset self.value if self.chain is None: if (str(self.value) in self.parent().chain_cache.keys()): self.chain = self.parent().chain_cache[str(self.value)] self.endweight = self.parent().endweight_cache[str(self.value)] else: (self.chain, self.endweight) = self.get_chain_from_subset() self.parent().chain_cache[str(self.value)] = copy.deepcopy( self.chain) self.parent().endweight_cache[str(self.value)] = copy.deepcopy( self.endweight) ai = self.parent().R.root_space().simple_root(i) if verbose == True: print "( self.value, i = ", self.value, i, " ) " print "( chain = ", self.chain, " ) " IJp = filter( lambda j: self.chain[j][Integer(0)] == ai or self.chain[j][Integer( 0)] == (-Integer(1)) * ai, (ellipsis_range(Integer(0), Ellipsis, len(self.chain) - Integer(1)))) if verbose == True: print "( IJp = ", IJp, ") " SJp = [] for j in IJp: pair = self.chain[j] if (pair[Integer(0)].coefficients()[Integer(0)] < Integer(0)): SJp.append(-Integer(1)) else: SJp.append(Integer(1)) if (pair[Integer(1)].coefficients()[Integer(0)] < Integer(0)): SJp.append(-Integer(1)) else: SJp.append(Integer(1)) if (self.endweight.scalar(ai.associated_coroot()) < Integer(0)): SJp.append(-Integer(1)) else: SJp.append(Integer(1)) if verbose == True: print "( SJp = ", SJp, ") " LJp = [] t = Integer(0) - (Integer(1) / Integer(2)) for j in (ellipsis_range(Integer(0), Ellipsis, len(SJp) - Integer(1))): if SJp[j] == Integer(1): t = t + (Integer(1) / Integer(2)) elif SJp[j] == -Integer(1): t = t - (Integer(1) / Integer(2)) if ((j % Integer(2)) == Integer(0)): LJp.append(t) if verbose == True: print "( LJp = ", LJp, " ) " MJp = max(LJp) if verbose == True: print "( MJp = ", MJp, " ) " if (MJp <= LJp[len(LJp) - 1]): return None rLJp = copy.deepcopy(LJp) rLJp.reverse() k = rLJp.index(MJp) k = (len(LJp) - 1) - k m = k + 1 rsubseq = [] rsubseq.extend(self.value) rsubseq.remove(IJp[k]) if (m < len(IJp)): rsubseq.append(IJp[m]) rsubseq.sort() return self.parent()(rsubseq)