Пример #1
0
    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
Пример #2
0
    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))
Пример #3
0
    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))
Пример #4
0
    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
Пример #5
0
    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)
Пример #6
0
    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)
Пример #7
0
    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)
Пример #8
0
    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)