ó
    ‰*£h\4  ã                   ó`  • S r SSKJr  SSKJr  SSK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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 r' " S S\5      r(S r)S r*S r+S r,\\,\\*4r-\" \" S \" \-6 5      5      r.S r/S r0S r1S r2S r3g) z'Implementation of the Kronecker producté    )Úreduce)Úprod)ÚMulÚsympify)Úadjoint)Ú
ShapeError)Ú
MatrixExpr)Ú	transpose)ÚIdentity)Ú
MatrixBase)ÚcanonÚ	conditionÚ
distributeÚdo_oneÚexhaustÚflattenÚtypedÚunpack)Ú	bottom_up)Úsifté   )ÚMatAdd)ÚMatMul)ÚMatPowc                  óz   • U (       d  [        S5      e[        U 5      S:X  a  U S   $ [        U 6 R                  5       $ )a   
The Kronecker product of two or more arguments.

This computes the explicit Kronecker product for subclasses of
``MatrixBase`` i.e. explicit matrices. Otherwise, a symbolic
``KroneckerProduct`` object is returned.


Examples
========

For ``MatrixSymbol`` arguments a ``KroneckerProduct`` object is returned.
Elements of this matrix can be obtained by indexing, or for MatrixSymbols
with known dimension the explicit matrix can be obtained with
``.as_explicit()``

>>> from sympy import kronecker_product, MatrixSymbol
>>> A = MatrixSymbol('A', 2, 2)
>>> B = MatrixSymbol('B', 2, 2)
>>> kronecker_product(A)
A
>>> kronecker_product(A, B)
KroneckerProduct(A, B)
>>> kronecker_product(A, B)[0, 1]
A[0, 0]*B[0, 1]
>>> kronecker_product(A, B).as_explicit()
Matrix([
    [A[0, 0]*B[0, 0], A[0, 0]*B[0, 1], A[0, 1]*B[0, 0], A[0, 1]*B[0, 1]],
    [A[0, 0]*B[1, 0], A[0, 0]*B[1, 1], A[0, 1]*B[1, 0], A[0, 1]*B[1, 1]],
    [A[1, 0]*B[0, 0], A[1, 0]*B[0, 1], A[1, 1]*B[0, 0], A[1, 1]*B[0, 1]],
    [A[1, 0]*B[1, 0], A[1, 0]*B[1, 1], A[1, 1]*B[1, 0], A[1, 1]*B[1, 1]]])

For explicit matrices the Kronecker product is returned as a Matrix

>>> from sympy import Matrix, kronecker_product
>>> sigma_x = Matrix([
... [0, 1],
... [1, 0]])
...
>>> Isigma_y = Matrix([
... [0, 1],
... [-1, 0]])
...
>>> kronecker_product(sigma_x, Isigma_y)
Matrix([
[ 0, 0,  0, 1],
[ 0, 0, -1, 0],
[ 0, 1,  0, 0],
[-1, 0,  0, 0]])

See Also
========
    KroneckerProduct

z$Empty Kronecker product is undefinedr   r   )Ú	TypeErrorÚlenÚKroneckerProductÚdoit)Úmatricess    Úa/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/matrices/expressions/kronecker.pyÚkronecker_productr"      s>   € öp ÜÐ>Ó?Ð?Ü
ˆ8ƒ}˜ÓØ˜‰{Ðä Ð*×/Ñ/Ó1Ð1ó    c                   ó–   ^ • \ rS rSrSrSrSS.U 4S jjr\S 5       rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rSrU =r$ )r   éV   aZ  
The Kronecker product of two or more arguments.

The Kronecker product is a non-commutative product of matrices.
Given two matrices of dimension (m, n) and (s, t) it produces a matrix
of dimension (m s, n t).

This is a symbolic object that simply stores its argument without
evaluating it. To actually compute the product, use the function
``kronecker_product()`` or call the ``.doit()`` or  ``.as_explicit()``
methods.

>>> from sympy import KroneckerProduct, MatrixSymbol
>>> A = MatrixSymbol('A', 5, 5)
>>> B = MatrixSymbol('B', 5, 5)
>>> isinstance(KroneckerProduct(A, B), KroneckerProduct)
True
T)Úcheckc                ó,  >• [        [        [        U5      5      n[        S U 5       5      (       aD  [	        [        S U 5       5      5      n[        S U 5       5      (       a  UR                  5       $ U$ U(       a  [        U6   [        TU ]$  " U /UQ76 $ )Nc              3   ó8   #   • U  H  oR                   v •  M     g 7f©N)Úis_Identity©Ú.0Úas     r!   Ú	<genexpr>Ú+KroneckerProduct.__new__.<locals>.<genexpr>m   s   é € Ð+¢d �}Ž}¢dùó   ‚c              3   ó8   #   • U  H  oR                   v •  M     g 7fr)   )Úrowsr+   s     r!   r.   r/   n   s   é € Ð5²¨1§¦²ùr0   c              3   óB   #   • U  H  n[        U[        5      v •  M     g 7fr)   ©Ú
isinstancer   r+   s     r!   r.   r/   o   s   é € Ð;²d°”:˜a¤×,Ð,²dùó   ‚)
ÚlistÚmapr   Úallr   r   Úas_explicitÚvalidateÚsuperÚ__new__)Úclsr&   ÚargsÚretÚ	__class__s       €r!   r=   ÚKroneckerProduct.__new__k   s{   ø€ Ü”Cœ Ó&Ó'ˆÜÑ+¡dÓ+×+Ñ+Üœ4Ñ5±Ó5Ó5Ó6ˆCÜÑ;±dÓ;×;Ñ;Ø—‘Ó(Ð(à�
æÜ�d‰OÜ‰wŠ˜sÐ* TÒ*Ð*r#   c                 ó¢   • U R                   S   R                  u  pU R                   SS   H  nXR                  -  nX#R                  -  nM!     X4$ )Nr   r   )r?   Úshaper2   Úcols)Úselfr2   rE   Úmats       r!   rD   ÚKroneckerProduct.shapex   sM   € à—Y‘Y˜q‘\×'Ñ'‰
ˆØ—9‘9˜Q˜R“=ˆCØ—H‘HÑˆDØ—H‘HÑŠDñ !ð ˆ|Ðr#   c                 ó®   • Sn[        U R                  5       H9  n[        XR                  5      u  p[        X%R                  5      u  p'XEXg4   -  nM;     U$ ©Nr   )Úreversedr?   Údivmodr2   rE   )rF   ÚiÚjÚkwargsÚresultrG   ÚmÚns           r!   Ú_entryÚKroneckerProduct._entry€   sO   € ØˆÜ˜DŸI™IÖ&ˆCÜ˜!ŸX™XÓ&‰DˆAÜ˜!ŸX™XÓ&‰DˆAØ˜!˜$‘iÑŠFñ 'ð ˆr#   c                 óp   • [        [        [        [        U R                  5      5      6 R                  5       $ r)   )r   r7   r8   r   r?   r   ©rF   s    r!   Ú_eval_adjointÚKroneckerProduct._eval_adjointˆ   s&   € Ü¤¤c¬'°4·9±9Ó&=Ó!>Ð?×DÑDÓFÐFr#   c                 óˆ   • [        U R                   Vs/ s H  oR                  5       PM     sn6 R                  5       $ s  snf r)   )r   r?   Ú	conjugater   )rF   r-   s     r!   Ú_eval_conjugateÚ KroneckerProduct._eval_conjugate‹   s0   € Ü¸¿ºÓ!Cº°A§+¡+¦-¹Ñ!CÐD×IÑIÓKÐKùÒ!Cs   ”?c                 óp   • [        [        [        [        U R                  5      5      6 R                  5       $ r)   )r   r7   r8   r
   r?   r   rV   s    r!   Ú_eval_transposeÚ KroneckerProduct._eval_transposeŽ   s&   € Ü¤¤c¬)°T·Y±YÓ&?Ó!@ÐA×FÑFÓHÐHr#   c                 óh   • SSK J n  [        U R                   Vs/ s H
  o!" U5      PM     sn6 $ s  snf )Nr   )Útrace)ra   r   r?   )rF   ra   r-   s      r!   Ú_eval_traceÚKroneckerProduct._eval_trace‘   s*   € Ý Ü t§y¢yÓ1¢y !�U˜1–X¡yÑ1Ð2Ð2ùÒ1s   š/c                 óô   • SSK JnJn  [        S U R                   5       5      (       d  U" U 5      $ U R
                  n[        U R                   Vs/ s H  oA" U5      X4R
                  -  -  PM     sn6 $ s  snf )Nr   )ÚdetÚDeterminantc              3   ó8   #   • U  H  oR                   v •  M     g 7fr)   ©Ú	is_squarer+   s     r!   r.   Ú5KroneckerProduct._eval_determinant.<locals>.<genexpr>—   s   é € Ð2ª	 1—;–;ª	ùr0   )Údeterminantre   rf   r9   r?   r2   r   )rF   re   rf   rQ   r-   s        r!   Ú_eval_determinantÚ"KroneckerProduct._eval_determinant•   s^   € ß1ÜÑ2¨¯	ª	Ó2×2Ñ2Ù˜tÓ$Ð$à�I‰IˆÜ°·²Ó;²¨A�S˜“V˜a§¡™hÔ'±Ñ;Ð<Ð<ùÒ;s   Á A5c                 óª   •  [        U R                   Vs/ s H  oR                  5       PM     sn6 $ s  snf ! [         a    SSKJn  U" U 5      s $ f = f)Nr   )ÚInverse)r   r?   Úinverser   Ú"sympy.matrices.expressions.inversero   )rF   r-   ro   s      r!   Ú_eval_inverseÚKroneckerProduct._eval_inverse�   sH   € ð	!Ü#¸4¿9º9Ó%Eº9°a§i¡i¦k¹9Ñ%EÐFÐFùÒ%EøÜó 	!ÝBÙ˜4“=Ò ð	!ús   ‚7 •2®7 ²7 ·AÁAc                 ó4  • [        U[        5      =(       a‚    U R                  UR                  :H  =(       ab    [        U R                  5      [        UR                  5      :H  =(       a0    [        S [        U R                  UR                  5       5       5      $ )a  Determine whether two matrices have the same Kronecker product structure

Examples
========

>>> from sympy import KroneckerProduct, MatrixSymbol, symbols
>>> m, n = symbols(r'm, n', integer=True)
>>> A = MatrixSymbol('A', m, m)
>>> B = MatrixSymbol('B', n, n)
>>> C = MatrixSymbol('C', m, m)
>>> D = MatrixSymbol('D', n, n)
>>> KroneckerProduct(A, B).structurally_equal(KroneckerProduct(C, D))
True
>>> KroneckerProduct(A, B).structurally_equal(KroneckerProduct(D, C))
False
>>> KroneckerProduct(A, B).structurally_equal(C)
False
c              3   óX   #   • U  H   u  pUR                   UR                   :H  v •  M"     g 7fr)   ©rD   ©r,   r-   Úbs      r!   r.   Ú6KroneckerProduct.structurally_equal.<locals>.<genexpr>»   s!   é € ÐTÒ9S©v°˜Ÿ™ 1§7¡7Ö*Ò9Sùó   ‚(*)r5   r   rD   r   r?   r9   Úzip©rF   Úothers     r!   Ústructurally_equalÚ#KroneckerProduct.structurally_equal¤   sn   € ô( ˜5Ô"2Ó3÷ UØ—J‘J %§+¡+Ñ-÷Uä˜Ÿ	™	“N¤c¨%¯*©*£oÑ5÷Uô ÑT¼¸T¿Y¹YÈÏ
É
Ô9SÓTÓTð	Vr#   c                 ó4  • [        U[        5      =(       a‚    U R                  UR                  :H  =(       ab    [	        U R
                  5      [	        UR
                  5      :H  =(       a0    [        S [        U R
                  UR
                  5       5       5      $ )a  Determine whether two matrices have the appropriate structure to bring matrix
multiplication inside the KroneckerProdut

Examples
========
>>> from sympy import KroneckerProduct, MatrixSymbol, symbols
>>> m, n = symbols(r'm, n', integer=True)
>>> A = MatrixSymbol('A', m, n)
>>> B = MatrixSymbol('B', n, m)
>>> KroneckerProduct(A, B).has_matching_shape(KroneckerProduct(B, A))
True
>>> KroneckerProduct(A, B).has_matching_shape(KroneckerProduct(A, B))
False
>>> KroneckerProduct(A, B).has_matching_shape(A)
False
c              3   óX   #   • U  H   u  pUR                   UR                  :H  v •  M"     g 7fr)   )rE   r2   rw   s      r!   r.   Ú6KroneckerProduct.has_matching_shape.<locals>.<genexpr>Ñ   s!   é € ÐRÒ7Q©V¨a˜Ÿ™ !§&¡&Ö(Ò7Qùrz   )r5   r   rE   r2   r   r?   r9   r{   r|   s     r!   Úhas_matching_shapeÚ#KroneckerProduct.has_matching_shape½   sn   € ô" ˜5Ô"2Ó3÷ SØ—I‘I §¡Ñ+÷Sä˜Ÿ	™	“N¤c¨%¯*©*£oÑ5÷Sô ÑR´s¸4¿9¹9ÀeÇjÁjÔ7QÓRÓRð	Tr#   c                 óx   • [        [        [        [        [	        [        [
        5      05      5      " U 5      5      $ r)   )r   r   r   r   r   r   )rF   Úhintss     r!   Ú_eval_expand_kroneckerproductÚ.KroneckerProduct._eval_expand_kroneckerproductÓ   s,   € Ü”uœUÔ$4´jÔAQÔSYÓ6ZÐ#[Ó\Ô]Ð^bÓcÓdÐdr#   c                 óÊ   • U R                  U5      (       aD  U R                  " [        U R                  UR                  5       VVs/ s H	  u  p#X#-   PM     snn6 $ X-   $ s  snnf r)   )r~   rA   r{   r?   ©rF   r}   r-   rx   s       r!   Ú_kronecker_addÚKroneckerProduct._kronecker_addÖ   sT   € Ø×"Ñ" 5×)Ñ)Ø—>’>¼¸D¿I¹IÀuÇzÁzÔ8RÔ#SÒ8R©f¨q A¤EÑ8RÒ#SÐTÐTà‘<Ðùó $Tó   ÁA
c                 óÊ   • U R                  U5      (       aD  U R                  " [        U R                  UR                  5       VVs/ s H	  u  p#X#-  PM     snn6 $ X-  $ s  snnf r)   )rƒ   rA   r{   r?   rŠ   s       r!   Ú_kronecker_mulÚKroneckerProduct._kronecker_mulÜ   sT   € Ø×"Ñ" 5×)Ñ)Ø—>’>´c¸$¿)¹)ÀUÇZÁZÔ6PÔ#QÒ6P©F¨Q A¤CÑ6PÒ#QÐRÐRà‘<Ðùó $Rr�   c                 óÐ   • UR                  SS5      nU(       a,  U R                   Vs/ s H  o3R                  " S0 UD6PM     nnOU R                  n[        [	        U6 5      $ s  snf )NÚdeepT© )Úgetr?   r   Úcanonicalizer   )rF   r†   r’   Úargr?   s        r!   r   ÚKroneckerProduct.doitâ   sX   € Ø�y‰y˜ Ó&ˆÞØ15·²Ó;²¨#—H’HÑ%˜uÔ%±ˆDÐ;ˆDà—9‘9ˆDÜÔ,¨dÐ3Ó4Ð4ùò <s   ¨A#r“   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úis_KroneckerProductr=   ÚpropertyrD   rS   rW   r[   r^   rb   rl   rr   r~   rƒ   r‡   r‹   r�   r   Ú__static_attributes__Ú__classcell__)rA   s   @r!   r   r   V   s}   ø† ñð$ Ðà"&÷ +ð +ð ñó ðòòGòLòIò3ò=ò!òVò2Tò,eò ò ÷5ð 5r#   r   c                  óH   • [        S U  5       5      (       d  [        S5      eg )Nc              3   ó8   #   • U  H  oR                   v •  M     g 7fr)   )Ú	is_Matrix)r,   r–   s     r!   r.   Úvalidate.<locals>.<genexpr>ì   s   é € Ð-ª �}Ž}ªùr0   z Mix of Matrix and Scalar symbols)r9   r   )r?   s    r!   r;   r;   ë   s$   € ÜÑ-©Ó-×-Ñ-ÜÐ:Ó;Ð;ð .r#   c                 óö   • / n/ nU R                    HK  nUR                  5       u  pEUR                  U5        UR                  [        R
                  " U5      5        MM     [	        U6 nUS:w  a  U[        U6 -  $ U $ rJ   )r?   Úargs_cncÚextendÚappendr   Ú
_from_argsr   )ÚkronÚc_partÚnc_partr–   ÚcÚncs         r!   Úextract_commutativer¯   ò   sp   € Ø€FØ€GØ�yŒyˆØ—‘“‰ˆØ�‰�aÔØ�‰”s—~’~ bÓ)Ö*ñ ô
 �&ˆ\€FØ�ƒ{ØÔ&¨Ð0Ñ0Ð0Ø€Kr#   c            	      óö  • [        S U  5       5      (       d  [        S[        U 5      -  5      eU S   n[        U SS 5       H†  nUR                  nUR
                  n[        U5       HZ  nXXT-     -  n[        US-
  5       H!  nUR                  XXT-  U-   S-      -  5      nM#     US:X  a  UnMI  WR                  U5      nM\     WnMˆ     [        U S S9R                  n	[        X5      (       a  U$ U	" U5      $ )	a  Compute the Kronecker product of a sequence of SymPy Matrices.

This is the standard Kronecker product of matrices [1].

Parameters
==========

matrices : tuple of MatrixBase instances
    The matrices to take the Kronecker product of.

Returns
=======

matrix : MatrixBase
    The Kronecker product matrix.

Examples
========

>>> from sympy import Matrix
>>> from sympy.matrices.expressions.kronecker import (
... matrix_kronecker_product)

>>> m1 = Matrix([[1,2],[3,4]])
>>> m2 = Matrix([[1,0],[0,1]])
>>> matrix_kronecker_product(m1, m2)
Matrix([
[1, 0, 2, 0],
[0, 1, 0, 2],
[3, 0, 4, 0],
[0, 3, 0, 4]])
>>> matrix_kronecker_product(m2, m1)
Matrix([
[1, 2, 0, 0],
[3, 4, 0, 0],
[0, 0, 1, 2],
[0, 0, 3, 4]])

References
==========

.. [1] https://en.wikipedia.org/wiki/Kronecker_product
c              3   óB   #   • U  H  n[        U[        5      v •  M     g 7fr)   r4   ©r,   rQ   s     r!   r.   Ú+matrix_kronecker_product.<locals>.<genexpr>-  s   é € Ð;²(¨QŒz˜!œZ×(Ð(²(ùr6   z&Sequence of Matrices expected, got: %séÿÿÿÿNr   r   c                 ó   • U R                   $ r)   )Ú_class_priority)ÚMs    r!   Ú<lambda>Ú*matrix_kronecker_product.<locals>.<lambda>I  s
   € ¨a×.?Ò.?r#   )Úkey)r9   r   ÚreprrK   r2   rE   ÚrangeÚrow_joinÚcol_joinÚmaxrA   r5   )
r    Úmatrix_expansionrG   r2   rE   rM   ÚstartrN   ÚnextÚMatrixClasss
             r!   Úmatrix_kronecker_productrÄ      s  € ôZ Ñ;±(Ó;×;Ñ;ÜØ4´t¸H³~ÑEó
ð 	
ð
   ‘|Ðä˜  "˜Ö&ˆØ�x‰xˆØ�x‰xˆô �t–ˆAØ$¨©¡[Ñ0ˆEä˜4 !™8–_�ØŸ™Ø$¨©°!©°a©Ñ%8Ñ8ó’ñ %ð �A‹vØ’à—}‘} UÓ+’ñ ð  Òñ% 'ô( �hÑ$?Ñ@×JÑJ€KÜÐ"×0Ñ0ØÐáÐ+Ó,Ð,r#   c                 ól   • [        S U R                   5       5      (       d  U $ [        U R                  6 $ )Nc              3   óB   #   • U  H  n[        U[        5      v •  M     g 7fr)   r4   r²   s     r!   r.   Ú-explicit_kronecker_product.<locals>.<genexpr>R  s   é € Ð<²)¨QŒz˜!œZ×(Ð(²)ùr6   )r9   r?   rÄ   )rª   s    r!   Úexplicit_kronecker_productrÈ   P  s+   € äÑ<°$·)²)Ó<×<Ñ<Øˆä# T§Y¡YÐ/Ð/r#   c                 ó"   • [        U [        5      $ r)   )r5   r   )Úxs    r!   r¸   r¸   ]  s   € ¬:°aÔ9IÔ+Jr#   c                 óf   • [        U [        5      (       a  [        S U R                   5       5      $ g)Nc              3   ó8   #   • U  H  oR                   v •  M     g 7fr)   rv   r+   s     r!   r.   Ú&_kronecker_dims_key.<locals>.<genexpr>c  s   é € Ð0¢i —W–W¢iùr0   ©r   )r5   r   Útupler?   ©Úexprs    r!   Ú_kronecker_dims_keyrÒ   a  s(   € Ü�$Ô(×)Ñ)ÜÑ0 d§i¢iÓ0Ó0Ð0àr#   c                 ó   • [        U R                  [        5      nUR                  SS 5      nU(       d  U $ UR	                  5        Vs/ s H  n[        S U5      PM     nnU(       d  [        U6 $ [        U6 U-   $ s  snf )NrÎ   c                 ó$   • U R                  U5      $ r)   )r‹   )rÊ   Úys     r!   r¸   Ú#kronecker_mat_add.<locals>.<lambda>n  s   €  ×!1Ñ!1°!Ô!4r#   )r   r?   rÒ   ÚpopÚvaluesr   r   )rÑ   r?   ÚnonkronsÚgroupÚkronss        r!   Úkronecker_mat_addrÜ   h  s~   € Ü�—	‘	Ô.Ó/€DØ�x‰x˜˜dÓ#€HÞØˆð Ÿ+™+œ-ó)Ú'�ô Ñ4°eÖ<Ù'ð 
ð )ö Ü�uˆ~Ðä�uˆ~ Ñ(Ð(ùò)s   ÁA;c                 óL  • U R                  5       u  pSnU[        U5      S-
  :  at  X#US-    u  pE[        U[        5      (       a=  [        U[        5      (       a(  UR	                  U5      X#'   UR                  US-   5        OUS-  nU[        U5      S-
  :  a  Mt  U[        U6 -  $ )Nr   r   é   )Úas_coeff_matricesr   r5   r   r�   r×   r   )rÑ   Úfactorr    rM   ÚAÚBs         r!   Úkronecker_mat_mulrã   w  s£   € à×-Ñ-Ó/Ñ€Fà	€AØ
Œc�(‹m˜aÑÓ
Ø˜!˜A™#ˆ‰ˆÜ�aÔ)×*Ñ*¬z¸!Ô=M×/NÑ/NØ×*Ñ*¨1Ó-ˆH‰KØ�L‰L˜˜1™Õà�‰FˆAð Œc�(‹m˜aÑÕ
ð ”&˜(Ð#Ñ#Ð#r#   c           	      ó$  • [        U R                  [        5      (       ak  [        S U R                  R                   5       5      (       a@  [        U R                  R                   Vs/ s H  n[        XR                  5      PM     sn6 $ U $ s  snf )Nc              3   ó8   #   • U  H  oR                   v •  M     g 7fr)   rh   r+   s     r!   r.   Ú$kronecker_mat_pow.<locals>.<genexpr>ˆ  s   é € Ð6[ÊNÀq·{¶{ÊNùr0   )r5   Úbaser   r9   r?   r   Úexp)rÑ   r-   s     r!   Úkronecker_mat_powré   ‡  sb   € Ü�$—)‘)Ô-×.Ñ.´3Ñ6[ÈDÏIÉIÏNÊNÓ6[×3[Ñ3[Ü¸t¿y¹y¿~º~Ó!Nº~¸!¤&¨¯H©HÖ"5¹~Ñ!NÐOÐOàˆùò "Os   Á(Bc                 óæ   • S n[        [        [        [        U[        [        [
        [        [        [        [        05      5      5      5      5      nU" U 5      n[        USS5      nUb  U" 5       $ U$ )aå  Combine KronekeckerProduct with expression.

If possible write operations on KroneckerProducts of compatible shapes
as a single KroneckerProduct.

Examples
========

>>> from sympy.matrices.expressions import combine_kronecker
>>> from sympy import MatrixSymbol, KroneckerProduct, symbols
>>> m, n = symbols(r'm, n', integer=True)
>>> A = MatrixSymbol('A', m, n)
>>> B = MatrixSymbol('B', n, m)
>>> combine_kronecker(KroneckerProduct(A, B)*KroneckerProduct(B, A))
KroneckerProduct(A*B, B*A)
>>> combine_kronecker(KroneckerProduct(A, B)+KroneckerProduct(B.T, A.T))
KroneckerProduct(A + B.T, B + A.T)
>>> C = MatrixSymbol('C', n, n)
>>> D = MatrixSymbol('D', m, m)
>>> combine_kronecker(KroneckerProduct(C, D)**m)
KroneckerProduct(C**m, D**m)
c                 óZ   • [        U [        5      =(       a    U R                  [        5      $ r)   )r5   r	   Úhasr   rÐ   s    r!   ÚhaskronÚ"combine_kronecker.<locals>.haskron¥  s   € Ü˜$¤
Ó+×J°·±Ô9IÓ0JÐJr#   r   N)r   r   r   r   r   rÜ   r   rã   r   ré   Úgetattr)rÑ   rí   ÚrulerP   r   s        r!   Úcombine_kroneckerrñ   Ž  su   € ò.Kô Ü”'œ) G¬UÜÔ&ÜÔ&ÜÔ&ð(ó.)ó *ó +ó 	,ó-€Dñ
 �$‹Z€FÜ�6˜6 4Ó(€DØÑÙ‹vˆàˆr#   N)4rœ   Ú	functoolsr   Úmathr   Ú
sympy.corer   r   Úsympy.functionsr   Úsympy.matrices.exceptionsr   Ú"sympy.matrices.expressions.matexprr	   Ú$sympy.matrices.expressions.transposer
   Ú"sympy.matrices.expressions.specialr   Úsympy.matrices.matrixbaser   Úsympy.strategiesr   r   r   r   r   r   r   r   Úsympy.strategies.traverser   Úsympy.utilitiesr   Úmataddr   Úmatmulr   Úmatpowr   r"   r   r;   r¯   rÄ   rÈ   Úrulesr•   rÒ   rÜ   rã   ré   rñ   r“   r#   r!   Ú<module>r     sº   ðÙ -Ý Ý ç #Ý #Ý 0Ý 9Ý :Ý 7Ý 0÷K÷ Kó Kå /Ý  å Ý Ý ò=2ô@R5�zô R5òj<òòM-ò`0ð 
Ø	#Ø	Ø	ð	€ñ
 ‘yÑ!JÙ!'¨ ó1ó 2€òò)ò$ò ó$r#   