§
    OŠtj•<  ã                   ó  — d dl mZmZ d dlmZ d dlmZmZmZ d dl	m
Z
mZ d dlmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZ 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% 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/m0Z0m1Z1  G d„ de'e¦  «        Z2 e
j3        ee2fe2¦  «         d„ Z4d„ Z5d„ Z6d„ Z7d„ Z8d„ Z9d„ Z:d„ Z;d„ Z<e<e5e7e;e9e ed„ ¦  «        e6e8ee:fZ= e ee2 ee=Ž i¦  «        ¦  «        Z>d „ Z?d!„ Z@e@ed<   d"S )#é    )ÚaskÚQ)Úhandlers_dict)ÚBasicÚsympifyÚS)ÚmulÚMul)ÚNumberÚInteger©ÚDummy©Úadjoint)Úrm_idÚunpackÚtypedÚflattenÚexhaustÚdo_oneÚnew)ÚNonInvertibleMatrixError)Ú
MatrixBase)Úsympy_deprecation_warning)Úvalidate_matmul_integeré   )ÚInverse)Ú
MatrixExpr)ÚMatPow©Ú	transpose)ÚPermutationMatrix)Ú
ZeroMatrixÚIdentityÚGenericIdentityÚ	OneMatrixc                   ó¼   ‡ — e Zd ZdZdZ e¦   «         Zddddœd„Zed„ ¦   «         Z	e
d„ ¦   «         Zdd	„Zd
„ Zd„ Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zˆ xZS )ÚMatMula  
    A product of matrix expressions

    Examples
    ========

    >>> from sympy import MatMul, MatrixSymbol
    >>> A = MatrixSymbol('A', 5, 4)
    >>> B = MatrixSymbol('B', 4, 3)
    >>> C = MatrixSymbol('C', 3, 6)
    >>> MatMul(A, B, C)
    A*B*C
    TFN)ÚevaluateÚcheckÚ_sympifyc                ól  ‡ — |s‰ j         S t          t          ˆ fd„|¦  «        ¦  «        }|r"t          t          t          |¦  «        ¦  «        }t          j        ‰ g|¢R Ž }|                     ¦   «         \  }}|�t          ddd¬¦  «         |dur	t          |Ž  |s|S |r‰  
                    |¦  «        S |S )Nc                 ó   •— ‰j         | k    S ©N)Úidentity)ÚiÚclss    €ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/matrices/expressions/matmul.pyú<lambda>z MatMul.__new__.<locals>.<lambda>0   s   ø€  S¤\°QÒ%6€ ó    zaPassing check to MatMul is deprecated and the check argument will be removed in a future version.z1.11z,remove-check-argument-from-matrix-operations)Údeprecated_since_versionÚactive_deprecations_targetF)r/   ÚlistÚfilterÚmapr   r   Ú__new__Úas_coeff_matricesr   ÚvalidateÚ	_evaluate)r1   r)   r*   r+   ÚargsÚobjÚfactorÚmatricess   `       r2   r:   zMatMul.__new__*   sò   ø€ Øð 	 Ø”<Ðõ •FÐ6Ð6Ð6Ð6¸Ñ=Ô=Ñ>Ô>ˆØð 	,Ý��G TÑ*Ô*Ñ+Ô+ˆDÝŒm˜CÐ' $Ð'Ð'Ð'ˆØ×0Ò0Ñ2Ô2Ñˆ�àÐÝ%ØsØ)/Ø+Yð[ñ [ô [ð [ð
 ˜ÐÐÝ�hÐÐàð 	ð ˆMàð 	&Ø—=’= Ñ%Ô%Ð%àˆ
r4   c                 ó    — t          |¦  «        S r.   )Úcanonicalize)r1   Úexprs     r2   r=   zMatMul._evaluateJ   s   € å˜DÑ!Ô!Ð!r4   c                 óX   — d„ | j         D ¦   «         }|d         j        |d         j        fS )Nc                 ó    — g | ]}|j         ¯	|‘ŒS © ©Ú	is_Matrix©Ú.0Úargs     r2   ú
<listcomp>z MatMul.shape.<locals>.<listcomp>P   s   € Ð>Ð>Ð>˜C°´Ð>�CÐ>Ð>Ð>r4   r   éÿÿÿÿ)r>   ÚrowsÚcols)ÚselfrA   s     r2   ÚshapezMatMul.shapeN   s0   € à>Ð> 4¤9Ð>Ñ>Ô>ˆØ˜”Ô  (¨2¤,Ô"3Ð4Ð4r4   c                 ót  ‡‡‡— ddl m} ddlmŠ |                      ¦   «         \  }}t          |¦  «        dk    r||d         ||f         z  S d gt          |¦  «        dz   z  Šd gt          |¦  «        dz
  z  }|‰d<   |‰d<   d„ }	|                     d |	¦   «         ¦  «        Št          dt          |¦  «        ¦  «        D ]}t          ‰¦  «        ‰|<   Œt          |d d…         ¦  «        D ]\  }}
|
j
        d         dz
  ||<   Œˆˆfd„t          |¦  «        D ¦   «         }t          j        |¦  «        }t          ˆfd	„|D ¦   «         ¦  «        rd
}| ||gt          ‰dd…         dgt          |¦  «        z  |¦  «        ¢R Ž z  }t          d„ |D ¦   «         ¦  «        sd}|r|                     ¦   «         n|S )Nr   )ÚSum)ÚImmutableMatrixr   rN   c               3   ó@   K  — d} 	 t          d| z  ¦  «        V — | dz  } Œ)Nr   Tzi_%ir   )Úcounters    r2   ÚfzMatMul._entry.<locals>.fb   s7   è è € ØˆGðÝ˜F WÑ,Ñ-Ô-Ð-Ð-Ð-Ø˜1‘�ðr4   Údummy_generatorc                 ód   •— g | ],\  }}|                      ‰|         ‰|d z            ‰¬¦  «        ‘Œ-S )r   )rY   )Ú_entry)rK   r0   rL   rY   Úindicess      €€r2   rM   z!MatMul._entry.<locals>.<listcomp>o   s>   ø€ Ð|Ð|Ð|Ñ^dÐ^_Ðad�C—J’J˜w qœz¨7°1°Q±3¬<È�JÑYÔYÐ|Ð|Ð|r4   c              3   óB   •K  — | ]}|                      ‰¦  «        V — Œd S r.   ©Úhas)rK   ÚvrU   s     €r2   ú	<genexpr>z MatMul._entry.<locals>.<genexpr>q   s/   øè è € Ð8Ð8¨!ˆq�uŠu�_Ñ%Ô%Ð8Ð8Ð8Ð8Ð8Ð8r4   Tc              3   óN   K  — | ] }t          |t          t          f¦  «        V — Œ!d S r.   )Ú
isinstancer   Úint)rK   r`   s     r2   ra   z MatMul._entry.<locals>.<genexpr>y   s0   è è € ÐEÐE°Q•:˜a¥'­3 Ñ0Ô0ÐEÐEÐEÐEÐEÐEr4   F)Úsympy.concrete.summationsrT   Úsympy.matrices.immutablerU   r;   ÚlenÚgetÚrangeÚnextÚ	enumeraterR   r
   ÚfromiterÚanyÚzipÚdoit)rQ   r0   ÚjÚexpandÚkwargsrT   ÚcoeffrA   Ú
ind_rangesrX   rL   Úexpr_in_sumÚresultrU   rY   r\   s                @@@r2   r[   zMatMul._entryS   s"  øøø€ à1Ð1Ð1Ð1Ð1Ð1Ø<Ð<Ð<Ð<Ð<Ð<à×0Ò0Ñ2Ô2‰ˆˆxåˆx‰=Œ=˜AÒÐØ˜8 Aœ; q¨! tÔ,Ñ,Ð,à�&�#˜h™-œ-¨!Ñ+Ñ,ˆØ�V�S ™]œ]¨QÑ.Ñ/ˆ
Øˆ�‰
Øˆ�‰ð	ð 	ð 	ð !Ÿ*š*Ð%6¸¸¹¼Ñ<Ô<ˆå�q�#˜h™-œ-Ñ(Ô(ð 	/ð 	/ˆAÝ˜oÑ.Ô.ˆG�A‰JˆJå ¨¨"¨¤Ñ.Ô.ð 	-ð 	-‰FˆAˆsØœI aœL¨1Ñ,ˆJ�q‰MˆMØ|Ð|Ð|Ð|Ð|ÕhqÐrzÑh{Ôh{Ð|Ñ|Ô|ˆÝ”l 8Ñ,Ô,ˆÝÐ8Ð8Ð8Ð8¨xÐ8Ñ8Ô8Ñ8Ô8ð 	ØˆFØ�s�sØðå�W˜Q˜r˜T”] Q C­¨J©¬Ñ$7¸ÑDÔDðð ð ñ ˆõ ÐEÐE¸*ÐEÑEÔEÑEÔEð 	ØˆFØ &Ð2ˆv�{Š{‰}Œ}ˆ}¨FÐ2r4   c                 ó�   — d„ | j         D ¦   «         }d„ | j         D ¦   «         }t          |Ž }|j        du rt          d¦  «        ‚||fS )Nc                 ó    — g | ]}|j         °	|‘ŒS rG   rH   ©rK   Úxs     r2   rM   z,MatMul.as_coeff_matrices.<locals>.<listcomp>~   s   € Ð;Ð;Ð;˜¨q¬{Ð;�1Ð;Ð;Ð;r4   c                 ó    — g | ]}|j         ¯	|‘ŒS rG   rH   ry   s     r2   rM   z,MatMul.as_coeff_matrices.<locals>.<listcomp>   s   € Ð8Ð8Ð8˜!¨A¬KÐ8�AÐ8Ð8Ð8r4   Fz3noncommutative scalars in MatMul are not supported.)r>   r
   Úis_commutativeÚNotImplementedError)rQ   ÚscalarsrA   rs   s       r2   r;   zMatMul.as_coeff_matrices}   s\   € Ø;Ð;˜dœiÐ;Ñ;Ô;ˆØ8Ð8˜tœyÐ8Ñ8Ô8ˆÝ�W�ˆØÔ 5Ð(Ð(Ý%Ð&[Ñ\Ô\Ð\à�hˆÐr4   c                 óF   — |                       ¦   «         \  }}|t          |Ž fS r.   )r;   r(   ©rQ   rs   rA   s      r2   Úas_coeff_mmulzMatMul.as_coeff_mmul†   s'   € Ø×0Ò0Ñ2Ô2‰ˆˆxØ•f˜hÐ'Ð'Ð'r4   c                 ón   •—  t          t          | ¦  «        j        di |¤Ž}|                      |¦  «        S ©NrG   )Úsuperr(   rq   r=   )rQ   rr   ÚexpandedÚ	__class__s      €r2   rq   zMatMul.expandŠ   s7   ø€ Ø-•5� Ñ&Ô&Ô-Ð7Ð7°Ð7Ð7ˆØ�~Š~˜hÑ'Ô'Ð'r4   c                 ó”   — |                       ¦   «         \  }}t          |gd„ |ddd…         D ¦   «         ¢R Ž                      ¦   «         S )a¨  Transposition of matrix multiplication.

        Notes
        =====

        The following rules are applied.

        Transposition for matrix multiplied with another matrix:
        `\left(A B\right)^{T} = B^{T} A^{T}`

        Transposition for matrix multiplied with scalar:
        `\left(c A\right)^{T} = c A^{T}`

        References
        ==========

        .. [1] https://en.wikipedia.org/wiki/Transpose
        c                 ó,   — g | ]}t          |¦  «        ‘ŒS rG   r    rJ   s     r2   rM   z*MatMul._eval_transpose.<locals>.<listcomp>£   s   € Ð>Ð>Ð>¨•Y˜s‘^”^Ð>Ð>Ð>r4   NrN   )r;   r(   ro   r€   s      r2   Ú_eval_transposezMatMul._eval_transposeŽ   sa   € ð& ×0Ò0Ñ2Ô2‰ˆˆxÝØð@Ø>Ð>¨x¸¸¸"¸¬~Ð>Ñ>Ô>ð@ð @ð @ß@DÂÁÄð	Gr4   c                 óh   — t          d„ | j        d d d…         D ¦   «         Ž                      ¦   «         S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS rG   r   rJ   s     r2   rM   z(MatMul._eval_adjoint.<locals>.<listcomp>¦   s   € Ð@Ð@Ð@¨� ™œÐ@Ð@Ð@r4   rN   )r(   r>   ro   ©rQ   s    r2   Ú_eval_adjointzMatMul._eval_adjoint¥   s4   € ÝÐ@Ð@°´	¸$¸$¸B¸$´Ð@Ñ@Ô@ÐA×FÒFÑHÔHÐHr4   c                 óŒ   — |                       ¦   «         \  }}|dk    r&ddlm} | ||                     ¦   «         ¦  «        z  S d S )Nr   )Útrace)r�   r�   ro   )rQ   r@   Úmmulr�   s       r2   Ú_eval_tracezMatMul._eval_trace¨   sV   € Ø×)Ò)Ñ+Ô+‰ˆ�Ø�QŠ;ˆ;Ø$Ð$Ð$Ð$Ð$Ð$Ø˜E˜E $§)¢)¡+¤+Ñ.Ô.Ñ.Ð.ð ˆ;r4   c           	      ó¬   — ddl m} |                      ¦   «         \  }}t          |Ž }|| j        z  t          t          t          ||¦  «        ¦  «        Ž z  S )Nr   )ÚDeterminant)Ú&sympy.matrices.expressions.determinantr“   r;   Úonly_squaresrO   r
   r7   r9   )rQ   r“   r@   rA   Úsquare_matricess        r2   Ú_eval_determinantzMatMul._eval_determinant®   s]   € ØFÐFÐFÐFÐFÐFØ×1Ò1Ñ3Ô3Ñˆ�Ý&¨Ð1ˆØ�t”yÑ ¥3­­S°¸oÑ-NÔ-NÑ(OÔ(OÐ#PÑPÐPr4   c                 óÂ   — t          d„ | j        D ¦   «         ¦  «        r3t          d„ | j        d d d…         D ¦   «         Ž                      ¦   «         S t	          | ¦  «        S )Nc              3   óN   K  — | ] }t          |t          ¦  «        ¯|j        V — Œ!d S r.   )rc   r   Ú	is_squarerJ   s     r2   ra   z'MatMul._eval_inverse.<locals>.<genexpr>µ   s3   è è € ÐQÐQ µZÀÅZÑ5PÔ5PÐQˆsŒ}ÐQÐQÐQÐQÐQÐQr4   c              3   ór   K  — | ]2}t          |t          ¦  «        r|                     ¦   «         n|d z  V — Œ3dS )rN   N)rc   r   ÚinverserJ   s     r2   ra   z'MatMul._eval_inverse.<locals>.<genexpr>¶   sU   è è € ð ð àõ ",¨CµÑ!<Ô!<ÐI�—’‘”�À#ÀrÁ'ðð ð ð ð ð r4   rN   )Úallr>   r(   ro   r   rŒ   s    r2   Ú_eval_inversezMatMul._eval_inverse´   sq   € ÝÐQÐQ¨¬	ÐQÑQÔQÑQÔQð 	Ýð ð à#œy¨¨¨2¨œðñ ô ð ÷ Šd‰fŒfð	õ
 �t‰}Œ}Ðr4   c                 ó´   ‡— ‰                      dd¦  «        }|r!t          ˆfd„| j        D ¦   «         ¦  «        }n| j        }t          t	          |Ž ¦  «        }|S )NÚdeepTc              3   ó2   •K  — | ]} |j         di ‰¤ŽV — Œd S rƒ   )ro   )rK   rL   Úhintss     €r2   ra   zMatMul.doit.<locals>.<genexpr>À   s5   øè è € Ð@Ð@¨s˜˜œÐ*Ð* EÐ*Ð*Ð@Ð@Ð@Ð@Ð@Ð@r4   )rh   Útupler>   rC   r(   )rQ   r¢   r    r>   rD   s    `   r2   ro   zMatMul.doit½   sc   ø€ Ø�yŠy˜ Ñ&Ô&ˆØð 	ÝÐ@Ð@Ð@Ð@°d´iÐ@Ñ@Ô@Ñ@Ô@ˆDˆDà”9ˆDõ �F D˜MÑ*Ô*ˆØˆr4   c                 óú   ‡ — d„ ‰ j         D ¦   «         }d„ ‰ j         D ¦   «         }|rSt          |¦  «        }t          |¦  «        }|r3|r1t          |¦  «        |k    rt          dˆ fd„|D ¦   «         z  ¦  «        ‚||gS )Nc                 ó    — g | ]}|j         ¯	|‘ŒS rG   ©r|   ry   s     r2   rM   z#MatMul.args_cnc.<locals>.<listcomp>Ê   s    € Ð<Ð<Ð<˜¨1Ô+;Ð<�1Ð<Ð<Ð<r4   c                 ó    — g | ]}|j         °	|‘ŒS rG   r¦   ry   s     r2   rM   z#MatMul.args_cnc.<locals>.<listcomp>Ë   s    € ÐAÐAÐA˜!°Ô0@ÐA�AÐAÐAÐAr4   z"repeated commutative arguments: %sc                 ój   •— g | ]/}t          ‰j        ¦  «                             |¦  «        d k    ¯-|‘Œ0S ©r   )r7   r>   Úcount)rK   ÚcirQ   s     €r2   rM   z#MatMul.args_cnc.<locals>.<listcomp>Ñ   s;   ø€ Ð!XÐ!XÐ!X¨½$¸t¼y¹/¼/×:OÒ:OÐPRÑ:SÔ:SÐVWÒ:WÐ:W "Ð:WÐ:WÐ:Wr4   )r>   rg   ÚsetÚ
ValueError)rQ   ÚcsetÚwarnrr   Úcoeff_cÚcoeff_ncÚclens   `      r2   Úargs_cnczMatMul.args_cncÉ   s­   ø€ Ø<Ð<˜dœiÐ<Ñ<Ô<ˆØAÐA˜tœyÐAÑAÔAˆØð 	ZÝ�w‘<”<ˆDÝ˜'‘l”lˆGØð Z˜ð Z¥ W¡¤°Ò!5Ð!5Ý Ð!EØ!XÐ!XÐ!XÐ!X¨wÐ!XÑ!XÔ!Xñ"Yñ Zô Zð Zà˜Ð"Ð"r4   c                 ó€  ‡‡— ddl mŠ ˆfd„t          | j        ¦  «        D ¦   «         }g }|D �]}| j        d |…         }| j        |dz   d …         }|rt                               |¦  «        }nt          | j        d         ¦  «        }|r4t                               ˆfd„t          |¦  «        D ¦   «         ¦  «        }nt          | j        d         ¦  «        }| j        |          	                    ‰¦  «        }	|	D ]A}
|
 
                    |¦  «         |
                     |¦  «         |                     |
¦  «         ŒB�Œ|S )Nr   )Ú	Transposec                 óD   •— g | ]\  }}|                      ‰¦  «        ¯|‘ŒS rG   r^   )rK   r0   rL   rz   s      €r2   rM   z8MatMul._eval_derivative_matrix_lines.<locals>.<listcomp>Ö   s,   ø€ ÐIÐIÐI™F˜A˜s¸c¿gºgÀa¹j¼jÐI�aÐIÐIÐIr4   c                 ó\   •— g | ](}|j         r ‰|¦  «                             ¦   «         n|‘Œ)S rG   )rI   ro   )rK   r0   rµ   s     €r2   rM   z8MatMul._eval_derivative_matrix_lines.<locals>.<listcomp>á   s;   ø€ Ð+sÐ+sÐ+sÐZ[À1Ä;Ð,U¨I¨I°a©L¬L×,=Ò,=Ñ,?Ô,?Ð,?ÐTUÐ+sÐ+sÐ+sr4   r   )r!   rµ   rk   r>   r(   rl   r$   rR   ÚreversedÚ_eval_derivative_matrix_linesÚappend_firstÚappend_secondÚappend)rQ   rz   Ú
with_x_indÚlinesÚindÚ	left_argsÚ
right_argsÚ	right_matÚleft_revÚdr0   rµ   s    `         @r2   r¹   z$MatMul._eval_derivative_matrix_linesÔ   sT  øø€ Ø(Ð(Ð(Ð(Ð(Ð(ØIÐIÐIÐI¥i°´	Ñ&:Ô&:ÐIÑIÔIˆ
ØˆØð 	 ñ 	 ˆCØœ	 $ 3 $œˆIØœ 3 q¡5 6 6Ô*ˆJàð 4Ý"ŸOšO¨JÑ7Ô7�	�	å$ T¤Z°¤]Ñ3Ô3�	Øð 3Ý!Ÿ?š?Ð+sÐ+sÐ+sÐ+sÕ_gÐhqÑ_rÔ_rÐ+sÑ+sÔ+sÑtÔt��å# D¤J¨q¤MÑ2Ô2�à”	˜#”×<Ò<¸QÑ?Ô?ˆAØð  ð  �Ø—’˜xÑ(Ô(Ð(Ø—’ 	Ñ*Ô*Ð*Ø—’˜Q‘”��ñ ð
 ˆr4   )T)FT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	is_MatMulr%   r/   r:   Úclassmethodr=   ÚpropertyrR   r[   r;   r�   rq   r‰   r�   r‘   r—   rž   ro   r³   r¹   Ú__classcell__)r†   s   @r2   r(   r(      sf  ø€ € € € € ðð ð €IàˆÑ Ô €Hà%*°$Àð ð ð ð ð ð@ ð"ð "ñ „[ð"ð ð5ð 5ñ „Xð5ð(3ð (3ð (3ð (3ðTð ð ð(ð (ð (ð(ð (ð (ð (ð (ðGð Gð Gð.Ið Ið Ið/ð /ð /ðQð Qð Qðð ð ð	ð 	ð 	ð	#ð 	#ð 	#ð 	#ðð ð ð ð ð ð r4   r(   c                  óR   — | d         dk    r
| dd …         } t          t          g| ¢R Ž S )Nr   r   )r   r(   )r>   s    r2   ÚnewmulrÎ   ñ   s2   € ØˆA„w�!‚|€|Ø�A�B�BŒxˆÝ�vÐ˜ÐÐÐÐr4   c                 ó°   — t          d„ | j        D ¦   «         ¦  «        r7d„ | j        D ¦   «         }t          |d         j        |d         j        ¦  «        S | S )Nc              3   ó@   K  — | ]}|j         p|j        o|j        V — Œd S r.   )Úis_zerorI   Úis_ZeroMatrixrJ   s     r2   ra   zany_zeros.<locals>.<genexpr>÷   sG   è è € ð ,ð ,Øð Œ;Ð?˜3œ=Ð>¨SÔ->ð ,ð ,ð ,ð ,ð ,ð ,r4   c                 ó    — g | ]}|j         ¯	|‘ŒS rG   rH   rJ   s     r2   rM   zany_zeros.<locals>.<listcomp>ù   s   € Ð=Ð=Ð=˜C¨s¬}Ð=�CÐ=Ð=Ð=r4   r   rN   )rm   r>   r#   rO   rP   )r	   rA   s     r2   Ú	any_zerosrÔ   ö   sj   € Ý
ð ,ð ,Ø"%¤(ð,ñ ,ô ,ñ ,ô ,ð ?à=Ð= 3¤8Ð=Ñ=Ô=ˆÝ˜( 1œ+Ô*¨H°R¬LÔ,=Ñ>Ô>Ð>Ø€Jr4   c                 ój  — t          d„ | j        D ¦   «         ¦  «        s| S g }| j        d         }| j        dd…         D ]W}t          |t          t          f¦  «        r"t          |t          t          f¦  «        r||z  }Œ@|                     |¦  «         |}ŒX|                     |¦  «         t          |Ž S )a˜   Merge explicit MatrixBase arguments

    >>> from sympy import MatrixSymbol, Matrix, MatMul, pprint
    >>> from sympy.matrices.expressions.matmul import merge_explicit
    >>> A = MatrixSymbol('A', 2, 2)
    >>> B = Matrix([[1, 1], [1, 1]])
    >>> C = Matrix([[1, 2], [3, 4]])
    >>> X = MatMul(A, B, C)
    >>> pprint(X)
      [1  1] [1  2]
    A*[    ]*[    ]
      [1  1] [3  4]
    >>> pprint(merge_explicit(X))
      [4  6]
    A*[    ]
      [4  6]

    >>> X = MatMul(B, A, C)
    >>> pprint(X)
    [1  1]   [1  2]
    [    ]*A*[    ]
    [1  1]   [3  4]
    >>> pprint(merge_explicit(X))
    [1  1]   [1  2]
    [    ]*A*[    ]
    [1  1]   [3  4]
    c              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S r.   )rc   r   rJ   s     r2   ra   z!merge_explicit.<locals>.<genexpr>  s,   è è € ÐBÐB¨s�z˜#�zÑ*Ô*ÐBÐBÐBÐBÐBÐBr4   r   r   N)rm   r>   rc   r   r   r¼   r(   )ÚmatmulÚnewargsÚlastrL   s       r2   Úmerge_explicitrÚ   ý   sÂ   € õ8 ÐBÐB°f´kÐBÑBÔBÑBÔBð ØˆØ€GØŒ;�qŒ>€DØŒ{˜1˜2˜2Œð ð ˆÝ�c�J­Ð/Ñ0Ô0ð 	µZÀÅzÕSYÐFZÑ5[Ô5[ð 	Ø˜#‘:ˆDˆDà�NŠN˜4Ñ Ô Ð ØˆDˆDØ‡N‚N�4ÑÔÐå�7ÐÐr4   c                 óŒ   —  | j         ¦   «         \  }} t          d„ ¦  «        |¦  «        }||k    rt          |g|j        ¢R Ž S | S )zð Remove Identities from a MatMul

    This is a modified version of sympy.strategies.rm_id.
    This is necessary because MatMul may contain both MatrixExprs and Exprs
    as args.

    See Also
    ========

    sympy.strategies.rm_id
    c                 ó   — | j         du S )NT)Úis_Identity©rz   s    r2   r3   zremove_ids.<locals>.<lambda>6  s   € ˜Qœ]¨dÐ2€ r4   )r�   r   rÎ   r>   )r	   r@   r�   rv   s       r2   Ú
remove_idsrß   '  sY   € ð %�3Ô$Ñ&Ô&�L€FˆDà3�UÐ2Ð2Ñ3Ô3°DÑ9Ô9€FØ�‚~€~Ý�fÐ+˜vœ{Ð+Ð+Ð+Ð+àˆ
r4   c                 óP   —  | j         ¦   «         \  }}|dk    rt          |g|¢R Ž S | S ©Nr   )r;   rÎ   )r	   r@   rA   s      r2   Úfactor_in_frontrâ   <  s;   € Ø,�sÔ,Ñ.Ô.Ñ€FˆHØ�‚{€{Ý�fÐ(˜xÐ(Ð(Ð(Ð(Ø€Jr4   c                 ó¤  —  | j         ¦   «         \  }}|d         g}t          dt          |¦  «        ¦  «        D �]Š}|d         }||         }t          |t          ¦  «        ryt          |j        t          ¦  «        r_|j        j        }t          |¦  «        }t          |¦  «        || d…         k    r(|d| …         t          |j
        d         ¦  «        gz   }Œ¡t          |t          ¦  «        r�t          |j        t          ¦  «        ru|j        j        }	t          |	¦  «        }t          |	¦  «        ||||z   …         k    r<t          |j
        d         ¦  «        }
|
|d<   t          |||z   ¦  «        D ]}|
||<   Œ�ŒE|j        dk    s|j        dk    r|                     |¦  «         �Œrt          |t          ¦  «        r|j        \  }}n|t          j        }}t          |t          ¦  «        r|j        \  }}n|t          j        }}||k    r.||z   }t          ||¦  «                             d¬¦  «        |d<   �Œt          |t"          ¦  «        s^	 |                     ¦   «         }n# t&          $ r d}Y nw xY w|�4||k    r.||z
  }t          ||¦  «                             d¬¦  «        |d<   �Œu|                     |¦  «         �ŒŒt)          |g|¢R Ž S )a  Combine consecutive powers with the same base into one, e.g.
    $$A \times A^2 \Rightarrow A^3$$

    This also cancels out the possible matrix inverses using the
    knowledgebase of :class:`~.Inverse`, e.g.,
    $$ Y \times X \times X^{-1} \Rightarrow Y $$
    r   r   rN   NF)r    )r;   ri   rg   rc   r   rL   r(   r>   r7   r$   rR   rš   r¼   r   r   ÚOnero   r   rœ   r   rÎ   )r	   r@   r>   Únew_argsr0   ÚAÚBÚBargsÚlÚAargsr/   rp   ÚA_baseÚA_expÚB_baseÚB_expÚnew_expÚ
B_base_invs                     r2   Úcombine_powersrñ   B  sß  € ð )�3Ô(Ñ*Ô*�L€FˆDØ�Q”ˆy€Hå�1•c˜$‘i”iÑ Ô ð 0ñ 0ˆØ�RŒLˆØ�ŒGˆå�a�Ñ!Ô!ð 	¥j°´½Ñ&?Ô&?ð 	Ø”E”JˆEÝ�E‘
”
ˆAÝ�E‰{Œ{˜h¨ r s sœmÒ+Ð+Ø# C a R Cœ=­H°Q´W¸Q´ZÑ,@Ô,@Ð+AÑA�Øå�a�Ñ!Ô!ð 	¥j°´½Ñ&?Ô&?ð 	Ø”E”JˆEÝ�E‘
”
ˆAÝ�E‰{Œ{˜d 1 Q q¡S 5œkÒ)Ð)Ý# A¤G¨A¤JÑ/Ô/�Ø'�˜‘Ý˜q ! A¡#™œð 'ð '�AØ&�D˜‘G�GÙàŒ;˜%ÒÐ 1¤;°%Ò#7Ð#7Ø�OŠO˜AÑÔÐÙå�a�Ñ Ô ð 	%ØœF‰MˆF�E�Eà�qœu�EˆFå�a�Ñ Ô ð 	%ØœF‰MˆF�E�Eà�qœu�EˆFà�VÒÐØ˜e‘mˆGÝ! &¨'Ñ2Ô2×7Ò7¸UÐ7ÑCÔCˆH�R‰LÙÝ˜F¥JÑ/Ô/ð 	ð"Ø#Ÿ^š^Ñ-Ô-�
�
øÝ+ð "ð "ð "Ø!�
�
�
ð"øøøàÐ%¨&°JÒ*>Ð*>Ø %™-�Ý% f¨gÑ6Ô6×;Ò;ÀÐ;ÑGÔG�˜‘ÙØ�Š˜ÑÔÐÑå�&Ð$˜8Ð$Ð$Ð$Ð$s   ÉI&É&I5É4I5c                 ó†  — | j         }t          |¦  «        }|dk     r| S |d         g}t          d|¦  «        D ]�}|d         }||         }t          |t          ¦  «        rEt          |t          ¦  «        r0|j         d         }|j         d         }t	          ||z  ¦  «        |d<   Œl|                     |¦  «         Œ‚t          |Ž S )zGRefine products of permutation matrices as the products of cycles.
    é   r   r   rN   )r>   rg   ri   rc   r"   r¼   r(   )	r	   r>   ré   rv   r0   ræ   rç   Úcycle_1Úcycle_2s	            r2   Úcombine_permutationsrö   �  sË   € ð Œ8€DÝˆD‰	Œ	€AØˆ1‚u€uØˆ
à�1ŒgˆY€FÝ�1�a‰[Œ[ð 	ð 	ˆØ�2ŒJˆØ�ŒGˆÝ�aÕ*Ñ+Ô+ð 	Ý�qÕ+Ñ,Ô,ð	à”f˜Q”iˆGØ”f˜Q”iˆGÝ*¨7°WÑ+<Ñ=Ô=ˆF�2‰JˆJà�MŠM˜!ÑÔÐÐå�6ˆ?Ðr4   c                 ó¶  —  | j         ¦   «         \  }}|d         g}|dd…         D ]§}|d         }t          |t          ¦  «        rt          |t          ¦  «        s|                     |¦  «         ŒJ|                     ¦   «          |                     t          |j        d         |j        d         ¦  «        ¦  «         ||j        d         z  }Œ¨t          |g|¢R Ž S )zj
    Combine products of OneMatrix

    e.g. OneMatrix(2, 3) * OneMatrix(3, 4) -> 3 * OneMatrix(2, 4)
    r   r   NrN   )r;   rc   r&   r¼   ÚpoprR   rÎ   )r	   r@   r>   rå   rç   ræ   s         r2   Úcombine_one_matricesrù   —  sØ   € ð )�3Ô(Ñ*Ô*�L€FˆDØ�Q”ˆy€Hà�!�"�"ŒXð ð ˆØ�RŒLˆÝ˜!�YÑ'Ô'ð 	­z¸!½YÑ/GÔ/Gð 	Ø�OŠO˜AÑÔÐØØ�Š‰ŒˆØ�Š�	 !¤'¨!¤*¨a¬g°a¬jÑ9Ô9Ñ:Ô:Ð:Ø�!”'˜!”*Ñˆˆå�&Ð$˜8Ð$Ð$Ð$Ð$r4   c                 ó   ‡— | j         Št          ‰¦  «        dk    rrddlm} ‰d         j        r)‰d         j        r |ˆfd„‰d         j         D ¦   «         Ž S ‰d         j        r)‰d         j        r |ˆfd„‰d         j         D ¦   «         Ž S | S )zr
    Simplify MatMul expressions but distributing
    rational term to MatMul.

    e.g. 2*(A+B) -> 2*A + 2*B
    ró   r   )ÚMatAddr   c                 ó`   •— g | ]*}t          |‰d          ¦  «                             ¦   «         ‘Œ+S r©   ©r(   ro   ©rK   Úmatr>   s     €r2   rM   z$distribute_monom.<locals>.<listcomp>¶  s3   ø€ ÐPÐPÐP¸C�F 3¨¨Q¬Ñ0Ô0×5Ò5Ñ7Ô7ÐPÐPÐPr4   c                 ó`   •— g | ]*}t          ‰d          |¦  «                             ¦   «         ‘Œ+S )r   rý   rþ   s     €r2   rM   z$distribute_monom.<locals>.<listcomp>¸  s3   ø€ ÐPÐPÐP¸C�F 4¨¤7¨CÑ0Ô0×5Ò5Ñ7Ô7ÐPÐPÐPr4   )r>   rg   Úmataddrû   Ú	is_MatAddÚis_Rational)r	   rû   r>   s     @r2   Údistribute_monomr  «  sÀ   ø€ ð Œ8€DÝ
ˆ4�y„y�A‚~€~Ø"Ð"Ð"Ð"Ð"Ð"Ø�Œ7Ôð 	R  a¤Ô!4ð 	RØ�6ÐPÐPÐPÐPÀ4ÈÄ7Ä<ÐPÑPÔPÐQÐQØ�Œ7Ôð 	R  a¤Ô!4ð 	RØ�6ÐPÐPÐPÐPÀ4ÈÄ7Ä<ÐPÑPÔPÐQÐQØ€Jr4   c                 ó   — | dk    S rá   rG   rÞ   s    r2   r3   r3   ¼  s   € ÐklÐpqÒkq€ r4   c            	      ó6  — | d         j         | d         j        k    rt          d¦  «        ‚g }d}t          | ¦  «        D ]Y\  }}|j        | |         j         k    r>|                     t          | ||dz   …         Ž                      ¦   «         ¦  «         |dz   }ŒZ|S )z'factor matrices only if they are squarer   rN   z!Invalid matrices being multipliedr   )rO   rP   ÚRuntimeErrorrk   r¼   r(   ro   )rA   ÚoutÚstartr0   ÚMs        r2   r•   r•   Á  s¢   € à�„{Ô˜8 Bœ<Ô,Ò,Ð,ÝÐ>Ñ?Ô?Ð?Ø
€CØ€EÝ˜(Ñ#Ô#ð ð ‰ˆˆ1ØŒ6�X˜e”_Ô)Ò)Ð)Ø�JŠJ•v˜x¨¨a°©c¨	Ô2Ð3×8Ò8Ñ:Ô:Ñ;Ô;Ð;Ø�a‘CˆEøØ€Jr4   c                 óP  — g }g }| j         D ]4}|j        r|                     |¦  «         Œ|                     |¦  «         Œ5|d         }|dd…         D ]¶}||j        k    r=t	          t          j        |¦  «        |¦  «        rt          |j        d         ¦  «        }ŒJ|| 	                    ¦   «         k    r=t	          t          j
        |¦  «        |¦  «        rt          |j        d         ¦  «        }ŒŸ|                     |¦  «         |}Œ·|                     |¦  «         t          |Ž S )zè
    >>> from sympy import MatrixSymbol, Q, assuming, refine
    >>> X = MatrixSymbol('X', 2, 2)
    >>> expr = X * X.T
    >>> print(expr)
    X*X.T
    >>> with assuming(Q.orthogonal(X)):
    ...     print(refine(expr))
    I
    r   r   N)r>   rI   r¼   ÚTr   r   Ú
orthogonalr$   rR   Ú	conjugateÚunitaryr(   )rD   ÚassumptionsrØ   Úexprargsr>   rÙ   rL   s          r2   Úrefine_MatMulr  Î  s"  € ð €GØ€Hà”	ð !ð !ˆØŒ>ð 	!Ø�OŠO˜DÑ!Ô!Ð!Ð!à�NŠN˜4Ñ Ô Ð Ð à�AŒ;€DØ˜˜˜Œ|ð ð ˆØ�$”&Š=ˆ=�S¥¤¨cÑ!2Ô!2°KÑ@Ô@ˆ=Ý˜CœI aœLÑ)Ô)ˆDˆDØ�D—N’NÑ$Ô$Ò$Ð$­­Q¬Y°s©^¬^¸[Ñ)IÔ)IÐ$Ý˜CœI aœLÑ)Ô)ˆDˆDà�NŠN˜4Ñ Ô Ð ØˆDˆDØ‡N‚N�4ÑÔÐå�7ÐÐr4   N)AÚsympy.assumptions.askr   r   Úsympy.assumptions.refiner   Ú
sympy.corer   r   r   Úsympy.core.mulr	   r
   Úsympy.core.numbersr   r   Úsympy.core.symbolr   Úsympy.functionsr   Úsympy.strategiesr   r   r   r   r   r   r   Úsympy.matrices.exceptionsr   Úsympy.matrices.matrixbaser   Úsympy.utilities.exceptionsr   Ú!sympy.matrices.expressions._shaper   r<   rœ   r   Úmatexprr   Úmatpowr   r!   Úpermutationr"   Úspecialr#   r$   r%   r&   r(   Úregister_handlerclassrÎ   rÔ   rÚ   rß   râ   rñ   rö   rù   r  ÚrulesrC   r•   r  rG   r4   r2   ú<module>r%     s&  ðØ (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø #Ð #Ð #Ð #Ð #Ð #Ø #Ð #Ð #Ð #Ð #Ð #ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð à >Ð >Ð >Ð >Ð >Ð >Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø @Ð @Ð @Ð @Ð @Ð @Ø QÐ QÐ QÐ QÐ QÐ Qà Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø *Ð *Ð *Ð *Ð *Ð *Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EðSð Sð Sð Sð SˆZ˜ñ Sô Sð Sðj €Ô ˜3 ˜-¨Ñ 0Ô 0Ð 0ðð ð ð
ð ð ð(ð (ð (ðTð ð ð*ð ð ð=%ð =%ð =%ð~ð ð ð,%ð %ð %ð(ð ð ð" �i Ð-AÀ>ÐSYÐ[`Ð[`ÐaqÐaqÑ[rÔ[rØ�O WÐ.Bð	D€ð ˆw�u�u˜f f f¨e nÐ5Ñ6Ô6Ñ7Ô7€ð
ð 
ð 
ðð ð ðD (€ˆhÑ Ð Ð r4   