def rank(self, sub): """ Return the rank of ``sub`` as a subset of ``s`` of size ``k``. EXAMPLES:: sage: Subsets(3,2).rank([1,2]) 0 sage: Subsets([2,3,4],2).rank([3,4]) 2 sage: Subsets([2,3,4],2).rank([2]) Traceback (most recent call last): ... ValueError: {2} is not a subset of length 2 of {2, 3, 4} sage: Subsets([2,3,4],4).rank([2,3,4,5]) Traceback (most recent call last): ... ValueError: {2, 3, 4, 5} is not a subset of length 4 of {2, 3, 4} """ sub = Set(sub) n = self._s.cardinality() if self._k != sub.cardinality() or self._k > n: raise ValueError("{} is not a subset of length {} of {}".format( sub, self._k, self._s)) try: index_list = sorted(self._s.rank(x) for x in sub) except ValueError: raise ValueError("{} is not a subset of length {} of {}".format( sub, self._k, self._s)) return combination.rank(index_list, n)
def rank(self, sub): """ Return the rank of ``sub`` as a subset of ``s``. EXAMPLES:: sage: Subsets(3).rank([]) 0 sage: Subsets(3).rank([1,2]) 4 sage: Subsets(3).rank([1,2,3]) 7 sage: Subsets(3).rank([2,3,4]) Traceback (most recent call last): ... ValueError: {2, 3, 4} is not a subset of {1, 2, 3} """ if sub not in Sets(): ssub = Set(sub) if len(sub) != len(ssub): raise ValueError("repeated elements in {}".format(sub)) sub = ssub try: index_list = sorted(self._s.rank(x) for x in sub) except (ValueError, IndexError): raise ValueError("{} is not a subset of {}".format( Set(sub), self._s)) n = self._s.cardinality() r = sum(binomial(n, i) for i in xrange(len(index_list))) return r + combination.rank(index_list, n)
def rank(self, sub): """ Return the rank of ``sub`` as a subset of ``s``. EXAMPLES:: sage: Subsets(3).rank([]) 0 sage: Subsets(3).rank([1,2]) 4 sage: Subsets(3).rank([1,2,3]) 7 sage: Subsets(3).rank([2,3,4]) Traceback (most recent call last): ... ValueError: {2, 3, 4} is not a subset of {1, 2, 3} """ if sub not in Sets(): ssub = Set(sub) if len(sub) != len(ssub): raise ValueError("repeated elements in {}".format(sub)) sub = ssub try: index_list = sorted(self._s.rank(x) for x in sub) except (ValueError,IndexError): raise ValueError("{} is not a subset of {}".format( Set(sub), self._s)) n = self._s.cardinality() r = sum(binomial(n,i) for i in xrange(len(index_list))) return r + combination.rank(index_list,n)