Skip to content

Commit 7bf00d8

Browse files
author
Noel Roemmele
committed
Redesigned Tuple unrank function to use Integer.digits() method.
1 parent 0b40722 commit 7bf00d8

File tree

1 file changed

+32
-9
lines changed

1 file changed

+32
-9
lines changed

src/sage/combinat/tuple.py

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,31 @@ def unrank(self, i):
157157
...
158158
IndexError: index out of range
159159
160+
Verify that :meth:`unrank` works with non-integer sets::
161+
162+
sage: T = Tuples(['a', 'b', 'c'], 3)
163+
sage: T[15]
164+
('a', 'c', 'b')
165+
sage: T = Tuples([None, 1, ZZ, GF(2)], 5)
166+
sage: T[30]
167+
(Integer Ring, Finite Field of size 2, 1, None, None)
168+
169+
Verify that :meth:`unrank` gives the correct answer when `|S| < 1`::
170+
171+
sage: T = Tuples([],5)
172+
sage: T[0]
173+
Traceback (most recent call last):
174+
...
175+
IndexError: index i (=0) is greater than or equal to the cardinality
176+
sage: list(T)
177+
[]
178+
179+
Verify that :meth:`unrank` gives the correct answer when `|S| = 1`::
180+
181+
sage: T = Tuples([1],5)
182+
sage: T[0]
183+
(1, 1, 1, 1, 1)
184+
160185
Verify that :issue:`39534` has been fixed::
161186
162187
sage: T = Tuples(range(3), 30).random_element()
@@ -165,18 +190,16 @@ def unrank(self, i):
165190
sage: len(T)
166191
30
167192
"""
168-
r = ZZ(i)
169-
if r < 0:
193+
i = ZZ(i)
194+
if i < 0:
170195
raise IndexError("index out of range")
171-
ts = len(self.S)
172-
elt = []
173-
for _ in range(self.k):
174-
elt.append(self.S[r % ts])
175-
r //= ts
176-
if r > 0:
196+
if i >= self.cardinality():
177197
raise IndexError("index i (={}) is greater than or equal to the cardinality"
178198
.format(i))
179-
return tuple(elt)
199+
ts = len(self.S)
200+
if ts == 1:
201+
return tuple(self.S[0] for _ in range(self.k))
202+
return tuple(i.digits(ts, self.S, self.k))
180203

181204
def __iter__(self):
182205
"""

0 commit comments

Comments
 (0)