def iterative_PGA_with_dict(width): ''' Iterative permutation generation algorithm according to dict order. ''' total_numbers = math.factorial(width) for i in range(total_numbers): asc_number = integer_to_ascending_system_number(i) asc_number += (width - len(asc_number)) * [0] # align ret = [] ordered_index = list(range(width)) for n in reversed(asc_number): ret.append(ordered_index[n]) del ordered_index[n] yield list(ret)
def PGA_with_ascending_system_number(width): ''' permutation generation algorithm by mapping index to ascending system number and then mapping it to sequence. ''' total_numbers = math.factorial(width) for i in range(total_numbers): asc_number = integer_to_ascending_system_number(i) asc_number += (width - len(asc_number)) * [0] # align ret = [None, ] * width for index, n in enumerate(reversed(asc_number)): for pos in reversed(range(width)): if ret[pos] is None: n -= 1 if n < 0: ret[pos] = width - index - 1 break yield ret