(cls, *args, **kwargs)
return obj
Constructor for the Permutation object from a list or a
        list of lists in which all elements of the permutation may
        appear only once.

        Examples
        ========

        >>> from sympy.combinatorics.permutations import Permutation
        >>> Permutation.print_cyclic = False

        Permutations entered in array-form are left unaltered:

        >>> Permutation([0, 2, 1])
        Permutation([0, 2, 1])

        Permutations entered in cyclic form are converted to array form;
        singletons need not be entered, but can be entered to indicate the
        largest element:

        >>> Permutation([[4, 5, 6], [0, 1]])
        Permutation([1, 0, 2, 3, 5, 6, 4])
        >>> Permutation([[4, 5, 6], [0, 1], [19]])
        Permutation([1, 0, 2, 3, 5, 6, 4], size=20)

        All manipulation of permutations assumes that the smallest element
        is 0 (in keeping with 0-based indexing in Python) so if the 0 is
        missing when entering a permutation in array form, an error will be
        raised:

        >>> Permutation([2, 1])
        Traceback (most recent call last):
        ...
        ValueError: Integers 0 through 2 must be present.

        If a permutation is entered in cyclic form, it can be entered without
        singletons and the ``size`` specified so those values can be filled
        in, otherwise the array form will only extend to the maximum value
        in the cycles:

        >>> Permutation([[1, 4], [3, 5, 2]], size=10)
        Permutation([0, 4, 3, 5, 1, 2], size=10)
        >>> _.array_form
        [0, 4, 3, 5, 1, 2, 6, 7, 8, 9]
Constructor for the Permutation object from a list or a
        list of lists in which all elements of the permutation may
        appear only once.
Constructor for the Permutation object from a list or a list of lists in which all elements of the permutation may appear only once .
def __new__(cls, *args, **kwargs):
        """
        Constructor for the Permutation object from a list or a
        list of lists in which all elements of the permutation may
        appear only once.

        Examples
        ========

        >>> from sympy.combinatorics.permutations import Permutation
        >>> Permutation.print_cyclic = False

        Permutations entered in array-form are left unaltered:

        >>> Permutation([0, 2, 1])
        Permutation([0, 2, 1])

        Permutations entered in cyclic form are converted to array form;
        singletons need not be entered, but can be entered to indicate the
        largest element:

        >>> Permutation([[4, 5, 6], [0, 1]])
        Permutation([1, 0, 2, 3, 5, 6, 4])
        >>> Permutation([[4, 5, 6], [0, 1], [19]])
        Permutation([1, 0, 2, 3, 5, 6, 4], size=20)

        All manipulation of permutations assumes that the smallest element
        is 0 (in keeping with 0-based indexing in Python) so if the 0 is
        missing when entering a permutation in array form, an error will be
        raised:

        >>> Permutation([2, 1])
        Traceback (most recent call last):
        ...
        ValueError: Integers 0 through 2 must be present.

        If a permutation is entered in cyclic form, it can be entered without
        singletons and the ``size`` specified so those values can be filled
        in, otherwise the array form will only extend to the maximum value
        in the cycles:

        >>> Permutation([[1, 4], [3, 5, 2]], size=10)
        Permutation([0, 4, 3, 5, 1, 2], size=10)
        >>> _.array_form
        [0, 4, 3, 5, 1, 2, 6, 7, 8, 9]
        """
        size = kwargs.pop('size', None)
        if size is not None:
            size = int(size)

        #a) ()
        #b) (1) = identity
        #c) (1, 2) = cycle
        #d) ([1, 2, 3]) = array form
        #e) ([[1, 2]]) = cyclic form
        #f) (Cycle) = conversion to permutation
        #g) (Permutation) = adjust size or return copy
        ok = True
        if not args:  # a
            return _af_new(list(range(size or 0)))
        elif len(args) > 1:  # c
            return _af_new(Cycle(*args).list(size))
        if len(args) == 1:
            a = args[0]
            if isinstance(a, Perm):  # g
                if size is None or size == a.size:
                    return a
                return Perm(a.array_form, size=size)
            if isinstance(a, Cycle):  # f
                return _af_new(a.list(size))
            if not is_sequence(a):  # b
                return _af_new(list(range(a + 1)))
            if has_variety(is_sequence(ai) for ai in a):
                ok = False
        else:
            ok = False
        if not ok:
            raise ValueError("Permutation argument must be a list of ints, "
                             "a list of lists, Permutation or Cycle.")


        # safe to assume args are valid; this also makes a copy
        # of the args
        args = list(args[0])

        is_cycle = args and is_sequence(args[0])
        if is_cycle:  # e
            args = [[int(i) for i in c] for c in args]
        else:  # d
            args = [int(i) for i in args]

        # if there are n elements present, 0, 1, ..., n-1 should be present
        # unless a cycle notation has been provided. A 0 will be added
        # for convenience in case one wants to enter permutations where
        # counting starts from 1.

        temp = flatten(args)
        if has_dups(temp):
            if is_cycle:
                raise ValueError('there were repeated elements; to resolve '
                'cycles use Cycle%s.' % ''.join([str(tuple(c)) for c in args]))
            else:
                raise ValueError('there were repeated elements.')
        temp = set(temp)

        if not is_cycle and \
                any(i not in temp for i in range(len(temp))):
            raise ValueError("Integers 0 through %s must be present." %
                             max(temp))

        if is_cycle:
            # it's not necessarily canonical so we won't store
            # it -- use the array form instead
            c = Cycle()
            for ci in args:
                c = c(*ci)
            aform = c.list()
        else:
            aform = list(args)
        if size and size > len(aform):
            # don't allow for truncation of permutation which
            # might split a cycle and lead to an invalid aform
            # but do allow the permutation size to be increased
            aform.extend(list(range(len(aform), size)))
        size = len(aform)
        obj = Basic.__new__(cls, aform)
        obj._array_form = aform
        obj._size = size
        return obj
def __new__ ( cls , * args , * * kwargs ) : size = kwargs . pop ( 'size' , None ) if size is not None : size = int ( size ) #a) () #b) (1) = identity #c) (1, 2) = cycle #d) ([1, 2, 3]) = array form #e) ([[1, 2]]) = cyclic form #f) (Cycle) = conversion to permutation #g) (Permutation) = adjust size or return copy ok = True if not args : # a return _af_new ( list ( range ( size or 0 ) ) ) elif len ( args ) > 1 : # c return _af_new ( Cycle ( * args ) . list ( size ) ) if len ( args ) == 1 : a = args [ 0 ] if isinstance ( a , Perm ) : # g if size is None or size == a . size : return a return Perm ( a . array_form , size = size ) if isinstance ( a , Cycle ) : # f return _af_new ( a . list ( size ) ) if not is_sequence ( a ) : # b return _af_new ( list ( range ( a + 1 ) ) ) if has_variety ( is_sequence ( ai ) for ai in a ) : ok = False else : ok = False if not ok : raise ValueError ( "Permutation argument must be a list of ints, " "a list of lists, Permutation or Cycle." ) # safe to assume args are valid; this also makes a copy # of the args args = list ( args [ 0 ] ) is_cycle = args and is_sequence ( args [ 0 ] ) if is_cycle : # e args = [ [ int ( i ) for i in c ] for c in args ] else : # d args = [ int ( i ) for i in args ] # if there are n elements present, 0, 1, ..., n-1 should be present # unless a cycle notation has been provided. A 0 will be added # for convenience in case one wants to enter permutations where # counting starts from 1. temp = flatten ( args ) if has_dups ( temp ) : if is_cycle : raise ValueError ( 'there were repeated elements; to resolve ' 'cycles use Cycle%s.' % '' . join ( [ str ( tuple ( c ) ) for c in args ] ) ) else : raise ValueError ( 'there were repeated elements.' ) temp = set ( temp ) if not is_cycle and any ( i not in temp for i in range ( len ( temp ) ) ) : raise ValueError ( "Integers 0 through %s must be present." % max ( temp ) ) if is_cycle : # it's not necessarily canonical so we won't store # it -- use the array form instead c = Cycle ( ) for ci in args : c = c ( * ci ) aform = c . list ( ) else : aform = list ( args ) if size and size > len ( aform ) : # don't allow for truncation of permutation which # might split a cycle and lead to an invalid aform # but do allow the permutation size to be increased aform . extend ( list ( range ( len ( aform ) , size ) ) ) size = len ( aform ) obj = Basic . __new__ ( cls , aform ) obj . _array_form = aform obj . _size = size return obj