Ejemplo n.º 1
0
def _delta_irr_rec(p, marking):
    r"""
    Internal recursive function called by :func:`delta_irr`.
    """
    if len(p) == 0:
        return 0

    if marking[0] == 1:
        m = marking[1]
        a = marking[2]
        i = p.index(m)
        pp = Partition(p._list[:i] + p._list[i + 1:])  # the partition p'

        N = (-1)**a * delta_std(pp._list + [m + 2], (1, m + 2, m - a))

        for m1 in xrange(1, m - 1, 2):
            m2 = m - m1 - 1
            for a1 in xrange(max(0, a - m2), min(a, m1)):
                a2 = a - a1 - 1
                for p1, p2 in bidecompositions(pp):
                    l1 = sorted([m1] + p1._list, reverse=True)
                    l2 = sorted([m2 + 2] + p2._list, reverse=True)
                    N += (-1)**a2 * (_delta_irr_rec(Partition(l1),
                                                    (1, m1, a1)) *
                                     spin_difference_for_standard_permutations(
                                         Partition(l2), (1, m2 + 2, m2 - a2)))
        return N

    elif marking[0] == 2:
        m1 = marking[1]
        m2 = marking[2]
        i1 = p.index(m1)
        i2 = p.index(m2)
        if m1 == m2: i2 += 1
        if i2 < i1: i1, i2 = i2, i1
        pp = Partition(p._list[:i1] + p._list[i1 + 1:i2] + p._list[i2 + 1:])

        N = d(Partition(sorted(pp._list + [m1 + m2 + 1],
                               reverse=True))) / pp.centralizer_size()
        # nb of standard permutations that corrresponds to extension of good
        # guys

        for p1, p2 in bidecompositions(Partition(pp)):
            for k1 in xrange(1, m1, 2):  # remove (k1|.) (k2 o m_2)
                k2 = m1 - k1 - 1
                q1 = Partition(sorted(p1._list + [k1], reverse=True))
                q2 = Partition(sorted(p2._list + [k2 + m2 + 1], reverse=True))
                for a in xrange(k1):  # a is a angle
                    N += _delta_irr_rec(
                        q1, (1, k1, a)) * d(q2) / p2.centralizer_size()

            for k1 in xrange(1, m2, 2):  # remove (m_1 o k1) (k2|.)
                k2 = m2 - k1 - 1
                l1 = sorted(p1._list + [m1, k1], reverse=True)
                l2 = sorted(p2._list + [k2 + 2], reverse=True)
                for a in xrange(1, k2 + 1):  # a is an angle for standard perm
                    N += (_delta_irr_rec(Partition(l1), (2, m1, k1)) *
                          spin_difference_for_standard_permutations(
                              Partition(l2), (1, k2 + 2, a)))

        for m in pp.to_exp_dict(
        ):  # remove (m_1 o k_1) (k_2 o m_2) for k1+k2+1 an other zero
            q = pp._list[:]
            del q[q.index(m)]
            for p1, p2 in bidecompositions(Partition(q)):
                for k1 in xrange(1, m, 2):
                    k2 = m - k1 - 1
                    q1 = Partition(sorted(p1._list + [m1, k1], reverse=True))
                    q2 = Partition(
                        sorted(p2._list + [k2 + m2 + 1], reverse=True))
                    N += _delta_irr_rec(
                        q1, (2, m1, k1)) * d(q2) / p2.centralizer_size()

        return N
def _delta_irr_rec(p, marking):
    r"""
    Internal recursive function called by :func:`delta_irr`.
    """
    if len(p) == 0:
        return 0

    if marking[0] == 1:
        m = marking[1]
        a = marking[2]
        i = p.index(m)
        pp = Partition(p._list[:i]+p._list[i+1:]) # the partition p'

        N = (-1)**a* delta_std(
                pp._list + [m+2],
                (1,m+2,m-a))

        for m1 in xrange(1,m-1,2):
            m2 = m-m1-1
            for a1 in xrange(max(0,a-m2),min(a,m1)):
                a2 = a - a1 - 1
                for p1,p2 in bidecompositions(pp):
                    l1 = sorted([m1]+p1._list,reverse=True)
                    l2 = sorted([m2+2]+p2._list,reverse=True)
                    N += (-1)**a2*(_delta_irr_rec(Partition(l1),(1,m1,a1)) *
                        spin_difference_for_standard_permutations(Partition(l2),(1,m2+2,m2-a2)))
        return N

    elif marking[0] == 2:
        m1 = marking[1]
        m2 = marking[2]
        i1 = p.index(m1)
        i2 = p.index(m2)
        if m1 == m2: i2 += 1
        if i2 < i1: i1,i2 = i2,i1
        pp = Partition(p._list[:i1] + p._list[i1+1:i2] + p._list[i2+1:])

        N = d(Partition(sorted(pp._list+[m1+m2+1],reverse=True))) /  pp.centralizer_size()
        # nb of standard permutations that corrresponds to extension of good
        # guys

        for p1,p2 in bidecompositions(Partition(pp)):
            for k1 in xrange(1,m1,2): # remove (k1|.) (k2 o m_2)
                k2 = m1-k1-1
                q1 = Partition(sorted(p1._list+[k1],reverse=True))
                q2 = Partition(sorted(p2._list+[k2+m2+1],reverse=True))
                for a in xrange(k1): # a is a angle
                    N += _delta_irr_rec(q1, (1,k1,a)) * d(q2) / p2.centralizer_size()

            for k1 in xrange(1,m2,2): # remove (m_1 o k1) (k2|.)
                k2 = m2-k1-1
                l1 = sorted(p1._list+[m1,k1],reverse=True)
                l2 = sorted(p2._list+[k2+2],reverse=True)
                for a in xrange(1,k2+1): # a is an angle for standard perm
                    N += (_delta_irr_rec(Partition(l1), (2,m1,k1)) *
                        spin_difference_for_standard_permutations(Partition(l2), (1,k2+2,a)))

        for m in pp.to_exp_dict(): # remove (m_1 o k_1) (k_2 o m_2) for k1+k2+1 an other zero
            q = pp._list[:]
            del q[q.index(m)]
            for p1,p2 in bidecompositions(Partition(q)):
                for k1 in xrange(1,m,2):
                    k2 = m-k1-1
                    q1 = Partition(sorted(p1._list+[m1,k1],reverse=True))
                    q2 = Partition(sorted(p2._list+[k2+m2+1],reverse=True))
                    N += _delta_irr_rec(q1, (2,m1,k1)) * d(q2) / p2.centralizer_size()

        return N
Ejemplo n.º 3
0
def _gamma_irr_rec(p, marking):
    r"""
    Internal recursive function called by :func:`gamma_irr`
    """
    if len(p) == 0:
        return 1

    if marking[0] == 1:
        m = marking[1]
        a = marking[2]
        i = p.index(m)
        pp = Partition(p._list[:i] + p._list[i + 1:])  # the partition p'

        N = gamma_std(pp._list + [m + 2], (1, m + 2, m - a))

        for m1 in xrange(1, m - 1):
            m2 = m - m1 - 1
            for a1 in xrange(max(0, a - m2), min(a, m1)):
                a2 = a - a1 - 1
                for p1, p2 in bidecompositions(pp):
                    l1 = sorted([m1] + p1._list, reverse=True)
                    l2 = sorted([m2 + 2] + p2._list, reverse=True)
                    if (sum(l1) + len(l1)) % 2 == 0 and (sum(l2) +
                                                         len(l2)) % 2 == 0:
                        N -= (_gamma_irr_rec(Partition(l1), (1, m1, a1)) *
                              gamma_std(Partition(l2), (1, m2 + 2, m2 - a2)))
        return N

    elif marking[0] == 2:
        m1 = marking[1]
        m2 = marking[2]
        i1 = p.index(m1)
        i2 = p.index(m2)
        if m1 == m2: i2 += 1
        if i2 < i1: i1, i2 = i2, i1
        pp = Partition(p._list[:i1] + p._list[i1 + 1:i2] + p._list[i2 + 1:])

        N = gamma_std(pp._list + [m1 + 1, m2 + 1], (2, m1 + 1, m2 + 1))

        for p1, p2 in bidecompositions(pp):
            for k1 in xrange(1, m1):  # remove (m'_1|.) (m''_1 o m_2)
                k2 = m1 - k1 - 1
                l1 = sorted(p1._list + [k1], reverse=True)
                l2 = sorted(p2._list + [k2 + 1, m2 + 1], reverse=True)
                if (sum(l1) + len(l1)) % 2 == 0 and (sum(l2) +
                                                     len(l2)) % 2 == 0:
                    for a in xrange(k1):  # a is an angle
                        N -= (_gamma_irr_rec(Partition(l1), (1, k1, a)) *
                              gamma_std(Partition(l2), (2, k2 + 1, m2 + 1)))

            for k1 in xrange(1, m2):  # remove (m_1 o m'_2) (m''_2|.)
                k2 = m2 - k1 - 1
                l1 = sorted(p1._list + [m1, k1], reverse=True)
                l2 = sorted(p2._list + [k2 + 2], reverse=True)
                if (sum(l1) + len(l1)) % 2 == 0 and (sum(l2) +
                                                     len(l2)) % 2 == 0:
                    for a in xrange(1,
                                    k2 + 1):  # a is an angle for standard perm
                        N -= (_gamma_irr_rec(Partition(l1), (2, m1, k1)) *
                              gamma_std(Partition(l2), (1, k2 + 2, a)))

        for m in pp.to_exp_dict(
        ):  # remove (m_1, k_1) (k_2, m_2) for k1+k2+1 an other zero
            q = pp._list[:]
            del q[q.index(m)]
            for p1, p2 in bidecompositions(Partition(q)):
                for k1 in xrange(1, m):
                    k2 = m - k1 - 1
                    l1 = sorted(p1._list + [m1, k1], reverse=True)
                    l2 = sorted(p2._list + [k2 + 1, m2 + 1], reverse=True)
                    if (sum(l1) + len(l1)) % 2 == 0 and (sum(l2) +
                                                         len(l2)) % 2 == 0:
                        N -= (_gamma_irr_rec(Partition(l1), (2, m1, k1)) *
                              gamma_std(Partition(l2), (2, k2 + 1, m2 + 1)))

        return N

    else:
        raise ValueError, "marking must be a 3-tuple of the form (1,m,a) or (2,m1,m2)"
def _gamma_irr_rec(p, marking):
    r"""
    Internal recursive function called by :func:`gamma_irr`
    """
    if len(p) == 0:
        return 1

    if marking[0] == 1:
        m = marking[1]
        a = marking[2]
        i = p.index(m)
        pp = Partition(p._list[:i]+p._list[i+1:]) # the partition p'

        N = gamma_std(pp._list + [m+2],(1,m+2,m-a))

        for m1 in xrange(1,m-1):
            m2 = m-m1-1
            for a1 in xrange(max(0,a-m2),min(a,m1)):
                a2 = a - a1 - 1
                for p1,p2 in bidecompositions(pp):
                    l1 = sorted([m1]+p1._list,reverse=True)
                    l2 = sorted([m2+2]+p2._list,reverse=True)
                    if (sum(l1)+len(l1)) % 2 == 0 and (sum(l2)+len(l2)) % 2 == 0:
                        N -= (_gamma_irr_rec(Partition(l1), (1,m1,a1)) *
                              gamma_std(Partition(l2),(1,m2+2,m2-a2)))
        return N


    elif marking[0] == 2:
        m1 = marking[1]
        m2 = marking[2]
        i1 = p.index(m1)
        i2 = p.index(m2)
        if m1 == m2: i2 += 1
        if i2 < i1: i1,i2 = i2,i1
        pp = Partition(p._list[:i1] + p._list[i1+1:i2] + p._list[i2+1:])

        N = gamma_std(pp._list + [m1+1,m2+1],(2,m1+1,m2+1))

        for p1,p2 in bidecompositions(pp):
            for k1 in xrange(1,m1): # remove (m'_1|.) (m''_1 o m_2)
                k2 = m1-k1-1
                l1 = sorted(p1._list+[k1],reverse=True)
                l2 = sorted(p2._list+[k2+1,m2+1],reverse=True)
                if (sum(l1)+len(l1)) %2 == 0 and (sum(l2)+len(l2)) %2 == 0:
                    for a in xrange(k1): # a is an angle
                        N -= (_gamma_irr_rec(Partition(l1), (1,k1,a))*
                              gamma_std(Partition(l2),(2,k2+1,m2+1)))

            for k1 in xrange(1,m2): # remove (m_1 o m'_2) (m''_2|.)
                k2 = m2-k1-1
                l1 = sorted(p1._list+[m1,k1],reverse=True)
                l2 = sorted(p2._list+[k2+2],reverse=True)
                if (sum(l1)+len(l1)) %2 == 0 and (sum(l2)+len(l2)) %2 == 0:
                    for a in xrange(1,k2+1): # a is an angle for standard perm
                        N -= (_gamma_irr_rec(Partition(l1), (2,m1,k1)) *
                              gamma_std(Partition(l2),(1,k2+2,a)))

        for m in pp.to_exp_dict(): # remove (m_1, k_1) (k_2, m_2) for k1+k2+1 an other zero
            q = pp._list[:]
            del q[q.index(m)]
            for p1,p2 in bidecompositions(Partition(q)):
                for k1 in xrange(1,m):
                    k2 = m-k1-1
                    l1 = sorted(p1._list+[m1,k1],reverse=True)
                    l2 = sorted(p2._list+[k2+1,m2+1],reverse=True)
                    if (sum(l1)+len(l1))%2 == 0 and (sum(l2)+len(l2))%2 == 0:
                        N -= (_gamma_irr_rec(Partition(l1), (2,m1,k1)) *
                              gamma_std(Partition(l2),(2,k2+1,m2+1)))

        return N

    else:
        raise ValueError, "marking must be a 3-tuple of the form (1,m,a) or (2,m1,m2)"