def number_of_k_resolutions_upper_constraints(n, up_t, verbose=False):
    """
    Fatti non foste a computare come bruti.
    $R_{(a_1,a_2, \dots , a_k )^{\uparrow} }^{n}$
    :param n: positive integer
    :param up_t: vector of non-negative integers $(a_1,a_2, \dots , a_k)$ representing upper constraints
    :return:  $\binom{n+k-1}{k-1} - \sum_{m=1}^{k} (-1)^{m+1}
    \sum_{1\leq i_1 < i_2 < \dots <i_m \leq  k}
    \binom{n-\sum_{l=1}^{m} a_{i_{l}} - m + k - 1}{k-1}$
    """

    k = len(up_t)
    p = power_lists(range(1, k + 1))

    s = 0
    for l in p:
        s += ((-1)**(len(l))) * binomial(n + k - 1 - len(l) - sum([up_t[i - 1] for i in l]), k - 1)

    if verbose:
        print p
        print 'emmenems of each color in the pocket : ' + str(up_t)
        print 'emmenems in the hand : ' + str(n)
        print 'numbers of handfuls : ' + str(s)

    return s
def test_power_set_simple(verbose=True):

    s1 = ['a', 'b', 'c']
    ans_ground = [[], ['a'], ['b'], ['c'], ['a', 'b'], ['a', 'c'], ['b', 'c'], ['a', 'b', 'c']]
    ans = power_lists(s1)

    if verbose:
        print ''
        print 'Power set of ' + str(s1) + ':'
        print ans

    assert_equal(len(ans), len(ans_ground))
    for i in range(len(ans)):
        assert_true(ans[i] in ans_ground)