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)