Enumerating all 3-tuples
Robin Becker
robin at reportlab.com
Mon Mar 12 11:54:05 EDT 2018
On 12/03/2018 13:17, Robin Becker wrote:
> It's possible to generalize the cantor pairing function to triples, but that may not give you what you want. Effectively you can
> generate an arbitrary number of triples using an iterative method. My sample code looked like this
....ct mapping of non-negative integers to triplets.
An alternative approach gives more orderly sequences using a variable base number construction
class Tupilator(object):
def __init__(self,degree=3):
self.i = 0
self.n = 2
self.degree = degree
def next(self):
x = self.i
v = []
a =v.append
n = self.n
if not x: a(0)
while x>0:
x, d = divmod(x,n)
a(d)
if sum(v)==self.degree*(n-1):
self.n += 1
pad = self.degree - len(v)
if pad>0:
v += pad*[0]
self.i += 1
return tuple(v)
if __name__=='__main__':
t = Tupilator()
for z in xrange(100):
print z, t.next()
> 0 (0, 0, 0)
> 1 (1, 0, 0)
> 2 (0, 1, 0)
> 3 (1, 1, 0)
> 4 (0, 0, 1)
> 5 (1, 0, 1)
> 6 (0, 1, 1)
> 7 (1, 1, 1)
> 8 (2, 2, 0)
> 9 (0, 0, 1)
> 10 (1, 0, 1)
> 11 (2, 0, 1)
> 12 (0, 1, 1)
> 13 (1, 1, 1)
> 14 (2, 1, 1)
> 15 (0, 2, 1)
> 16 (1, 2, 1)
> 17 (2, 2, 1)
> 18 (0, 0, 2)
> 19 (1, 0, 2)
> 20 (2, 0, 2)
> 21 (0, 1, 2)
> 22 (1, 1, 2)
> 23 (2, 1, 2)
> 24 (0, 2, 2)
> 25 (1, 2, 2)
> 26 (2, 2, 2)
> 27 (3, 2, 1)
> 28 (0, 3, 1)
> 29 (1, 3, 1)
> 30 (2, 3, 1)
> 31 (3, 3, 1)
> 32 (0, 0, 2)
> 33 (1, 0, 2)
> 34 (2, 0, 2)
> 35 (3, 0, 2)
> 36 (0, 1, 2)
> 37 (1, 1, 2)
> 38 (2, 1, 2)
> 39 (3, 1, 2)
> 40 (0, 2, 2)
........
> 80 (0, 1, 3)
> 81 (1, 1, 3)
> 82 (2, 1, 3)
> 83 (3, 1, 3)
> 84 (4, 1, 3)
> 85 (0, 2, 3)
> 86 (1, 2, 3)
> 87 (2, 2, 3)
> 88 (3, 2, 3)
> 89 (4, 2, 3)
> 90 (0, 3, 3)
> 91 (1, 3, 3)
> 92 (2, 3, 3)
> 93 (3, 3, 3)
> 94 (4, 3, 3)
> 95 (0, 4, 3)
> 96 (1, 4, 3)
> 97 (2, 4, 3)
> 98 (3, 4, 3)
> 99 (4, 4, 3)
--
Robin Becker
More information about the Python-list
mailing list