Enumerating all 3-tuples

Robin Becker robin at reportlab.com
Mon Mar 12 09:17:15 EDT 2018


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


import math

def cantor_pair(k1,k2):
	return (((k1+k2)*(k1+k2+1))>>1) + k2

def inverse_cantor_pair(z):
	w = int((math.sqrt(8*z+1)-1)/2.0)
	t = (w*(w+1))>>1
	j = z - t
	i = w - j
	return i, j

def cantor_triple(i,j,k):
	return cantor_pair(cantor_pair(i,j),k)

def inverse_cantor_triple(z):
	j,k = inverse_cantor_pair(z)
	i,j = inverse_cantor_pair(j)
	return i,j,k

if __name__=='__main__':
	for z in xrange(100):
		i,j,k = inverse_cantor_triple(z)
		print z, repr((i,j,k))


or changing the construction

import math

def cantor_pair(k1,k2):
	return (((k1+k2)*(k1+k2+1))>>1) + k2

def inverse_cantor_pair(z):
	w = int((math.sqrt(8*z+1)-1)/2.0)
	t = (w*(w+1))>>1
	j = z - t
	i = w - j
	return i, j

def cantor_triple(i,j,k):
	return cantor_pair(i,cantor_pair(j,k))

def inverse_cantor_triple(z):
	i,k = inverse_cantor_pair(z)
	j,k = inverse_cantor_pair(k)
	return i,j,k

if __name__=='__main__':
	for z in xrange(100):
		i,j,k = inverse_cantor_triple(z)
		print z, repr((i,j,k)), cantor_triple(i,j,k)==z

this give different outcomes, but both appear to be a correct mapping of non-negative integers to triplets.
-- 
Robin Becker




More information about the Python-list mailing list