@@ -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