ó
    ‰*£h•<  ã                   óð  • S SK JrJr  S SKJr  S SKJrJrJr  S SK	J
r
Jr  S SKJrJr  S SKJr  S SKJr  S SKJrJrJrJrJrJrJr  S S	KJr  S S
KJr  S SKJ r   S SK!J"r#  SSK$J%r%  SSK&J'r'  SSK(J)r)  SSK*J*r*  SSK+J,r,  SSK-J.r.J/r/J0r0J1r1   " S S\'\5      r2\
Rf                  " \\24\25        S r4S r5S r6S r7S r8S r9S r:S r;S r<\<\5\7\;\9\\" S 5      \6\8\\:4r=\" \" \2\" \=6 05      5      r>S  r?S! r@\@\S'   g")#é    )Ú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                   óº   ^ • \ rS rSrSrSr\" 5       rSSSS.S jr\	S 5       r
\S	 5       rSS
 jrS rS rU 4S jrS rS rS rS rS rS rSS jrS rSrU =r$ )ÚMatMulé   zÚ
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                ój  ^ • U(       d  T R                   $ [        [        U 4S jU5      5      nU(       a  [        [        [        U5      5      n[
        R                  " T /UQ76 nUR                  5       u  pgUb  [        SSSS9  USLa  [        U6   U(       d  U$ U(       a  T R                  U5      $ U$ )Nc                 ó"   >• TR                   U :g  $ ©N)Úidentity)ÚiÚclss    €Ú^/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/matrices/expressions/matmul.pyÚ<lambda>Ú 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)r0   r(   r)   r*   ÚargsÚobjÚfactorÚmatricess   `       r1   r:   ÚMatMul.__new__*   s§   ø€ ÞØ—<‘<Ðô ”FÔ6¸Ó=Ó>ˆÞÜœœG TÓ*Ó+ˆDÜ�mŠm˜CÐ' $Ò'ˆØ×0Ñ0Ó2ÑˆàÑÜ%ØsØ)/Ø+Yò[ð
 ˜ÒÜ�hÑæð ˆMæØ—=‘= Ó%Ð%àˆ
r4   c                 ó   • [        U5      $ r-   )Úcanonicalize)r0   Úexprs     r1   r=   ÚMatMul._evaluateJ   s   € ä˜DÓ!Ð!r4   c                 ó¤   • U R                    Vs/ s H  oR                  (       d  M  UPM     nnUS   R                  US   R                  4$ s  snf )Nr   éÿÿÿÿ)r>   Ú	is_MatrixÚrowsÚcols)ÚselfÚargrA   s      r1   ÚshapeÚMatMul.shapeN   sB   € à#'§9¢9Ó>¢9˜C·µ—C¡9ˆÐ>Ø˜‘× Ñ  (¨2¡,×"3Ñ"3Ð4Ð4ùò ?s
   �A§Ac                 ó2  ^• SSK Jn  SSKJm  U R	                  5       u  pg[        U5      S:X  a  XgS   X4   -  $ S /[        U5      S-   -  nS /[        U5      S-
  -  n	XS'   X(S'   S n
UR                  SU
" 5       5      n[        S[        U5      5       H  n[        U5      X�'   M     [        US S 5       H  u  pUR                  S   S-
  X‘'   M     [        U5       VVs/ s H  u  pUR                  X�   X�S-      US9PM     nnn[        R                  " U5      n[        U4S	 jU 5       5      (       a  S
nXe" U/[        USS S/[        U	5      -  U	5      Q76 -  n[        S U	 5       5      (       d  SnU(       a  UR!                  5       $ U$ s  snnf )Nr   )ÚSum)ÚImmutableMatrixr   rH   c               3   ó>   #   • Sn  [        SU -  5      v •  U S-  n M  7f)Nr   zi_%ir   )Úcounters    r1   ÚfÚMatMul._entry.<locals>.fb   s+   é € ØˆGØÜ˜F WÑ,Ó-Ò-Ø˜1‘�ñ ùs   ‚Údummy_generator)rW   c              3   óD   >#   • U  H  oR                  T5      v •  M     g 7fr-   )Úhas)Ú.0ÚvrR   s     €r1   Ú	<genexpr>Ú MatMul._entry.<locals>.<genexpr>q   s   øé € Ð8ªx¨!�u‰u�_×%Ð%ªxùs   ƒ Tc              3   óN   #   • U  H  n[        U[        [        45      v •  M     g 7fr-   )Ú
isinstancer   Úint)rZ   r[   s     r1   r\   r]   y   s   é € ÐEº*°Q”:˜a¤'¬3 ×0Ð0º*ùs   ‚#%F)Úsympy.concrete.summationsrQ   Úsympy.matrices.immutablerR   r;   ÚlenÚgetÚrangeÚnextÚ	enumeraterN   Ú_entryr
   ÚfromiterÚanyÚzipÚdoit)rL   r/   ÚjÚexpandÚkwargsrQ   ÚcoeffrA   ÚindicesÚ
ind_rangesrU   rW   rM   Úexpr_in_sumÚresultrR   s                  @r1   rh   ÚMatMul._entryS   s›  ø€ å1Ý<à×0Ñ0Ó2‰ˆäˆx‹=˜AÓØ A™; q tÑ,Ñ,Ð,à�&œ#˜h›-¨!Ñ+Ñ,ˆØ�VœS ›]¨QÑ.Ñ/ˆ
Ø�‰
Ø�‰ò	ð !Ÿ*™*Ð%6¹»Ó<ˆä�qœ#˜h›-Ö(ˆAÜ˜oÓ.ˆG‹Jñ )ô   ¨¨" Ö.‰FˆAØŸI™I a™L¨1Ñ,ˆJ‹Mñ /ähqÐrzÔh{Ô|Òh{Ñ^dÐ^_�C—J‘J˜w™z¨7°Q±3©<È�JÓYÑh{ˆÑ|Ü—l’l 8Ó,ˆÜÔ8©xÓ8×8Ñ8ØˆFØ�sØðä�W˜Q˜r�] Q C¬¨J«Ñ$7¸ÓDòñ ˆô ÑE¹*ÓE×EÑEØˆFÞ &ˆv�{‰{‹}Ð2¨FÐ2ùó }s   Ã"$Fc                 ó  • U R                    Vs/ s H  oR                  (       a  M  UPM     nnU R                    Vs/ s H  oR                  (       d  M  UPM     nn[        U6 nUR                  SL a  [	        S5      eXC4$ s  snf s  snf )NFz3noncommutative scalars in MatMul are not supported.)r>   rI   r
   Úis_commutativeÚNotImplementedError)rL   ÚxÚscalarsrA   rp   s        r1   r;   ÚMatMul.as_coeff_matrices}   sm   € Ø"ŸišiÓ;ši˜¯{­{—1™iˆÐ;Ø#ŸyšyÓ8šy˜!¯K­K—A™yˆÐ8Ü�W�ˆØ×Ñ 5Ò(Ü%Ð&[Ó\Ð\àˆÐùò <ùÚ8s   �B§B½BÁBc                 ó:   • U R                  5       u  pU[        U6 4$ r-   )r;   r&   )rL   rp   rA   s      r1   Úas_coeff_mmulÚMatMul.as_coeff_mmul†   s"   € Ø×0Ñ0Ó2‰ˆØ”f˜hÐ'Ð'Ð'r4   c                 óN   >• [         [        U ]
  " S0 UD6nU R                  U5      $ ©N© )Úsuperr&   rn   r=   )rL   ro   ÚexpandedÚ	__class__s      €r1   rn   ÚMatMul.expandŠ   s&   ø€ Üœ Ò-Ñ7°Ñ7ˆØ�~‰~˜hÓ'Ð'r4   c           	      ó¤   • U R                  5       u  p[        U/USSS2    Vs/ s H  n[        U5      PM     snQ76 R                  5       $ s  snf )aP  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
NrH   )r;   r&   r   rl   )rL   rp   rA   rM   s       r1   Ú_eval_transposeÚMatMul._eval_transposeŽ   sT   € ð& ×0Ñ0Ó2‰ˆÜØð@Ø/7¹¸"¸ª~Ó>ª~¨”Y˜s–^©~Ñ>ò@ß@DÁÃð	GùÚ>s   ¤A
c                 óŒ   • [        U R                  S S S2    Vs/ s H  n[        U5      PM     sn6 R                  5       $ s  snf )NrH   )r&   r>   r   rl   )rL   rM   s     r1   Ú_eval_adjointÚMatMul._eval_adjoint¥   s8   € Ü°·	±	¹$¸B¸$²Ó@²¨œ ž±Ñ@ÐA×FÑFÓHÐHùÒ@s   šAc                 óp   • U R                  5       u  pUS:w  a  SSKJn  X" UR                  5       5      -  $ g )Nr   )Útrace)r}   r�   rl   )rL   r@   Úmmulr�   s       r1   Ú_eval_traceÚMatMul._eval_trace¨   s7   € Ø×)Ñ)Ó+‰ˆØ�Q‹;Ý$Ø˜E $§)¡)£+Ó.Ñ.Ð.ð r4   c           	      ó”   • SSK Jn  U R                  5       u  p#[        U6 nX R                  -  [        [        [        X5      5      6 -  $ )Nr   )ÚDeterminant)Ú&sympy.matrices.expressions.determinantr’   r;   Úonly_squaresrJ   r
   r7   r9   )rL   r’   r@   rA   Úsquare_matricess        r1   Ú_eval_determinantÚMatMul._eval_determinant®   sA   € ÝFØ×1Ñ1Ó3ÑˆÜ&¨Ð1ˆØ—y‘yÑ ¤3¬¬S°Ó-NÓ(OÐ#PÑPÐPr4   c                 ó´   • [        S U R                   5       5      (       a-  [        S U R                  S S S2    5       6 R                  5       $ [	        U 5      $ )Nc              3   óh   #   • U  H(  n[        U[        5      (       d  M  UR                  v •  M*     g 7fr-   )r_   r   Ú	is_square©rZ   rM   s     r1   r\   Ú'MatMul._eval_inverse.<locals>.<genexpr>µ   s   é € ÐQª	 ´ZÀÄZ×5P‹}ˆs�}Ž}ª	ùs   ‚2Ÿ2c              3   óv   #   • U  H/  n[        U[        5      (       a  UR                  5       OUS -  v •  M1     g7f)rH   N)r_   r   Úinverser›   s     r1   r\   rœ   ¶   s2   é € ð â.˜ô ",¨C´×!<Ñ!<�—‘”À#ÀrÁ'ÔIÚ.ùs   ‚79rH   )Úallr>   r&   rl   r   )rL   s    r1   Ú_eval_inverseÚMatMul._eval_inverse´   sR   € ÜÑQ¨¯	ª	ÓQ×QÑQÜñ à#Ÿy™y©¨2¨šóð ÷ ‰d‹fð	ô
 �t‹}Ðr4   c                 ó´   ^• TR                  SS5      nU(       a   [        U4S jU R                   5       5      nOU R                  n[        [	        U6 5      nU$ )NÚdeepTc              3   óF   >#   • U  H  oR                   " S0 TD6v •  M     g 7fr€   )rl   )rZ   rM   Úhintss     €r1   r\   ÚMatMul.doit.<locals>.<genexpr>À   s   øé € Ð@²i¨sŸšÑ* EÖ*²iùs   ƒ!)rd   Útupler>   rD   r&   )rL   r¥   r£   r>   rE   s    `   r1   rl   ÚMatMul.doit½   sH   ø€ Ø�y‰y˜ Ó&ˆÞÜÔ@°d·i²iÓ@Ó@‰Dà—9‘9ˆDô œF D˜MÓ*ˆØˆr4   c           	      óä  • U R                    Vs/ s H  oDR                  (       d  M  UPM     nnU R                    Vs/ s H  oDR                  (       a  M  UPM     nnU(       a|  [        U5      n[        U5      nU(       a_  U(       aX  [        U5      U:w  aI  [	        SU Vs/ s H/  n[        U R                   5      R                  U5      S:”  d  M-  UPM1     sn-  5      eXV/$ s  snf s  snf s  snf )Nz"repeated commutative arguments: %sr   )r>   rw   rc   ÚsetÚ
ValueErrorr7   Úcount)	rL   ÚcsetÚwarnro   ry   Úcoeff_cÚcoeff_ncÚclenÚcis	            r1   Úargs_cncÚMatMul.args_cncÉ   sÀ   € Ø"ŸišiÓ<ši˜×+;Õ+;—1™iˆÐ<Ø#ŸyšyÓAšy˜!×0@Õ0@—A™yˆÐAÞÜ�w“<ˆDÜ˜'“lˆGÞž¤ W£°Ó!5Ü Ð!EÙ/6Ó!Xªw¨¼$¸t¿y¹y»/×:OÑ:OÐPRÓ:SÐVWÑ:W§"©wÑ!Xñ"Yó Zð ZàÐ"Ð"ùò =ùÚAùò "Ys!   �C#§C#½C(ÁC(Â!,C-
ÃC-
c           	      ó  • SSK Jn  [        U R                  5       VVs/ s H  u  p4UR	                  U5      (       d  M  UPM!     nnn/ nU GH)  nU R                  S U nU R                  US-   S  n	U	(       a  [
        R                  U	5      n
O[        U R                  S   5      n
U(       aV  [
        R                  [        U5       Vs/ s H+  o3R                  (       a  U" U5      R                  5       OUPM-     sn5      nO[        U R                  S   5      nU R                  U   R                  U5      nU H6  nUR                  U5        UR                  U
5        UR                  U5        M8     GM,     U$ s  snnf s  snf )Nr   )Ú	Transposer   )r   r¶   rg   r>   rY   r&   ri   r"   rN   ÚreversedrI   rl   Ú_eval_derivative_matrix_linesÚappend_firstÚappend_secondÚappend)rL   ry   r¶   r/   rM   Ú
with_x_indÚlinesÚindÚ	left_argsÚ
right_argsÚ	right_matÚleft_revÚds                r1   r¸   Ú$MatMul._eval_derivative_matrix_linesÔ   s0  € Ý(Ü&/°·	±	Ô&:ÔIÒ&:™F˜A¸c¿g¹gÀa¿j—aÑ&:ˆ
ÑIØˆÜˆCØŸ	™	 $ 3˜ˆIØŸ™ 3 q¡5 6Ð*ˆJæÜ"ŸO™O¨JÓ7‘	ä$ T§Z¡Z°¡]Ó3�	ÞÜ!Ÿ?™?Ô_gÐhqÔ_rÓ+sÒ_rÐZ[Ç;Ç;©I°a«L×,=Ñ,=Ô,?ÐTUÒ,UÑ_rÑ+sÓt‘ä# D§J¡J¨q¡MÓ2�à—	‘	˜#‘×<Ñ<¸QÓ?ˆAÛ�Ø—‘˜xÔ(Ø—‘ 	Ô*Ø—‘˜Q–ô ñ ð& ˆùó+ Jùò ,ts   ŸE<¿E<Ã	2F
r�   )T)FT)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú	is_MatMulr#   r.   r:   Úclassmethodr=   ÚpropertyrN   rh   r;   r}   rn   r‡   rŠ   r�   r–   r    rl   r³   r¸   Ú__static_attributes__Ú__classcell__)r„   s   @r1   r&   r&      s‘   ø† ñð €IáÓ €Hà%*°$Àõ ð@ ñ"ó ð"ð ñ5ó ð5ô(3òTò(õ(òGò.Iò/òQòò	ô	#÷ð r4   r&   c                  ó>   • U S   S:X  a  U SS  n [        [        /U Q76 $ )Nr   r   )r   r&   )r>   s    r1   ÚnewmulrÐ   ñ   s(   € ØˆA�w�!ƒ|Ø�A�BˆxˆÜŒvÐ˜ÒÐr4   c                 óú   • [        S U R                   5       5      (       aT  U R                   Vs/ s H  oR                  (       d  M  UPM     nn[        US   R                  US   R
                  5      $ U $ s  snf )Nc              3   ó†   #   • U  H7  nUR                   =(       d    UR                  =(       a    UR                  v •  M9     g 7fr-   )Úis_zerorI   Úis_ZeroMatrixr›   s     r1   r\   Úany_zeros.<locals>.<genexpr>÷   s2   é € ð ,Ú"*˜3ð �;‰;×?˜3Ÿ=™=×>¨S×->Ñ->Ô?Ú"*ùs   ‚?Ar   rH   )rj   r>   rI   r!   rJ   rK   )r	   rM   rA   s      r1   Ú	any_zerosrÖ   ö   sg   € Ü
ñ ,Ø"%§(¢(ó,÷ ,ñ ,à#&§8¢8Ó=¢8˜C¯}­}—C¡8ˆÐ=Ü˜( 1™+×*Ñ*¨H°R©L×,=Ñ,=Ó>Ð>Ø€Jùò >s   °A8ÁA8c                 óf  • [        S U R                   5       5      (       d  U $ / nU R                  S   nU R                  SS  HR  n[        U[        [        45      (       a!  [        U[        [        45      (       a  X#-  nM?  UR                  U5        UnMT     UR                  U5        [        U6 $ )a7  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   óB   #   • U  H  n[        U[        5      v •  M     g 7fr-   )r_   r   r›   s     r1   r\   Ú!merge_explicit.<locals>.<genexpr>  s   é € ÐB²k¨sŒz˜#œz×*Ð*²kùs   ‚r   r   N)rj   r>   r_   r   r   r»   r&   )ÚmatmulÚnewargsÚlastrM   s       r1   Úmerge_explicitrÝ   ý   s™   € ô8 ÑB°f·k²kÓB×BÑBØˆØ€GØ�;‰;�q‰>€DØ�{‰{˜1˜2‹ˆÜ�cœJ¬Ð/×0Ñ0´ZÀÄzÔSYÐFZ×5[Ñ5[Ø‘:ŠDà�N‰N˜4Ô ØŠDñ ð ‡N�N�4Ôä�7ÐÐr4   c                 ó†   • U R                   " 5       u  p[        S 5      " U5      nX2:w  a  [        U/UR                  Q76 $ U $ )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                 ó   • U R                   SL $ )NT)Úis_Identity©ry   s    r1   r2   Úremove_ids.<locals>.<lambda>6  s   € ˜QŸ]™]¨dÑ2r4   )r}   r   rÐ   r>   )r	   r@   rŽ   rt   s       r1   Ú
remove_idsrã   '  sB   € ð ×$Ò$Ó&�L€FäÑ2Ô3°DÓ9€FØƒ~Ü�fÐ+˜vŸ{™{Ò+Ð+àˆ
r4   c                 óP   • U R                   " 5       u  pUS:w  a  [        U/UQ76 $ U $ ©Nr   )r;   rÐ   )r	   r@   rA   s      r1   Úfactor_in_frontræ   <  s/   € Ø×,Ò,Ó.Ñ€FØ�ƒ{Ü�fÐ(˜xÒ(Ð(Ø€Jr4   c                 ób  • U R                   " 5       u  pUS   /n[        S[        U5      5       GH_  nUS   nX$   n[        U[        5      (       at  [        UR
                  [        5      (       aU  UR
                  R                  n[        U5      n[        U5      X8* S :X  a"  USU*  [        UR                  S   5      /-   nM–  [        U[        5      (       a‹  [        UR
                  [        5      (       al  UR
                  R                  n	[        U	5      n[        U	5      X$XH-    :X  a8  [        UR                  S   5      n
X£S'   [        XDU-   5       H  nX¢U'   M	     GM6  UR                  S:X  d  UR                  S:X  a  UR                  U5        GMj  [        U[        5      (       a  UR                  u  pÍOU[        R                  pÜ[        U[        5      (       a  UR                  u  pïOU[        R                  pþXÎ:X  a#  Xß-   n[        UU5      R!                  SS9US'   GMü  [        U["        5      (       d=   UR%                  5       nUb)  UU:X  a#  Xß-
  n[        UU5      R!                  SS9US'   GMN  UR                  U5        GMb     [)        U/UQ76 $ ! [&         a    Sn N\f = f)zô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   rH   NF)r£   )r;   re   rc   r_   r   rM   r&   r>   r7   r"   rN   rš   r»   r   r   ÚOnerl   r   rž   r   rÐ   )r	   r@   r>   Únew_argsr/   ÚAÚBÚBargsÚlÚAargsr.   rm   ÚA_baseÚA_expÚB_baseÚB_expÚnew_expÚ
B_base_invs                     r1   Úcombine_powersrõ   B  sQ  € ð ×(Ò(Ó*�L€FØ�Q‘ˆy€Hä�1”c˜$“i× ˆØ�R‰LˆØ‰Gˆä�aœ×!Ñ!¤j°·±¼×&?Ñ&?Ø—E‘E—J‘JˆEÜ�E“
ˆAÜ�E‹{˜h r s˜mÓ+Ø# C a R˜=¬H°Q·W±W¸Q±ZÓ,@Ð+AÑA�Ùä�aœ×!Ñ!¤j°·±¼×&?Ñ&?Ø—E‘E—J‘JˆEÜ�E“
ˆAÜ�E‹{˜d Q¡S˜kÓ)Ü# A§G¡G¨A¡JÓ/�Ø'˜‘Ü˜q A¡#ž�AØ&˜“Gñ 'âà�;‰;˜%Ó 1§;¡;°%Ó#7Ø�O‰O˜AÔÚä�aœ× Ñ ØŸF™F‰MˆF�EàœqŸu™u�Eä�aœ× Ñ ØŸF™F‰MˆF�EàœqŸu™u�EàÓØ‘mˆGÜ! &¨'Ó2×7Ñ7¸UÐ7ÐCˆH�R‰LÚÜ˜F¤J×/Ñ/ð"Ø#Ÿ^™^Ó-�
ð Ñ%¨&°JÓ*>Ø™-�Ü% f¨gÓ6×;Ñ;ÀÐ;ÐG�˜‘ÚØ�‰˜×ña !ôd �&Ð$˜8Ò$Ð$øô ,ó "Ø!’
ð"ús   ÉJÊJ.Ê-J.c                 ój  • U R                   n[        U5      nUS:  a  U $ US   /n[        SU5       Hw  nUS   nX   n[        U[        5      (       aE  [        U[        5      (       a0  UR                   S   nUR                   S   n[	        Xx-  5      US'   Mf  UR                  U5        My     [        U6 $ )zGRefine products of permutation matrices as the products of cycles.
    é   r   r   rH   )r>   rc   re   r_   r    r»   r&   )	r	   r>   rí   rt   r/   rê   rë   Úcycle_1Úcycle_2s	            r1   Úcombine_permutationsrú   �  s¬   € ð �8‰8€DÜˆD‹	€AØˆ1ƒuØˆ
à�1‰gˆY€FÜ�1�aŽ[ˆØ�2‰JˆØ‰GˆÜ�aÔ*×+Ñ+Ü�qÔ+×,Ñ,Ø—f‘f˜Q‘iˆGØ—f‘f˜Q‘iˆGÜ*¨7Ñ+<Ó=ˆF�2‹Jà�M‰M˜!Öñ ô �6ˆ?Ðr4   c                 ó”  • U R                   " 5       u  pUS   /nUSS  H›  nUS   n[        U[        5      (       a  [        U[        5      (       d  UR                  U5        ME  UR	                  5         UR                  [        UR
                  S   UR
                  S   5      5        XR
                  S   -  nM�     [        U/UQ76 $ )z^
Combine products of OneMatrix

e.g. OneMatrix(2, 3) * OneMatrix(3, 4) -> 3 * OneMatrix(2, 4)
r   r   NrH   )r;   r_   r$   r»   ÚpoprN   rÐ   )r	   r@   r>   ré   rë   rê   s         r1   Úcombine_one_matricesrý   —  s®   € ð ×(Ò(Ó*�L€FØ�Q‘ˆy€Hà�!�"‹XˆØ�R‰LˆÜ˜!œY×'Ñ'¬z¸!¼Y×/GÑ/GØ�O‰O˜AÔÙØ�‰ŒØ�‰œ	 !§'¡'¨!¡*¨a¯g©g°a©jÓ9Ô:Ø—'‘'˜!‘*ÑŠñ ô �&Ð$˜8Ò$Ð$r4   c           
      óò  • U R                   n[        U5      S:X  aÑ  SSKJn  US   R                  (       aQ  US   R
                  (       a=  U" US   R                    Vs/ s H  n[        X1S   5      R                  5       PM!     sn6 $ US   R                  (       aR  US   R
                  (       a>  U" US   R                    Vs/ s H   n[        US   U5      R                  5       PM"     sn6 $ U $ s  snf s  snf )zb
Simplify MatMul expressions but distributing
rational term to MatMul.

e.g. 2*(A+B) -> 2*A + 2*B
r÷   r   )ÚMatAddr   )r>   rc   Úmataddrÿ   Ú	is_MatAddÚis_Rationalr&   rl   )r	   r>   rÿ   Úmats       r1   Údistribute_monomr  «  sÅ   € ð �8‰8€DÜ
ˆ4ƒy�Aƒ~Ý"Ø�‰7××  a¡×!4×!4ÙÀ4ÈÁ7Ç<Â<ÓPÂ<¸CœF 3¨Q©Ó0×5Ñ5Ö7Á<ÑPÐQÐQØ�‰7××  a¡×!4×!4ÙÀ4ÈÁ7Ç<Â<ÓPÂ<¸CœF 4¨¡7¨CÓ0×5Ñ5Ö7Á<ÑPÐQÐQØ€Jùò QùâPs   Á&C/Ã'C4c                 ó   • U S:H  $ rå   r�   rá   s    r1   r2   r2   ¼  s   € ÐklÐpqÒkqr4   c            	      ó&  • U S   R                   U S   R                  :w  a  [        S5      e/ nSn[        U 5       HR  u  p4UR                  X   R                   :X  d  M#  UR	                  [        XUS-    6 R                  5       5        US-   nMT     U$ )z'factor matrices only if they are squarer   rH   z!Invalid matrices being multipliedr   )rJ   rK   ÚRuntimeErrorrg   r»   r&   rl   )rA   ÚoutÚstartr/   ÚMs        r1   r”   r”   Á  sŒ   € à��{×Ñ˜8 B™<×,Ñ,Ó,ÜÐ>Ó?Ð?Ø
€CØ€EÜ˜(Ö#‰ˆØ�6‰6�X‘_×)Ñ)Õ)Ø�J‰J”v˜x¨a°©cÐ2Ð3×8Ñ8Ó:Ô;Ø�a‘CŠEñ $ð €Jr4   c                 óT  • / n/ nU R                    H8  nUR                  (       a  UR                  U5        M'  UR                  U5        M:     US   nUSS  H¶  nXeR                  :X  a?  [	        [
        R                  " U5      U5      (       a  [        UR                  S   5      nMQ  XeR                  5       :X  a?  [	        [
        R                  " U5      U5      (       a  [        UR                  S   5      nM£  UR                  U5        UnM¸     UR                  U5        [        U6 $ )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"   rN   Ú	conjugateÚunitaryr&   )rE   ÚassumptionsrÛ   Úexprargsr>   rÜ   rM   s          r1   Úrefine_MatMulr  Î  sã   € ð €GØ€Hà—	”	ˆØ�>�>Ø�O‰O˜DÖ!à�N‰N˜4Ö ñ	 ð �A‰;€DØ˜˜‹|ˆØ—&‘&‹=œS¤§¢¨cÓ!2°K×@Ñ@Ü˜CŸI™I a™LÓ)ŠDØ—N‘NÓ$Ó$¬¬Q¯YªY°s«^¸[×)IÑ)IÜ˜CŸI™I a™LÓ)ŠDà�N‰N˜4Ô ØŠ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  ÚrulesrD   r”   r  r�   r4   r1   Ú<module>r%     s   ðß (Ý 2ß (Ñ (ß #ß .Ý #Ý #÷÷ ñ å >Ý 0Ý @Ý Qå Ý Ý Ý  Ý *ß EÓ EôSˆZ˜ô Sðj × Ò ˜3 ˜-¨Ô 0òò
ò(òTò*ò=%ò~ò,%ò(ð" �i Ð-AÀ>ÐSYÑ[`ÑaqÓ[rØ�O WÐ.Bð	D€ñ ‘u˜f¡f¨e nÐ5Ó6Ó7€ò
òðD (€ˆhÒ r4   