Skip to content

Commit cad751d

Browse files
committed
created helper function for unrank in IntegerVector
1 parent 167acc9 commit cad751d

File tree

1 file changed

+25
-39
lines changed

1 file changed

+25
-39
lines changed

src/sage/combinat/integer_vector.py

Lines changed: 25 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,20 @@ def __contains__(self, x):
780780
return False
781781
return True
782782

783+
def unrank(self, x, rtn):
784+
ptr = 0
785+
while True:
786+
current_rank = self.rank(rtn)
787+
if current_rank < x:
788+
rtn[ptr+1] = rtn[ptr]
789+
rtn[ptr] = 0
790+
ptr += 1
791+
elif current_rank > x:
792+
rtn[ptr] -= 1
793+
rtn[ptr-1] += 1
794+
else:
795+
return self._element_constructor_(rtn)
796+
783797

784798
class IntegerVectors_all(UniqueRepresentation, IntegerVectors):
785799
"""
@@ -945,22 +959,12 @@ def unrank(self, x):
945959
sage: IntegerVectors(n=10).unrank(10)
946960
[1, 9]
947961
"""
948-
ptr = 0
949962
rtn = [self.n]
950963
while self.rank(rtn) < x:
951964
rtn.append(0)
952965
rtn.pop()
953966

954-
while True:
955-
if self.rank(rtn) < x:
956-
rtn[ptr+1] = rtn[ptr]
957-
rtn[ptr] = 0
958-
ptr += 1
959-
elif self.rank(rtn) > x:
960-
rtn[ptr] -= 1
961-
rtn[ptr-1] += 1
962-
else:
963-
return self._element_constructor_(rtn)
967+
return IntegerVectors.unrank(self, x, rtn)
964968

965969
def cardinality(self):
966970
"""
@@ -1086,7 +1090,7 @@ def unrank(self, x):
10861090
10871091
INPUT:
10881092
1089-
- ``x`` -- an integer such that x < len(self) ``
1093+
- ``x`` -- an integer such that x < self.cardinality() ``
10901094
10911095
EXAMPLES::
10921096
@@ -1098,22 +1102,14 @@ def unrank(self, x):
10981102
if self.k == 0 and x != 0:
10991103
raise IndexError(f"Index {x} is out of range for the IntegerVector.")
11001104
else:
1101-
n, ptr = 0, 0
1105+
n = 0
11021106
rtn = [0]*self.k
11031107
while self.rank(rtn) <= x:
11041108
n += 1
1105-
rtn[ptr] = n
1106-
rtn[ptr] -= 1
1107-
while True:
1108-
if self.rank(rtn) < x:
1109-
rtn[ptr+1] = rtn[ptr]
1110-
rtn[ptr] = 0
1111-
ptr += 1
1112-
elif self.rank(rtn) > x:
1113-
rtn[ptr] -= 1
1114-
rtn[ptr-1] += 1
1115-
else:
1116-
return self._element_constructor_(rtn)
1109+
rtn[0] = n
1110+
rtn[0] -= 1
1111+
1112+
return IntegerVectors.unrank(self, x, rtn)
11171113

11181114
def cardinality(self):
11191115
"""
@@ -1333,7 +1329,7 @@ def unrank(self, x):
13331329
13341330
INPUT:
13351331
1336-
- ``x`` -- an integer such that ``x < len(self)``
1332+
- ``x`` -- an integer such that ``x < self.cardinality()``
13371333
13381334
EXAMPLES::
13391335
@@ -1342,22 +1338,12 @@ def unrank(self, x):
13421338
sage: IntegerVectors(2,3).unrank(5)
13431339
[0, 0, 2]
13441340
"""
1345-
if x >= len(self):
1341+
if x >= self.cardinality():
13461342
raise IndexError(f"Index {x} is out of range for the IntegerVector.")
13471343
else:
1348-
ptr = 0
13491344
rtn = [0]*self.k
1350-
rtn[ptr] = self.n
1351-
while True:
1352-
if self.rank(rtn) < x:
1353-
rtn[ptr+1] = rtn[ptr]
1354-
rtn[ptr] = 0
1355-
ptr += 1
1356-
elif self.rank(rtn) > x:
1357-
rtn[ptr] -= 1
1358-
rtn[ptr-1] += 1
1359-
else:
1360-
return self._element_constructor_(rtn)
1345+
rtn[0] = self.n
1346+
return IntegerVectors.unrank(self, x, rtn)
13611347

13621348
def cardinality(self):
13631349
"""

0 commit comments

Comments
 (0)