Ë
    7^(h\4  ã                   ó`  — d Z ddlmZ ddlmZ ddl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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„ Z' G d„ de«      Z(d„ Z)d„ Z*d„ Z+d„ Z,ee,ee*fZ- e ed„  ee-Ž «      «      Z.d„ Z/d„ Z0d„ Z1d„ Z2d„ Z3y) 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                  ón   — | st        d«      ‚t        | «      dk(  r| d   S t        | Ž j                  «       S )aT  
    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    úb/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/matrices/expressions/kronecker.pyÚkronecker_productr"      s>   € ñp ÜÐ>Ó?Ð?Ü
ˆ8ƒ}˜ÒØ˜‰{Ðä Ð*×/Ñ/Ó1Ð1ó    c                   óŠ   ‡ — e Zd ZdZdZddœˆ fd„
Zed„ «       Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )r   a’  
    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                ó  •— t        t        t        |«      «      }t        d„ |D «       «      r?t	        t        d„ |D «       «      «      }t        d„ |D «       «      r|j                  «       S |S |rt        |Ž  t        ‰| �$  | g|¢­Ž S )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­w©N)Úis_Identity©Ú.0Úas     r!   ú	<genexpr>z+KroneckerProduct.__new__.<locals>.<genexpr>m   s   è ø€ Ò+ ˆq�}�}Ñ+ùó   ‚c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr(   )Úrowsr*   s     r!   r-   z+KroneckerProduct.__new__.<locals>.<genexpr>n   s   è ø€ Ò5¨1 §¥Ñ5ùr.   c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr(   ©Ú
isinstancer   r*   s     r!   r-   z+KroneckerProduct.__new__.<locals>.<genexpr>o   s   è ø€ Ò;°”:˜a¤×,Ñ;ùó   ‚)
ÚlistÚmapr   Úallr   r   Úas_explicitÚvalidateÚsuperÚ__new__)Úclsr%   ÚargsÚretÚ	__class__s       €r!   r;   zKroneckerProduct.__new__k   su   ø€ Ü”Cœ Ó&Ó'ˆÜÑ+ dÔ+Ô+Üœ4Ñ5°Ô5Ó5Ó6ˆCÜÑ;°dÔ;Ô;Ø—‘Ó(Ð(à�
áÜ�d‰OÜ‰w‰˜sÐ* TÒ*Ð*r#   c                 ó¦   — | j                   d   j                  \  }}| j                   dd  D ]   }||j                  z  }||j                  z  }Œ" ||fS )Nr   r   )r=   Úshaper0   Úcols)Úselfr0   rB   Úmats       r!   rA   zKroneckerProduct.shapex   sZ   € à—Y‘Y˜q‘\×'Ñ'‰
ˆˆdØ—9‘9˜Q˜R�=ò 	ˆCØ�C—H‘HÑˆDØ�C—H‘HÑ‰Dð	ð �dˆ|Ðr#   c                 ó¶   — d}t        | j                  «      D ]>  }t        ||j                  «      \  }}t        ||j                  «      \  }}||||f   z  }Œ@ |S ©Nr   )Úreversedr=   Údivmodr0   rB   )rC   ÚiÚjÚkwargsÚresultrD   ÚmÚns           r!   Ú_entryzKroneckerProduct._entry€   s`   € ØˆÜ˜DŸI™IÓ&ò 	 ˆCÜ˜!˜SŸX™XÓ&‰DˆAˆqÜ˜!˜SŸX™XÓ&‰DˆAˆqØ�c˜!˜Q˜$‘iÑ‰Fð	 ð ˆr#   c                 óp   — t        t        t        t        | j                  «      «      Ž j                  «       S r(   )r   r5   r6   r   r=   r   ©rC   s    r!   Ú_eval_adjointzKroneckerProduct._eval_adjointˆ   s&   € Ü¤¤c¬'°4·9±9Ó&=Ó!>Ð?×DÑDÓFÐFr#   c                 ó„   — t        | j                  D �cg c]  }|j                  «       ‘Œ c}Ž j                  «       S c c}w r(   )r   r=   Ú	conjugater   )rC   r,   s     r!   Ú_eval_conjugatez KroneckerProduct._eval_conjugate‹   s.   € Ü¸¿¹Ö!C°A !§+¡+¥-Ò!CÐD×IÑIÓKÐKùÒ!Cs   ”=c                 óp   — t        t        t        t        | j                  «      «      Ž j                  «       S r(   )r   r5   r6   r
   r=   r   rQ   s    r!   Ú_eval_transposez KroneckerProduct._eval_transposeŽ   s&   € Ü¤¤c¬)°T·Y±YÓ&?Ó!@ÐA×FÑFÓHÐHr#   c                 ód   — ddl m } t        | j                  D �cg c]
  } ||«      ‘Œ c}Ž S c c}w )Nr   )Útrace)rY   r   r=   )rC   rY   r,   s      r!   Ú_eval_tracezKroneckerProduct._eval_trace‘   s&   € Ý Ü t§y¡yÖ1 !‘U˜1•XÒ1Ð2Ð2ùÒ1s   š-c                 óè   — ddl m}m} t        d„ | j                  D «       «      s || «      S | j
                  }t        | j                  D �cg c]  } ||«      ||j
                  z  z  ‘Œ c}Ž S c c}w )Nr   )ÚdetÚDeterminantc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr(   ©Ú	is_squarer*   s     r!   r-   z5KroneckerProduct._eval_determinant.<locals>.<genexpr>—   s   è ø€ Ò2 1�1—;•;Ñ2ùr.   )Údeterminantr\   r]   r7   r=   r0   r   )rC   r\   r]   rM   r,   s        r!   Ú_eval_determinantz"KroneckerProduct._eval_determinant•   sY   € ß1ÜÑ2¨¯	©	Ô2Ô2Ù˜tÓ$Ð$à�I‰IˆÜ°·±Ö;¨A‘S˜“V˜a §¡™hÓ'Ò;Ð<Ð<ùÒ;s   ÁA/c                 ó¤   — 	 t        | j                  D �cg c]  }|j                  «       ‘Œ c}Ž S c c}w # t        $ r ddlm}  || «      cY S w xY w)Nr   )ÚInverse)r   r=   Úinverser   Ú"sympy.matrices.expressions.inverserd   )rC   r,   rd   s      r!   Ú_eval_inversezKroneckerProduct._eval_inverse�   sF   € ð	!Ü#¸4¿9¹9Ö%E°a a§i¡i¥kÒ%EÐFÐFùÒ%EøÜò 	!ÝBÙ˜4“=Ò ð	!ús   ‚5 •0¬5 °5 µAÁAc                 ó  — t        |t        «      xrx | j                  |j                  k(  xr] t        | j                  «      t        |j                  «      k(  xr0 t        d„ t        | j                  |j                  «      D «       «      S )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   óT   K  — | ]   \  }}|j                   |j                   k(  –— Œ" y ­wr(   ©rA   ©r+   r,   Úbs      r!   r-   z6KroneckerProduct.structurally_equal.<locals>.<genexpr>»   s!   è ø€ ÒT©v°°1˜Ÿ™ 1§7¡7Õ*ÑTùó   ‚&()r3   r   rA   r   r=   r7   Úzip©rC   Úothers     r!   Ústructurally_equalz#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                 ó  — t        |t        «      xrx | j                  |j                  k(  xr] t	        | j
                  «      t	        |j
                  «      k(  xr0 t        d„ t        | j
                  |j
                  «      D «       «      S )aq  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   óT   K  — | ]   \  }}|j                   |j                  k(  –— Œ" y ­wr(   )rB   r0   rk   s      r!   r-   z6KroneckerProduct.has_matching_shape.<locals>.<genexpr>Ñ   s!   è ø€ ÒR©V¨a°˜Ÿ™ !§&¡&Õ(ÑRùrm   )r3   r   rB   r0   r   r=   r7   rn   ro   s     r!   Úhas_matching_shapez#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   — t         t        t        t        t	        t        t
        «      i«      «      | «      «      S r(   )r   r   r   r   r   r   )rC   Úhintss     r!   Ú_eval_expand_kroneckerproductz.KroneckerProduct._eval_expand_kroneckerproductÓ   s/   € ÜÐ]”uœUÔ$4´jÔAQÔSYÓ6ZÐ#[Ó\Ó]Ð^bÓcÓdÐdr#   c                 óÀ   — | j                  |«      rC | j                  t        | j                  |j                  «      D ��cg c]
  \  }}||z   ‘Œ c}}Ž S | |z   S c c}}w r(   )rq   r?   rn   r=   ©rC   rp   r,   rl   s       r!   Ú_kronecker_addzKroneckerProduct._kronecker_addÖ   sS   € Ø×"Ñ" 5Ô)Ø!�4—>‘>¼¸D¿I¹IÀuÇzÁzÓ8R×#S©f¨q°! A¨£EÓ#SÐTÐTà˜%‘<Ðùó $Tó   ÁA
c                 óÀ   — | j                  |«      rC | j                  t        | j                  |j                  «      D ��cg c]
  \  }}||z  ‘Œ c}}Ž S | |z  S c c}}w r(   )rt   r?   rn   r=   ry   s       r!   Ú_kronecker_mulzKroneckerProduct._kronecker_mulÜ   sS   € Ø×"Ñ" 5Ô)Ø!�4—>‘>´c¸$¿)¹)ÀUÇZÁZÓ6P×#Q©F¨Q° A a£CÓ#QÐRÐRà˜%‘<Ðùó $Rr{   c                 óÂ   — |j                  dd«      }|r*| j                  D �cg c]  } |j                  di |¤Ž‘Œ }}n| j                  }t        t	        |Ž «      S c c}w )NÚdeepT© )Úgetr=   r   Úcanonicalizer   )rC   rv   r   Úargr=   s        r!   r   zKroneckerProduct.doitâ   sY   € Ø�y‰y˜ Ó&ˆÙØ15·±Ö;¨#�H�C—H‘HÑ%˜uÓ%Ð;ˆDÑ;à—9‘9ˆDÜÔ,¨dÐ3Ó4Ð4ùò <s   £A)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úis_KroneckerProductr;   ÚpropertyrA   rO   rR   rU   rW   rZ   rb   rg   rq   rt   rw   rz   r}   r   Ú__classcell__)r?   s   @r!   r   r   V   ss   ø„ ñð$ Ðà"&ö +ð ñó ðòòGòLòIò3ò=ò!òVò2Tò,eò ò ö5r#   r   c                  ó>   — t        d„ | D «       «      st        d«      ‚y )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr(   )Ú	is_Matrix)r+   rƒ   s     r!   r-   zvalidate.<locals>.<genexpr>ì   s   è ø€ Ò- ˆs�}�}Ñ-ùr.   z Mix of Matrix and Scalar symbols)r7   r   )r=   s    r!   r9   r9   ë   s!   € ÜÑ-¨Ô-Ô-ÜÐ:Ó;Ð;ð .r#   c                 óð   — g }g }| j                   D ]J  }|j                  «       \  }}|j                  |«       |j                  t	        j
                  |«      «       ŒL t	        |Ž }|dk7  r|t        |Ž z  S | S rF   )r=   Úargs_cncÚextendÚappendr   Ú
_from_argsr   )ÚkronÚc_partÚnc_partrƒ   ÚcÚncs         r!   Úextract_commutativer˜   ò   sw   € Ø€FØ€GØ�y‰yò +ˆØ—‘“‰ˆˆ2Ø�‰�aÔØ�‰”s—~‘~ bÓ)Õ*ð+ô
 �&ˆ\€FØ�‚{ØÔ&¨Ð0Ñ0Ð0Ø€Kr#   c            	      óâ  — t        d„ | D «       «      st        dt        | «      z  «      ‚| d   }t        | dd «      D ]ƒ  }|j                  }|j
                  }t        |«      D ]Y  }||||z     z  }t        |dz
  «      D ]"  }|j                  ||||z  |z   dz      z  «      }Œ$ |dk(  r|}ŒIj                  |«      }Œ[ }Œ… t        | d„ ¬«      j                  }	t        ||	«      r|S  |	|«      S )	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   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr(   r2   ©r+   rM   s     r!   r-   z+matrix_kronecker_product.<locals>.<genexpr>-  s   è ø€ Ò;¨QŒz˜!œZ×(Ñ;ùr4   z&Sequence of Matrices expected, got: %séÿÿÿÿNr   r   c                 ó   — | j                   S r(   )Ú_class_priority)ÚMs    r!   ú<lambda>z*matrix_kronecker_product.<locals>.<lambda>I  s   € ¨a×.?Ñ.?€ r#   )Úkey)r7   r   ÚreprrG   r0   rB   ÚrangeÚrow_joinÚcol_joinÚmaxr?   r3   )
r    Úmatrix_expansionrD   r0   rB   rI   ÚstartrJ   ÚnextÚMatrixClasss
             r!   Úmatrix_kronecker_productr«      s  € ôZ Ñ;°(Ô;Ô;ÜØ4´t¸H³~ÑEó
ð 	
ð
   ‘|Ðä˜  "˜Ó&ò  ˆØ�x‰xˆØ�x‰xˆô �t“ò 	,ˆAØ$ S¨¨4©¡[Ñ0ˆEä˜4 !™8“_ò �ØŸ™Ø$ S¨¨4©°!©°a©Ñ%8Ñ8ó‘ðð �AŠvØ‘à—}‘} UÓ+‘ð	,ð  Ñð% ô( �hÑ$?Ô@×JÑJ€KÜÐ" KÔ0ØÐáÐ+Ó,Ð,r#   c                 ób   — t        d„ | j                  D «       «      s| S t        | j                  Ž S )Nc              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr(   r2   r›   s     r!   r-   z-explicit_kronecker_product.<locals>.<genexpr>R  s   è ø€ Ò<¨QŒz˜!œZ×(Ñ<ùr4   )r7   r=   r«   )r“   s    r!   Úexplicit_kronecker_productr®   P  s(   € äÑ<°$·)±)Ô<Ô<Øˆä# T§Y¡YÐ/Ð/r#   c                 ó"   — t        | t        «      S r(   )r3   r   )Úxs    r!   r    r    ]  s   € ¬:°aÔ9IÓ+J€ r#   c                 ó\   — t        | t        «      rt        d„ | j                  D «       «      S y)Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr(   rj   r*   s     r!   r-   z&_kronecker_dims_key.<locals>.<genexpr>c  s   è ø€ Ò0 �Q—W•WÑ0ùr.   ©r   )r3   r   Útupler=   ©Úexprs    r!   Ú_kronecker_dims_keyr·   a  s%   € Ü�$Ô(Ô)ÜÑ0 d§i¡iÔ0Ó0Ð0àr#   c                 óæ   — t        | j                  t        «      }|j                  dd «      }|s| S |j	                  «       D �cg c]  }t        d„ |«      ‘Œ }}|st        |Ž S t        |Ž |z   S c c}w )Nr³   c                 ó$   — | j                  |«      S r(   )rz   )r°   Úys     r!   r    z#kronecker_mat_add.<locals>.<lambda>n  s   €  ×!1Ñ!1°!Ó!4€ r#   )r   r=   r·   ÚpopÚvaluesr   r   )r¶   r=   ÚnonkronsÚgroupÚkronss        r!   Úkronecker_mat_addrÀ   h  s{   € Ü�—	‘	Ô.Ó/€DØ�x‰x˜˜dÓ#€HÙØˆð Ÿ+™+›-ö)Øô Ñ4°eÕ<ð )€Eð )ñ Ü�uˆ~Ðä�uˆ~ Ñ(Ð(ùò)s   ÁA.c                 ó:  — | j                  «       \  }}d}|t        |«      dz
  k  rk|||dz    \  }}t        |t        «      r9t        |t        «      r)|j	                  |«      ||<   |j                  |dz   «       n|dz  }|t        |«      dz
  k  rŒk|t        |Ž z  S )Nr   r   é   )Úas_coeff_matricesr   r3   r   r}   r»   r   )r¶   Úfactorr    rI   ÚAÚBs         r!   Úkronecker_mat_mulrÇ   w  s¥   € à×-Ñ-Ó/Ñ€FˆHà	€AØ
Œc�(‹m˜aÑÒ
Ø˜˜!˜A™#ˆ‰ˆˆ1Ü�aÔ)Ô*¬z¸!Ô=MÔ/NØ×*Ñ*¨1Ó-ˆH�Q‰KØ�L‰L˜˜1™Õà�‰FˆAð Œc�(‹m˜aÑÓ
ð ”&˜(Ð#Ñ#Ð#r#   c           	      ó  — t        | j                  t        «      rdt        d„ | j                  j                  D «       «      r>t        | j                  j                  D �cg c]  }t        || j                  «      ‘Œ c}Ž S | S c c}w )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr(   r_   r*   s     r!   r-   z$kronecker_mat_pow.<locals>.<genexpr>ˆ  s   è ø€ Ò6[Àq°q·{µ{Ñ6[ùr.   )r3   Úbaser   r7   r=   r   Úexp)r¶   r,   s     r!   Úkronecker_mat_powrÌ   ‡  sZ   € Ü�$—)‘)Ô-Ô.´3Ñ6[ÈDÏIÉIÏNÉNÔ6[Ô3[Ü¸t¿y¹y¿~¹~Ö!N¸!¤&¨¨D¯H©HÕ"5Ò!NÐOÐOàˆùò "Os   ÁBc                 óä   — d„ }t        t        t        t        |t        t        t
        t        t        t        t        i«      «      «      «      «      } || «      }t        |dd«      }|� |«       S |S )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                 óP   — t        | t        «      xr | j                  t        «      S r(   )r3   r	   Úhasr   rµ   s    r!   Úhaskronz"combine_kronecker.<locals>.haskron¥  s   € Ü˜$¤
Ó+ÒJ°·±Ô9IÓ0JÐJr#   r   N)r   r   r   r   r   rÀ   r   rÇ   r   rÌ   Úgetattr)r¶   rÐ   ÚrulerL   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   r9   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#   