Changeset 7316:b549ac617002


Ignore:
Timestamp:
11/03/07 11:29:10 (6 years ago)
Author:
Mike Hansen <mhansen@…>
Branch:
default
Message:

Fixed #1071

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sage/combinat/integer_vector.py

    r6594 r7316  
    124124            return IntegerVectors_nnondescents(n,k) 
    125125        else: 
    126             return IntegerVectors_nkconstraints(n,k,kwargs) 
     126            if len(kwargs) == 1 and 'min_part' in kwargs and kwargs['min_part'] == 0: 
     127                return IntegerVectors_nk0(n,k) 
     128            else: 
     129                return IntegerVectors_nkconstraints(n,k,kwargs) 
    127130 
    128131 
     
    156159        return infinity 
    157160 
     161class IntegerVectors_nk0(CombinatorialClass): 
     162    """ 
     163    TESTS: 
     164        sage: iv = IntegerVectors(3,2, min_part=0) 
     165        sage: iv == loads(dumps(iv)) 
     166        True 
     167 
     168    AUTHORS: 
     169        --Martin Albrecht 
     170        --Mike Hansen 
     171    """ 
     172    def __init__(self, n, k): 
     173        self.n = n 
     174        self.k = k 
     175 
     176    def iterator(self): 
     177        """ 
     178        EXAMPLE: 
     179            sage: IV = IntegerVectors(2,3, min_part=0) 
     180            sage: IV.list() # indirect doctest 
     181            [[2, 0, 0], [1, 0, 1], [1, 1, 0], [0, 0, 2], [0, 1, 1], [0, 2, 0]] 
     182            sage: IntegerVectors(3, 0, min_part=0).list() 
     183            [] 
     184            sage: IntegerVectors(3, 1, min_part=0).list() 
     185            [[3]] 
     186            sage: IntegerVectors(0, 1, min_part=0).list() 
     187            [[0]] 
     188            sage: IntegerVectors(0, 2, min_part=0).list() 
     189            [[0, 0]] 
     190            sage: IntegerVectors(2, 2, min_part=0).list() 
     191            [[2, 0], [1, 1], [0, 2]] 
     192        """ 
     193 
     194        N = self.n 
     195        k = self.k 
     196        if k == 0: 
     197            if N == 0: 
     198                yield [] 
     199                raise StopIteration 
     200            else: 
     201                raise StopIteration 
     202        if N < 0: 
     203            raise StopIteration 
     204        if k == 1: 
     205            yield [N] 
     206            raise StopIteration 
     207         
     208        for nbar in xrange(N+1): 
     209            n = N-nbar 
     210            for rest in IntegerVectors_nk0( nbar , k-1): 
     211                rest.append(n) 
     212                rest.reverse() 
     213                yield rest 
     214 
     215    def __repr__(self): 
     216        return "Integer vectors of length %s that sum to %s with min_part == 0"%(self.k, self.n) 
     217 
     218    def __contains__(self, x): 
     219        if x not in IntegerVectors(): 
     220            return False 
     221 
     222        if sum(x) != self.n: 
     223            return False 
     224 
     225        if len(x) != self.k: 
     226            return False 
     227 
     228        if min(x) < 0: 
     229            return False 
     230 
     231        return True 
     232  
    158233class IntegerVectors_nkconstraints(CombinatorialClass): 
    159234    def __init__(self, n, k, constraints): 
     
    194269        else: 
    195270            return "Integer vectors of length %s that sum to %s"%(self.k, self.n) 
    196  
     271  
    197272    def __contains__(self, x): 
    198273        """ 
Note: See TracChangeset for help on using the changeset viewer.