'Returns the lexicographic rank of the permutation.
Examples
>>> from sympy.combinatorics.permutations import Permutation
>>> p = Permutation([0, 1, 2, 3])
>>> p.rank()
0
>>> p = Permutation([3, 2, 1, 0])
>>> p.rank()
23
See Also
next_lex, unrank_lex, cardinality, length, order, size'

def rank(self):

    if (not (self._rank is None)):
        return self._rank
    rank = 0
    rho = self.array_form[:]
    n = (self.size - 1)
    size = (n + 1)
    psize = int(ifac(n))
    for j in range((size - 1)):
        rank += (rho[j] * psize)
        for i in range((j + 1), size):
            if (rho[i] > rho[j]):
                rho[i] -= 1
        psize //= n
        n -= 1
    self._rank = rank
    return rank
