def permutations(lis): N = len(lis) i = 0 c = [*range(0, max(2,N+1))] while True: yield lis i = 1 while c[i] == 0: c[i] = i i += 1 if i >= N: break c[i] -= 1 k = 0 if i % 2 == 0 else c[i] lis[k], lis[i] = lis[i], lis[k] for l in range(9): lis = [i for i in range(l)] s = set() for x in permutations(lis): # all permutation must be of length l assert len(x) == l # all permutation must be unique radix = [True] * l for i in x: assert radix[i] radix[i] = False # all permutation must be unique hash = sum([x[i] * l**i for i in range(l)]) assert hash not in s s.add(hash) # exactly l! number of permutations assert len(s) == factorial(l) print(l, len(s))