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