§
    OŠtj\4  ã                   ót  — 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„ Z3dS ) 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                  ó�   — | st          d¦  «        ‚t          | ¦  «        dk    r| d         S t          | Ž                      ¦   «         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/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/matrices/expressions/kronecker.pyÚkronecker_productr#      sO   € ðp ð @ÝÐ>Ñ?Ô?Ð?Ý
ˆ8�}„}˜ÒÐØ˜Œ{Ðå Ð*×/Ò/Ñ1Ô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                ón  •— t          t          t          |¦  «        ¦  «        }t          d„ |D ¦   «         ¦  «        rUt	          t          d„ |D ¦   «         ¦  «        ¦  «        }t          d„ |D ¦   «         ¦  «        r|                     ¦   «         S |S |r	t          |Ž   t          ¦   «         j	        | g|¢R Ž S )Nc              3   ó$   K  — | ]}|j         V — Œd S ©N)Úis_Identity©Ú.0Úas     r"   ú	<genexpr>z+KroneckerProduct.__new__.<locals>.<genexpr>m   s$   è è € Ð+Ð+ ˆqŒ}Ð+Ð+Ð+Ð+Ð+Ð+r$   c              3   ó$   K  — | ]}|j         V — Œd S r)   ©Úrowsr+   s     r"   r.   z+KroneckerProduct.__new__.<locals>.<genexpr>n   s$   è è € Ð5Ð5¨1 ¤Ð5Ð5Ð5Ð5Ð5Ð5r$   c              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S r)   ©Ú
isinstancer   r+   s     r"   r.   z+KroneckerProduct.__new__.<locals>.<genexpr>o   s,   è è € Ð;Ð;°•:˜a¥Ñ,Ô,Ð;Ð;Ð;Ð;Ð;Ð;r$   )
ÚlistÚmapr   Úallr   r   Úas_explicitÚvalidateÚsuperÚ__new__)Úclsr&   ÚargsÚretÚ	__class__s       €r"   r;   zKroneckerProduct.__new__k   sÀ   ø€ Ý•C� Ñ&Ô&Ñ'Ô'ˆÝÐ+Ð+ dÐ+Ñ+Ô+Ñ+Ô+ð 	Ý�4Ð5Ð5°Ð5Ñ5Ô5Ñ5Ô5Ñ6Ô6ˆCÝÐ;Ð;°dÐ;Ñ;Ô;Ñ;Ô;ð Ø—’Ñ(Ô(Ð(à�
àð 	Ý�dˆOˆOØ�u‰wŒwŒ˜sÐ* TÐ*Ð*Ð*Ð*r$   c                 ó€   — | j         d         j        \  }}| j         dd …         D ]}||j        z  }||j        z  }Œ||fS )Nr   r   )r=   Úshaper1   Úcols)Úselfr1   rB   Úmats       r"   rA   zKroneckerProduct.shapex   sQ   € à”Y˜q”\Ô'‰
ˆˆdØ”9˜Q˜R˜R”=ð 	ð 	ˆCØ�C”HÑˆDØ�C”HÑˆDˆDØ�dˆ|Ðr$   c                 ó²   — d}t          | j        ¦  «        D ]?}t          ||j        ¦  «        \  }}t          ||j        ¦  «        \  }}||||f         z  }Œ@|S ©Nr   )Úreversedr=   Údivmodr1   rB   )rC   ÚiÚjÚkwargsÚresultrD   ÚmÚns           r"   Ú_entryzKroneckerProduct._entry€   sc   € ØˆÝ˜DœIÑ&Ô&ð 	 ð 	 ˆCÝ˜!˜SœXÑ&Ô&‰DˆAˆqÝ˜!˜SœXÑ&Ô&‰DˆAˆqØ�c˜!˜Q˜$”iÑˆFˆFØˆr$   c                 ó‚   — t          t          t          t          | j        ¦  «        ¦  «        Ž                      ¦   «         S r)   )r   r5   r6   r   r=   r    ©rC   s    r"   Ú_eval_adjointzKroneckerProduct._eval_adjointˆ   s-   € Ý¥¥c­'°4´9Ñ&=Ô&=Ñ!>Ô!>Ð?×DÒDÑFÔFÐFr$   c                 óV   — t          d„ | j        D ¦   «         Ž                      ¦   «         S )Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS © )Ú	conjugater+   s     r"   ú
<listcomp>z4KroneckerProduct._eval_conjugate.<locals>.<listcomp>Œ   s    € Ð!CÐ!CÐ!C°A !§+¢+¡-¤-Ð!CÐ!CÐ!Cr$   )r   r=   r    rQ   s    r"   Ú_eval_conjugatez KroneckerProduct._eval_conjugate‹   s*   € ÝÐ!CÐ!C¸¼Ð!CÑ!CÔ!CÐD×IÒIÑKÔKÐKr$   c                 ó‚   — t          t          t          t          | j        ¦  «        ¦  «        Ž                      ¦   «         S r)   )r   r5   r6   r   r=   r    rQ   s    r"   Ú_eval_transposez KroneckerProduct._eval_transposeŽ   s-   € Ý¥¥c­)°T´YÑ&?Ô&?Ñ!@Ô!@ÐA×FÒFÑHÔHÐHr$   c                 óD   ‡— ddl m Š t          ˆfd„| j        D ¦   «         Ž S )Nr   )Útracec                 ó&   •— g | ]} ‰|¦  «        ‘ŒS rU   rU   )r,   r-   r\   s     €r"   rW   z0KroneckerProduct._eval_trace.<locals>.<listcomp>“   s!   ø€ Ð1Ð1Ð1 !�U�U˜1‘X”XÐ1Ð1Ð1r$   )r\   r   r=   )rC   r\   s    @r"   Ú_eval_tracezKroneckerProduct._eval_trace‘   s7   ø€ Ø Ð Ð Ð Ð Ð ÝÐ1Ð1Ð1Ð1 t¤yÐ1Ñ1Ô1Ð2Ð2r$   c                 ó¬   ‡‡— ddl mŠm} t          d„ | j        D ¦   «         ¦  «        s || ¦  «        S | j        Št          ˆˆfd„| j        D ¦   «         Ž S )Nr   )ÚdetÚDeterminantc              3   ó$   K  — | ]}|j         V — Œd S r)   ©Ú	is_squarer+   s     r"   r.   z5KroneckerProduct._eval_determinant.<locals>.<genexpr>—   s$   è è € Ð2Ð2 1�1”;Ð2Ð2Ð2Ð2Ð2Ð2r$   c                 ó<   •— g | ]} ‰|¦  «        ‰|j         z  z  ‘ŒS rU   r0   )r,   r-   r`   rM   s     €€r"   rW   z6KroneckerProduct._eval_determinant.<locals>.<listcomp>›   s,   ø€ Ð;Ð;Ð;¨A�S�S˜‘V”V˜a ¤™hÑ'Ð;Ð;Ð;r$   )Údeterminantr`   ra   r7   r=   r1   r   )rC   ra   r`   rM   s     @@r"   Ú_eval_determinantz"KroneckerProduct._eval_determinant•   sy   øø€ Ø1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ÝÐ2Ð2¨¬	Ð2Ñ2Ô2Ñ2Ô2ð 	%Ø�;˜tÑ$Ô$Ð$àŒIˆÝÐ;Ð;Ð;Ð;Ð;°´Ð;Ñ;Ô;Ð<Ð<r$   c                 óv   — 	 t          d„ | j        D ¦   «         Ž S # t          $ r ddlm}  || ¦  «        cY S w xY w)Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS rU   )Úinverser+   s     r"   rW   z2KroneckerProduct._eval_inverse.<locals>.<listcomp>Ÿ   s    € Ð%EÐ%EÐ%E°a a§i¢i¡k¤kÐ%EÐ%EÐ%Er$   r   )ÚInverse)r   r=   r	   Ú"sympy.matrices.expressions.inverserk   )rC   rk   s     r"   Ú_eval_inversezKroneckerProduct._eval_inverse�   sd   € ð	!Ý#Ð%EÐ%E¸4¼9Ð%EÑ%EÔ%EÐFÐFøÝð 	!ð 	!ð 	!ØBÐBÐBÐBÐBÐBØ�7˜4‘=”=Ð Ð Ð ð	!øøøs   ‚ š8·8c                 ó  — t          |t          ¦  «        oj| j        |j        k    oZt          | j        ¦  «        t          |j        ¦  «        k    o0t          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   ó<   K  — | ]\  }}|j         |j         k    V — Œd S r)   ©rA   ©r,   r-   Úbs      r"   r.   z6KroneckerProduct.structurally_equal.<locals>.<genexpr>»   s/   è è € ÐTÐT©v°°1˜œ 1¤7Ò*ÐTÐTÐTÐTÐTÐTr$   )r4   r   rA   r   r=   r7   Úzip©rC   Úothers     r"   Ústructurally_equalz#KroneckerProduct.structurally_equal¤   sx   € õ( ˜5Õ"2Ñ3Ô3ð UØ”J %¤+Ò-ðUå˜œ	‘N”N¥c¨%¬*¡o¤oÒ5ðUõ ÐTÐT½¸T¼YÈÌ
Ñ9SÔ9SÐTÑTÔTÑTÔTð	Vr$   c                 ó  — t          |t          ¦  «        oj| j        |j        k    oZt	          | j        ¦  «        t	          |j        ¦  «        k    o0t          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   ó<   K  — | ]\  }}|j         |j        k    V — Œd S r)   )rB   r1   rq   s      r"   r.   z6KroneckerProduct.has_matching_shape.<locals>.<genexpr>Ñ   s/   è è € ÐRÐR©V¨a°˜œ !¤&Ò(ÐRÐRÐRÐRÐRÐRr$   )r4   r   rB   r1   r   r=   r7   rs   rt   s     r"   Úhas_matching_shapez#KroneckerProduct.has_matching_shape½   sx   € õ" ˜5Õ"2Ñ3Ô3ð SØ”I ¤Ò+ðSå˜œ	‘N”N¥c¨%¬*¡o¤oÒ5ðSõ ÐRÐRµs¸4¼9ÀeÄjÑ7QÔ7QÐRÑRÔRÑRÔRð	Tr$   c                 ó¤   — 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Ô6ZÐ#[Ñ\Ô\Ñ]Ô]Ð^bÑcÔcÑdÔdÐdr$   c                 óŽ   — |                       |¦  «        r, | j        d„ t          | j        |j        ¦  «        D ¦   «         Ž S | |z   S )Nc                 ó   — g | ]
\  }}||z   ‘ŒS rU   rU   rq   s      r"   rW   z3KroneckerProduct._kronecker_add.<locals>.<listcomp>Ø   s    € Ð#SÐ#SÐ#S©f¨q°! A¨¡EÐ#SÐ#SÐ#Sr$   )rv   r?   rs   r=   rt   s     r"   Ú_kronecker_addzKroneckerProduct._kronecker_addÖ   sN   € Ø×"Ò" 5Ñ)Ô)ð 	 Ø!�4”>Ð#SÐ#S½¸D¼IÀuÄzÑ8RÔ8RÐ#SÑ#SÔ#SÐTÐTà˜%‘<Ðr$   c                 óŽ   — |                       |¦  «        r, | j        d„ t          | j        |j        ¦  «        D ¦   «         Ž S | |z  S )Nc                 ó   — g | ]
\  }}||z  ‘ŒS rU   rU   rq   s      r"   rW   z3KroneckerProduct._kronecker_mul.<locals>.<listcomp>Þ   s    € Ð#QÐ#QÐ#Q©F¨Q° A a¡CÐ#QÐ#QÐ#Qr$   )ry   r?   rs   r=   rt   s     r"   Ú_kronecker_mulzKroneckerProduct._kronecker_mulÜ   sN   € Ø×"Ò" 5Ñ)Ô)ð 	 Ø!�4”>Ð#QÐ#Qµc¸$¼)ÀUÄZÑ6PÔ6PÐ#QÑ#QÔ#QÐRÐRà˜%‘<Ðr$   c                 ó–   ‡— ‰                      dd¦  «        }|rˆfd„| j        D ¦   «         }n| j        }t          t          |Ž ¦  «        S )NÚdeepTc                 ó*   •— g | ]} |j         d i ‰¤Ž‘ŒS )rU   )r    )r,   Úargr{   s     €r"   rW   z)KroneckerProduct.doit.<locals>.<listcomp>å   s+   ø€ Ð;Ð;Ð;¨#�H�C”HÐ%Ð%˜uÐ%Ð%Ð;Ð;Ð;r$   )Úgetr=   Úcanonicalizer   )rC   r{   r„   r=   s    `  r"   r    zKroneckerProduct.doitâ   sV   ø€ Ø�yŠy˜ Ñ&Ô&ˆØð 	Ø;Ð;Ð;Ð;°´Ð;Ñ;Ô;ˆDˆDà”9ˆDÝÕ,¨dÐ3Ñ4Ô4Ð4r$   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úis_KroneckerProductr;   ÚpropertyrA   rO   rR   rX   rZ   r^   rg   rm   rv   ry   r|   r   r‚   r    Ú__classcell__)r?   s   @r"   r   r   V   sG  ø€ € € € € ðð ð$ Ðà"&ð +ð +ð +ð +ð +ð +ð +ð ðð ñ „Xððð ð ðGð Gð GðLð Lð LðIð Ið Ið3ð 3ð 3ð=ð =ð =ð!ð !ð !ðVð Vð Vð2Tð Tð Tð,eð eð eð ð  ð  ð ð  ð  ð5ð 5ð 5ð 5ð 5ð 5ð 5r$   r   c                  óV   — t          d„ | D ¦   «         ¦  «        st          d¦  «        ‚d S )Nc              3   ó$   K  — | ]}|j         V — Œd S 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 ]U}|                     ¦   «         \  }}|                     |¦  «         |                     t	          j        |¦  «        ¦  «         ŒVt	          |Ž }|dk    r|t          |Ž z  S | S rF   )r=   Úargs_cncÚextendÚappendr   Ú
_from_argsr   )ÚkronÚc_partÚnc_partr†   ÚcÚncs         r"   Úextract_commutativer�   ò   s‡   € Ø€FØ€GØŒyð +ð +ˆØ—’‘”‰ˆˆ2Ø�Š�aÑÔÐØ�Š•s”~ bÑ)Ô)Ñ*Ô*Ð*Ð*å�&ˆ\€FØ�‚{€{ØÕ&¨Ð0Ñ0Ð0Ø€Kr$   c            	      ó2  — t          d„ | D ¦   «         ¦  «        st          dt          | ¦  «        z  ¦  «        ‚| d         }t          | dd…         ¦  «        D ]Œ}|j        }|j        }t          |¦  «        D ]j}||||z           z  }t          |dz
  ¦  «        D ])}|                     ||||z  |z   dz            z  ¦  «        }Œ*|dk    r|}ŒU|                     |¦  «        }Œk|}Œ�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          ¦  «        V — Œd S r)   r3   ©r,   rM   s     r"   r.   z+matrix_kronecker_product.<locals>.<genexpr>-  s,   è è € Ð;Ð;¨Q�z˜!�ZÑ(Ô(Ð;Ð;Ð;Ð;Ð;Ð;r$   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   r1   rB   ÚrangeÚrow_joinÚcol_joinÚmaxr?   r4   )
r!   Úmatrix_expansionrD   r1   rB   rI   ÚstartrJ   ÚnextÚMatrixClasss
             r"   Úmatrix_kronecker_productr°      s^  € õZ Ð;Ð;°(Ð;Ñ;Ô;Ñ;Ô;ð 
ÝØ4µt¸H±~´~ÑEñ
ô 
ð 	
ð
   ”|Ðå˜  " œÑ&Ô&ð  ð  ˆØŒxˆØŒxˆõ �t‘”ð 	,ð 	,ˆAØ$ S¨¨4©¤[Ñ0ˆEå˜4 !™8‘_”_ð ð �ØŸšØ$ S¨¨4©°!©°a©Ô%8Ñ8ñô ��ð
 �AŠvˆvØ��à—}’} UÑ+Ô+��ØÐÐå�hÐ$?Ð$?Ð@Ñ@Ô@ÔJ€KÝÐ" KÑ0Ô0ð -ØÐàˆ{Ð+Ñ,Ô,Ð,r$   c                 ó^   — t          d„ | j        D ¦   «         ¦  «        s| S t          | j        Ž S )Nc              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S r)   r3   r    s     r"   r.   z-explicit_kronecker_product.<locals>.<genexpr>R  s,   è è € Ð<Ð<¨Q�z˜!�ZÑ(Ô(Ð<Ð<Ð<Ð<Ð<Ð<r$   )r7   r=   r°   )r˜   s    r"   Úexplicit_kronecker_productr³   P  s5   € åÐ<Ð<°$´)Ð<Ñ<Ô<Ñ<Ô<ð Øˆå# T¤YÐ/Ð/r$   c                 ó,   — t          | t          ¦  «        S r)   )r4   r   )Úxs    r"   r¥   r¥   ]  s   € ­:°aÕ9IÑ+JÔ+J€ r$   c                 ól   — t          | t          ¦  «        rt          d„ | j        D ¦   «         ¦  «        S dS )Nc              3   ó$   K  — | ]}|j         V — Œd S r)   rp   r+   s     r"   r.   z&_kronecker_dims_key.<locals>.<genexpr>c  s$   è è € Ð0Ð0 �Q”WÐ0Ð0Ð0Ð0Ð0Ð0r$   ©r   )r4   r   Útupler=   ©Úexprs    r"   Ú_kronecker_dims_keyr¼   a  s9   € Ý�$Õ(Ñ)Ô)ð ÝÐ0Ð0 d¤iÐ0Ñ0Ô0Ñ0Ô0Ð0àˆtr$   c                 óÔ   — t          | j        t          ¦  «        }|                     dd ¦  «        }|s| S d„ |                     ¦   «         D ¦   «         }|s	t          |Ž S t          |Ž |z   S )Nr¸   c                 ó0   — g | ]}t          d „ |¦  «        ‘ŒS )c                 ó,   — |                       |¦  «        S r)   )r   )rµ   Úys     r"   r¥   z.kronecker_mat_add.<locals>.<listcomp>.<lambda>n  s   €  ×!1Ò!1°!Ñ!4Ô!4€ r$   r   )r,   Úgroups     r"   rW   z%kronecker_mat_add.<locals>.<listcomp>n  s6   € ð )ð )ð )Øõ Ð4Ð4°eÑ<Ô<ð )ð )ð )r$   )r   r=   r¼   ÚpopÚvaluesr   )r»   r=   ÚnonkronsÚkronss       r"   Úkronecker_mat_addrÆ   h  s}   € Ý�”	Õ.Ñ/Ô/€DØ�xŠx˜˜dÑ#Ô#€HØð Øˆð)ð )ØŸ+š+™-œ-ð)ñ )ô )€Eð ð )Ý�uˆ~Ðå�uˆ~ Ñ(Ð(r$   c                 ó„  — |                       ¦   «         \  }}d}|t          |¦  «        dz
  k     r†|||dz   …         \  }}t          |t          ¦  «        rFt          |t          ¦  «        r1|                     |¦  «        ||<   |                     |dz   ¦  «         n|dz  }|t          |¦  «        dz
  k     °†|t          |Ž z  S )Nr   r   é   )Úas_coeff_matricesr   r4   r   r‚   rÂ   r   )r»   Úfactorr!   rI   ÚAÚBs         r"   Úkronecker_mat_mulrÍ   w  sÐ   € à×-Ò-Ñ/Ô/Ñ€FˆHà	€AØ
�c�(‰mŒm˜aÑÒ
Ð
Ø˜˜!˜A™#˜Œ‰ˆˆ1Ý�aÕ)Ñ*Ô*ð 	­z¸!Õ=MÑ/NÔ/Nð 	Ø×*Ò*¨1Ñ-Ô-ˆH�Q‰KØ�LŠL˜˜1™ÑÔÐÐà�‰FˆAð �c�(‰mŒm˜aÑÒ
Ð
ð •&˜(Ð#Ñ#Ð#r$   c                 óÀ   ‡ — t          ‰ j        t          ¦  «        rBt          d„ ‰ j        j        D ¦   «         ¦  «        rt          ˆ fd„‰ j        j        D ¦   «         Ž S ‰ S )Nc              3   ó$   K  — | ]}|j         V — Œd S r)   rc   r+   s     r"   r.   z$kronecker_mat_pow.<locals>.<genexpr>ˆ  s$   è è € Ð6[Ð6[Àq°q´{Ð6[Ð6[Ð6[Ð6[Ð6[Ð6[r$   c                 ó:   •— g | ]}t          |‰j        ¦  «        ‘ŒS rU   )r   Úexp)r,   r-   r»   s     €r"   rW   z%kronecker_mat_pow.<locals>.<listcomp>‰  s%   ø€ Ð!NÐ!NÐ!N¸!¥&¨¨D¬HÑ"5Ô"5Ð!NÐ!NÐ!Nr$   )r4   Úbaser   r7   r=   rº   s   `r"   Úkronecker_mat_powrÓ   ‡  sc   ø€ Ý�$”)Õ-Ñ.Ô.ð µ3Ð6[Ð6[ÈDÌIÌNÐ6[Ñ6[Ô6[Ñ3[Ô3[ð ÝÐ!NÐ!NÐ!NÐ!N¸t¼y¼~Ð!NÑ!NÔ!NÐOÐOàˆr$   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                 ó`   — t          | t          ¦  «        o|                      t          ¦  «        S r)   )r4   r
   Úhasr   rº   s    r"   Úhaskronz"combine_kronecker.<locals>.haskron¥  s$   € Ý˜$¥
Ñ+Ô+ÐJ°·²Õ9IÑ0JÔ0JÐJr$   r    N)r   r   r   r   r   rÆ   r   rÍ   r   rÓ   Úgetattr)r»   r×   ÚrulerL   r    s        r"   Úcombine_kroneckerrÚ   Ž  s¥   € ð.Kð Kð Kõ Ý•'�) G­UÝÕ&ÝÕ&ÝÕ&ð(ñ.)ô .)ñ *ô *ñ +ô +ñ 	,ô 	,ñ-ô -€Dð
 ˆT�$‰ZŒZ€FÝ�6˜6 4Ñ(Ô(€DØÐØˆt‰vŒ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Ú   rU   r$   r"   ú<module>rë      s¢  ðØ -Ð -Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø #Ð #Ð #Ð #Ð #Ð #Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø :Ð :Ð :Ð :Ð :Ð :Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0ðKð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kà /Ð /Ð /Ð /Ð /Ð /Ø  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð=2ð =2ð =2ð@R5ð R5ð R5ð R5ð R5�zñ R5ô R5ð R5ðj<ð <ð <ðð ð ðM-ð M-ð M-ð`0ð 0ð 0ð 
Ø	#Ø	Ø	ð	€ð
 ˆw�y�yÐ!JÐ!JØ!' ¨ ñ1ô 1ñ 2ô 2€ðð ð ð)ð )ð )ð$ð $ð $ð ð ð ð$ð $ð $ð $ð $r$   