def remove_bit(i, n): return (i & ((1 << n) - 1)) | ((i & ~((1 << (n + 1)) - 1)) >> 1) def main(): N = 65 mappings = {} for i in range(0, N): n = 0 g = remove_bit(i, n) paths_set = set() while g < i: paths_set.add(g) n += 1 g = remove_bit(i, n) paths = sorted(list(paths_set)) mappings[i] = paths visited_set = set() stack = [paths[:]] while len(stack) > 0: for h in stack.pop(): if not h in visited_set: visited_set.add(h) stack.append(mappings[h]) visited = sorted(list(visited_set)) print(i, len(visited)) if __name__ == "__main__": main()