§
    OŠtjr  ã                   ó‚   — d dl mZ d dlmZ d dlmZ ddlmZ ddlm	Z	m
Z
mZ  G d„ de¦  «        Z G d	„ d
e¦  «        ZdS )é    )ÚS)Ú_sympify)ÚKroneckerDeltaé   )Ú
MatrixExpr)Ú
ZeroMatrixÚIdentityÚ	OneMatrixc                   óz   ‡ — e Zd ZdZˆ fd„Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ Z	d„ Z
d„ ZexZZd	„ Zd
„ Zˆ xZS )ÚPermutationMatrixa±  A Permutation Matrix

    Parameters
    ==========

    perm : Permutation
        The permutation the matrix uses.

        The size of the permutation determines the matrix size.

        See the documentation of
        :class:`sympy.combinatorics.permutations.Permutation` for
        the further information of how to create a permutation object.

    Examples
    ========

    >>> from sympy import Matrix, PermutationMatrix
    >>> from sympy.combinatorics import Permutation

    Creating a permutation matrix:

    >>> p = Permutation(1, 2, 0)
    >>> P = PermutationMatrix(p)
    >>> P = P.as_explicit()
    >>> P
    Matrix([
    [0, 1, 0],
    [0, 0, 1],
    [1, 0, 0]])

    Permuting a matrix row and column:

    >>> M = Matrix([0, 1, 2])
    >>> Matrix(P*M)
    Matrix([
    [1],
    [2],
    [0]])

    >>> Matrix(M.T*P)
    Matrix([[2, 0, 1]])

    See Also
    ========

    sympy.combinatorics.permutations.Permutation
    c                 óÖ   •— ddl m} t          |¦  «        }t          ||¦  «        s"t	          d                     |¦  «        ¦  «        ‚t          ¦   «                              | |¦  «        S )Nr   ©ÚPermutationz({} must be a SymPy Permutation instance.)Ú sympy.combinatorics.permutationsr   r   Ú
isinstanceÚ
ValueErrorÚformatÚsuperÚ__new__)ÚclsÚpermr   Ú	__class__s      €úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/matrices/expressions/permutation.pyr   zPermutationMatrix.__new__;   ss   ø€ Ø@Ð@Ð@Ð@Ð@Ð@å˜‰~Œ~ˆÝ˜$ Ñ,Ô,ð 	IÝØ:×AÒAÀ$ÑGÔGñIô Ið Iõ ‰wŒw�Š˜s DÑ)Ô)Ð)ó    c                 ó.   — | j         d         j        }||fS ©Nr   )ÚargsÚsize)Úselfr   s     r   ÚshapezPermutationMatrix.shapeE   s   € àŒy˜Œ|Ô ˆØ�dˆ|Ðr   c                 ó&   — | j         d         j        S r   )r   Úis_Identity©r   s    r   r"   zPermutationMatrix.is_IdentityJ   s   € àŒy˜Œ|Ô'Ð'r   c                 ó<   — | j         rt          | j        ¦  «        S | S )N)r"   r	   Úrows)r   Úhintss     r   ÚdoitzPermutationMatrix.doitN   s"   € ØÔð 	'Ý˜DœIÑ&Ô&Ð&Øˆr   c                 ób   — | j         d         }t          |                     |¦  «        |¦  «        S r   )r   r   Úapply)r   ÚiÚjÚkwargsr   s        r   Ú_entryzPermutationMatrix._entryS   s'   € ØŒy˜Œ|ˆÝ˜dŸjšj¨™mœm¨QÑ/Ô/Ð/r   c                 ó`   — t          | j        d         |z  ¦  «                             ¦   «         S r   )r   r   r'   )r   Úexps     r   Ú_eval_powerzPermutationMatrix._eval_powerW   s'   € Ý  ¤¨1¤°Ñ!4Ñ5Ô5×:Ò:Ñ<Ô<Ð<r   c                 ó<   — t          | j        d         dz  ¦  «        S )Nr   éÿÿÿÿ)r   r   r#   s    r   Ú_eval_inversezPermutationMatrix._eval_inverseZ   s   € Ý  ¤¨1¤°Ñ!3Ñ4Ô4Ð4r   c                 ó–   — | j         d                              ¦   «         }|dk    rt          j        S |dk    rt          j        S t
          ‚)Nr   r   r2   )r   Ú	signaturer   ÚOneÚNegativeOneÚNotImplementedError)r   Úsigns     r   Ú_eval_determinantz#PermutationMatrix._eval_determinant_   s@   € ØŒy˜Œ|×%Ò%Ñ'Ô'ˆØ�1Š9ˆ9Ý”5ˆLØ�RŠZˆZÝ”=Ð Ý!Ð!r   c                 óˆ  ‡— ddl m} ddlm} | j        d         }|j        }g }d\  }}	}
d}|D �]}t          |¦  «        }t          |¦  «        }|s2|dz   ||z   k    r
d}|g}|}	|}
Œ9|                     |g¦  «         ||z  }ŒU||	k    r^|dz   ||
z   |z   k    r2|                     |¦  «         |                     |¦  «         d}|dz   }Œœ|}	|                     |¦  «         |
|z  }
Œ¹|	dz   ||
z   |z   k    r2|                     |¦  «         |                     |¦  «         d}|	dz   }Œú|                     |¦  «         |
|z  }
�ŒdŠg }|D ]t}g }d}|D ]7}ˆfd„|D ¦   «         }|                     |¦  «         |t          |¦  «        z  }Œ8‰|z  Š ||¦  «        }t          |¦  «        }|                     |¦  «         Œu ||Ž S )	Nr   r   r   )ÚBlockDiagMatrix)r   r   r   FTc                 ó   •— g | ]}|‰z
  ‘ŒS © r>   )Ú.0r*   Úps     €r   ú
<listcomp>zFPermutationMatrix._eval_rewrite_as_BlockDiagMatrix.<locals>.<listcomp>�   s   ø€ Ð2Ð2Ð2 q˜Q ™UÐ2Ð2Ð2r   )
r   r   Úblockmatrixr<   r   Úfull_cyclic_formÚlenÚmaxÚappendr   )r   r   r,   r   r<   r   rC   Úcycles_picksÚaÚbÚcÚflagÚcycleÚlÚmÚtempÚpickÚ
new_cyclesÚ	new_cycleÚmatr@   s                       @r   Ú _eval_rewrite_as_BlockDiagMatrixz2PermutationMatrix._eval_rewrite_as_BlockDiagMatrixg   sf  ø€ Ø@Ð@Ð@Ð@Ð@Ð@Ø0Ð0Ð0Ð0Ð0Ð0àŒy˜Œ|ˆØÔ0Ðàˆð ‰ˆˆ1ˆaØˆØ%ð !	ñ !	ˆEÝ�E‘
”
ˆAÝ�E‘
”
ˆAàð Ø�q‘5˜1˜q™5’=�=Ø�DØ!˜7�DØ�AØ�A�Aà ×'Ò'¨¨Ñ0Ô0Ð0Ø˜‘F�A�Að �q’5�5Ø˜1‘u  A¡¨¡	Ò)Ð)ØŸš EÑ*Ô*Ð*Ø$×+Ò+¨DÑ1Ô1Ð1Ø$˜Ø˜a™C˜˜à˜ØŸš EÑ*Ô*Ð*Ø˜Q™˜˜à˜1‘u  A¡¨¡	Ò)Ð)ØŸš EÑ*Ô*Ð*Ø$×+Ò+¨DÑ1Ô1Ð1Ø$˜Ø˜a™C˜˜àŸš EÑ*Ô*Ð*Ø˜Q™˜™ð ˆØˆØ ð 
	ð 
	ˆDØˆJØˆAØð  ð  �Ø2Ð2Ð2Ð2¨EÐ2Ñ2Ô2�	Ø×!Ò! )Ñ,Ô,Ð,Ø•S˜‘Z”Z‘��Ø�‰FˆAØ�;˜zÑ*Ô*ˆDÝ# DÑ)Ô)ˆCØ�KŠK˜ÑÔÐÐàˆ Ð%Ð%r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr    r"   r'   r-   r0   r3   Ú_eval_transposeÚ_eval_adjointr:   rT   Ú__classcell__©r   s   @r   r   r   	   sß   ø€ € € € € ð/ð /ðb*ð *ð *ð *ð *ð ðð ñ „Xðð ð(ð (ñ „Xð(ðð ð ð
0ð 0ð 0ð=ð =ð =ð5ð 5ð 5ð '4Ð3€O�mð"ð "ð "ð>&ð >&ð >&ð >&ð >&ð >&ð >&r   r   c                   óZ   ‡ — e Zd ZdZej        fˆ fd„	Zdd„Zed„ ¦   «         Z	d„ Z
d„ Zˆ xZS )	ÚMatrixPermuteaz  Symbolic representation for permuting matrix rows or columns.

    Parameters
    ==========

    perm : Permutation, PermutationMatrix
        The permutation to use for permuting the matrix.
        The permutation can be resized to the suitable one,

    axis : 0 or 1
        The axis to permute alongside.
        If `0`, it will permute the matrix rows.
        If `1`, it will permute the matrix columns.

    Notes
    =====

    This follows the same notation used in
    :meth:`sympy.matrices.matrixbase.MatrixBase.permute`.

    Examples
    ========

    >>> from sympy import Matrix, MatrixPermute
    >>> from sympy.combinatorics import Permutation

    Permuting the matrix rows:

    >>> p = Permutation(1, 2, 0)
    >>> A = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    >>> B = MatrixPermute(A, p, axis=0)
    >>> B.as_explicit()
    Matrix([
    [4, 5, 6],
    [7, 8, 9],
    [1, 2, 3]])

    Permuting the matrix columns:

    >>> B = MatrixPermute(A, p, axis=1)
    >>> B.as_explicit()
    Matrix([
    [2, 3, 1],
    [5, 6, 4],
    [8, 9, 7]])

    See Also
    ========

    sympy.matrices.matrixbase.MatrixBase.permute
    c                 ó”  •— ddl m} t          |¦  «        }|j        s"t	          d                     |¦  «        ¦  «        ‚t          |¦  «        }t          |t          ¦  «        r|j        d         }t          ||¦  «        s"t	          d                     |¦  «        ¦  «        ‚t          |¦  «        }|dvrt	          d¦  «        ‚|j	        |         }||j
        k    rI	 |                     |¦  «        }n2# t          $ r% t	          d                     |||¦  «        ¦  «        ‚w xY wt          ¦   «                              | |||¦  «        S )Nr   r   z#{} must be a SymPy matrix instance.z>{} must be a SymPy Permutation or a PermutationMatrix instance)r   r   zThe axis must be 0 or 1.zsSize does not match between the permutation {} and the matrix {} threaded over the axis {} and cannot be converted.)r   r   r   Ú	is_Matrixr   r   r   r   r   r    r   Úresizer   r   )r   rS   r   Úaxisr   Úmat_sizer   s         €r   r   zMatrixPermute.__new__Ü   sj  ø€ Ø@Ð@Ð@Ð@Ð@Ð@å�s‰mŒmˆØŒ}ð 	DÝØ5×<Ò<¸TÑBÔBñDô Dð Dõ ˜‰~Œ~ˆÝ�dÕ-Ñ.Ô.ð 	 Ø”9˜Q”<ˆDå˜$ Ñ,Ô,ð 	)Ýðß!š6 $™<œ<ñ)ô )ð )õ ˜‰~Œ~ˆØ�vÐÐÝÐ7Ñ8Ô8Ð8à”9˜T”?ˆØ�t”yÒ Ð ð.Ø—{’{ 8Ñ,Ô,��øÝð .ð .ð .Ý ð/÷ ’V˜D # tÑ,Ô,ñ	.ô .ð .ð.øøøõ ‰wŒw�Š˜s C¨¨tÑ4Ô4Ð4s   ÃC4 Ã4/D#Tc                 óÒ  — | j         \  }}}|r |j        dd|i|¤Ž} |j        dd|i|¤Ž}|j        r|S |j        r=|t          j        u rt          |¦  «        S |t          j        u rt          |dz  ¦  «        S t          |t          t          f¦  «        r|S t          |t          ¦  «        r;|j         d         |k    r*t          |j         d         ||j         d         z  |¦  «        S | S )NÚdeepr2   é   r   r   r>   )r   r'   r"   r   ÚZeror   r6   r   r   r
   r_   )r   rf   r&   rS   r   rc   s         r   r'   zMatrixPermute.doitþ   s  € Øœ)‰ˆˆT�4àð 	1Ø�#”(Ð.Ð. Ð.¨Ð.Ð.ˆCØ�4”9Ð0Ð0 $Ð0¨%Ð0Ð0ˆDàÔð 	ØˆJàŒ?ð 	3Ø•q”vˆ~ˆ~Ý(¨Ñ.Ô.Ð.Ø�œ��Ý(¨¨r©Ñ2Ô2Ð2å�c�J­	Ð2Ñ3Ô3ð 	ØˆJå�c�=Ñ)Ô)ð 	H¨c¬h°q¬k¸TÒ.AÐ.AÝ  ¤¨!¤¨d°S´X¸a´[Ñ.@À$ÑGÔGÐGàˆr   c                 ó&   — | j         d         j        S r   )r   r    r#   s    r   r    zMatrixPermute.shape  s   € àŒy˜Œ|Ô!Ð!r   c                 ó¨   — | j         \  }}}|dk    r||                     |¦  «        |f         S |dk    r|||                     |¦  «        f         S d S )Nr   r   )r   r)   )r   r*   r+   r,   rS   r   rc   s          r   r-   zMatrixPermute._entry  s\   € Øœ)‰ˆˆT�4à�1Š9ˆ9Ø�t—z’z !‘}”} aÐ'Ô(Ð(Ø�QŠYˆYØ�q˜$Ÿ*š* Q™-œ-Ð'Ô(Ð(ð ˆYr   c                 ó  — ddl m} | j        \  }}}|                     dd¦  «        }|r|                     |¦  «        }|dk    r |t          |¦  «        |¦  «        S |dk    r ||t          |dz  ¦  «        ¦  «        S d S )Nr   )ÚMatMulrf   Tr   r2   )Úmatmulrl   r   ÚgetÚrewriter   )r   r   r,   rl   rS   r   rc   rf   s           r   Ú_eval_rewrite_as_MatMulz%MatrixPermute._eval_rewrite_as_MatMul"  s    € Ø"Ð"Ð"Ð"Ð"Ð"àœ)‰ˆˆT�4à�zŠz˜& $Ñ'Ô'ˆàð 	&Ø—+’+˜fÑ%Ô%ˆCà�1Š9ˆ9Ø�6Õ+¨DÑ1Ô1°3Ñ7Ô7Ð7Ø�QŠYˆYØ�6˜#Õ0°°r±Ñ:Ô:Ñ;Ô;Ð;ð ˆYr   )T)rU   rV   rW   rX   r   rh   r   r'   rY   r    r-   rp   r\   r]   s   @r   r_   r_   ¨   s�   ø€ € € € € ð2ð 2ðf &'¤Vð  5ð  5ð  5ð  5ð  5ð  5ðDð ð ð ð0 ð"ð "ñ „Xð"ð)ð )ð )ð<ð <ð <ð <ð <ð <ð <r   r_   N)Ú
sympy.corer   Úsympy.core.sympifyr   Úsympy.functionsr   Úmatexprr   Úspecialr   r	   r
   r   r_   r>   r   r   ú<module>rv      sÜ   ðØ Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø *Ð *Ð *Ð *Ð *Ð *à Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4ð\&ð \&ð \&ð \&ð \&˜
ñ \&ô \&ð \&ð~G<ð G<ð G<ð G<ð G<�Jñ G<ô G<ð G<ð G<ð G<r   