Ë
    täij~  ã                   óà   — d 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 ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd	lmZmZ ed
k7  rddgZ  G d„ de!«      Z"ddl#m$Z$ ddl%m&Z& y)a¯  

Module for the DDM class.

The DDM class is an internal representation used by DomainMatrix. The letters
DDM stand for Dense Domain Matrix. A DDM instance represents a matrix using
elements from a polynomial Domain (e.g. ZZ, QQ, ...) in a dense-matrix
representation.

Basic usage:

    >>> from sympy import ZZ, QQ
    >>> from sympy.polys.matrices.ddm import DDM
    >>> A = DDM([[ZZ(0), ZZ(1)], [ZZ(-1), ZZ(0)]], (2, 2), ZZ)
    >>> A.shape
    (2, 2)
    >>> A
    [[0, 1], [-1, 0]]
    >>> type(A)
    <class 'sympy.polys.matrices.ddm.DDM'>
    >>> A @ A
    [[-1, 0], [0, -1]]

The ddm_* functions are designed to operate on DDM as well as on an ordinary
list of lists:

    >>> from sympy.polys.matrices.dense import ddm_idet
    >>> ddm_idet(A, QQ)
    1
    >>> ddm_idet([[0, 1], [-1, 0]], QQ)
    1
    >>> A
    [[-1, 0], [0, -1]]

Note that ddm_idet modifies the input matrix in-place. It is recommended to
use the DDM.det method as a friendlier interface to this instead which takes
care of copying the matrix:

    >>> B = DDM([[ZZ(0), ZZ(1)], [ZZ(-1), ZZ(0)]], (2, 2), ZZ)
    >>> B.det()
    1

Normally DDM would not be used directly and is just part of the internal
representation of DomainMatrix which adds further functionality including e.g.
unifying domains.

The dense format used by DDM is a list of lists of elements e.g. the 2x2
identity matrix is like [[1, 0], [0, 1]]. The DDM class itself is a subclass
of list and its list items are plain lists. Elements are accessed as e.g.
ddm[i][j] where ddm[i] gives the ith row and ddm[i][j] gets the element in the
jth column of that row. Subclassing list makes e.g. iteration and indexing
very efficient. We do not override __getitem__ because it would lose that
benefit.

The core routines are implemented by the ddm_* functions defined in dense.py.
Those functions are intended to be able to operate on a raw list-of-lists
representation of matrices with most functions operating in-place. The DDM
class takes care of copying etc and also stores a Domain object associated
with its elements. This makes it possible to implement things like A + B with
domain checking and also shape checking so that the list of lists
representation is friendlier.

é    )Úchain)ÚGROUND_TYPES)Údoctest_depends_oné   )ÚDMBadInputErrorÚDMDomainErrorÚDMNonSquareMatrixErrorÚDMShapeError)ÚQQ)Úddm_transposeÚddm_iaddÚddm_isubÚddm_inegÚddm_imulÚ	ddm_irmulÚddm_imatmulÚ	ddm_irrefÚddm_irref_denÚddm_idetÚddm_iinvÚddm_ilu_splitÚddm_ilu_solveÚddm_berk)Úddm_lllÚddm_lll_transformÚflintz
DDM.to_dfmzDDM.to_dfm_or_ddmc                   ó°  ‡ — e Zd ZdZdZdZdZˆ fd„Zd„ Zd„ Z	d„ Z
d	„ Zed
„ «       Zed„ «       Zd„ Zd„ Zed„ «       Zd„ Zd„ Zd„ Zed„ «       Zd„ Zed„ «       Zd„ Zed„ «       Zd„ Zd„ Zd„ Zd„ Z edg¬«      d„ «       Z edg¬«      d„ «       Z d„ Z!d „ Z"d!„ Z#ˆ fd"„Z$d#„ Z%ed$„ «       Z&ed%„ «       Z'ed&„ «       Z(d'„ Z)d(„ Z*d)„ Z+d*„ Z,d+„ Z-d,„ Z.d-„ Z/d.„ Z0ed/„ «       Z1d0„ Z2d1„ Z3d2„ Z4d3„ Z5d4„ Z6d5„ Z7d6„ Z8d7„ Z9d8„ Z:d9„ Z;d:„ Z<d;„ Z=ed<„ «       Z>d=„ Z?d>„ Z@d?„ ZAdSd@„ZBdA„ ZCdB„ ZDdC„ ZEdD„ ZFdE„ ZGdF„ ZHdG„ ZIdH„ ZJdI„ ZKdJ„ ZLdK„ ZMdL„ ZNdM„ ZOdN„ ZP eQdOdP«      fdQ„ZR eQdOdP«      fdR„ZSˆ xZTS )TÚDDMz©Dense matrix based on polys domain elements

    This is a list subclass and is a wrapper for a list of lists that supports
    basic matrix arithmetic +, -, *, **.
    ÚdenseFTc                 ób  •‡— t        |t        «      rt        d„ |D «       «      st        d«      ‚|\  }Št	        |«      |k7  st        ˆfd„|D «       «      rt        d«      ‚t        ‰| �  |D �cg c]  }|j                  «       ‘Œ c}«       |‰f| _	        || _
        ‰| _        || _        y c c}w )Nc              3   ó>   K  — | ]  }t        |«      t        u –— Œ y ­w©N)ÚtypeÚlist©Ú.0Úrows     úg/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/sympy/polys/matrices/ddm.pyÚ	<genexpr>zDDM.__init__.<locals>.<genexpr>r   s   è ø€ Ð2YÑPXÈ´4¸³9ÄÔ3DÑPXùs   ‚z rowslist must be a list of listsc              3   ó:   •K  — | ]  }t        |«      ‰k7  –— Œ y ­wr"   )Úlen)r&   r'   Úns     €r(   r)   zDDM.__init__.<locals>.<genexpr>u   s   øè ø€ Ð$G¹h°s¤S¨£X°¥]¹hùs   ƒzInconsistent row-list/shape)Ú
isinstancer$   Úallr   r+   ÚanyÚsuperÚ__init__ÚcopyÚshapeÚrowsÚcolsÚdomain)ÚselfÚrowslistr3   r6   ÚmÚir,   Ú	__class__s         @€r(   r1   zDDM.__init__q   sœ   ù€ Ü˜8¤TÔ*¬sÑ2YÑPXÓ2YÔ/YÜ!Ð"DÓEÐEØ‰ˆˆ1Üˆx‹=˜AÒ¤Ó$G¹hÓ$GÔ!GÜ!Ð"?Ó@Ð@ä‰Ñ©HÓ5©H q˜!Ÿ&™&�(¨HÑ5Ô6Ø˜�VˆŒ
ØˆŒ	ØˆŒ	Øˆ�ùò	 6s   Á/B,c                 ó   — | |   |   S r"   © )r7   r:   Újs      r(   ÚgetitemzDDM.getitem~   s   € Ø�A‰w�q‰zÐó    c                 ó   — || |   |<   y r"   r=   )r7   r:   r>   Úvalues       r(   ÚsetitemzDDM.setitem�   s   € ØˆˆQ‰�Š
r@   c                 óæ   — | |   D �cg c]  }||   ‘Œ	 }}t        |«      }|rt        |d   «      n#t        t        | j                  d   «      |   «      }t        |||f| j                  «      S c c}w )Nr   r   )r+   Úranger3   r   r6   )r7   Úslice1Úslice2r'   Úddmr4   r5   s          r(   Úextract_slicezDDM.extract_slice„   sk   € Ø&*¨6¢lÓ3¡l˜sˆs�6‹{ lˆÐ3Ü�3‹xˆÙ!Œs�3�q‘6Œ{¤s¬5°·±¸A±Ó+?ÀÑ+GÓ'HˆÜ�3˜˜t˜ d§k¡kÓ2Ð2ùò 4s   ˆA.c                 óÂ   — g }|D ])  }| |   }|j                  |D �cg c]  }||   ‘Œ	 c}«       Œ+ t        |t        |«      t        |«      f| j                  «      S c c}w r"   )Úappendr   r+   r6   )r7   r4   r5   rH   r:   Úrowir>   s          r(   ÚextractzDDM.extractŠ   s`   € ØˆÛˆAØ˜‘7ˆDØ�J‰J©Ó.© A˜˜Q›¨Ñ.Õ/ð ô �3œ˜T›¤C¨£IÐ.°·±Ó<Ð<ùò /s   œA
c                 ó   —  | |||«      S )a¸  
        Create a :class:`DDM` from a list of lists.

        Examples
        ========

        >>> from sympy import ZZ
        >>> from sympy.polys.matrices.ddm import DDM
        >>> A = DDM.from_list([[ZZ(0), ZZ(1)], [ZZ(-1), ZZ(0)]], (2, 2), ZZ)
        >>> A
        [[0, 1], [-1, 0]]
        >>> A == DDM([[ZZ(0), ZZ(1)], [ZZ(-1), ZZ(0)]], (2, 2), ZZ)
        True

        See Also
        ========

        from_list_flat
        r=   )Úclsr8   r3   r6   s       r(   Ú	from_listzDDM.from_list‘   s   € ñ* �8˜U FÓ+Ð+r@   c                 ó"   — |j                  «       S r"   )r2   )rO   Úothers     r(   Úfrom_ddmzDDM.from_ddm¨   s   € à�z‰z‹|Ðr@   c                 ó2   — | D �cg c]  }|dd ‘Œ	 c}S c c}w )a‚  
        Convert to a list of lists.

        Examples
        ========

        >>> from sympy import QQ
        >>> from sympy.polys.matrices.ddm import DDM
        >>> A = DDM([[1, 2], [3, 4]], (2, 2), QQ)
        >>> A.to_list()
        [[1, 2], [3, 4]]

        See Also
        ========

        to_list_flat
        sympy.polys.matrices.domainmatrix.DomainMatrix.to_list
        Nr=   ©r7   r'   s     r(   Úto_listzDDM.to_list¬   s    € ñ& #'Ó'¡$˜3�‘A’ $Ñ'Ð'ùÒ's   …c                 ó:   — g }| D ]  }|j                  |«       Œ |S )aÑ  
        Convert to a flat list of elements.

        Examples
        ========

        >>> from sympy import QQ
        >>> from sympy.polys.matrices.ddm import DDM
        >>> A = DDM([[1, 2], [3, 4]], (2, 2), QQ)
        >>> A.to_list_flat()
        [1, 2, 3, 4]
        >>> A == DDM.from_list_flat(A.to_list_flat(), A.shape, A.domain)
        True

        See Also
        ========

        sympy.polys.matrices.domainmatrix.DomainMatrix.to_list_flat
        ©Úextend)r7   Úflatr'   s      r(   Úto_list_flatzDDM.to_list_flatÁ   s$   € ð( ˆÛˆCØ�K‰K˜Õð àˆr@   c                 óÐ   — t        |«      t        u sJ ‚|\  }}t        |«      ||z  k(  st        d«      ‚t	        |«      D �cg c]  }|||z  |dz   |z   ‘Œ }} | |||«      S c c}w )aø  
        Create a :class:`DDM` from a flat list of elements.

        Examples
        ========

        >>> from sympy import QQ
        >>> from sympy.polys.matrices.ddm import DDM
        >>> A = DDM.from_list_flat([1, 2, 3, 4], (2, 2), QQ)
        >>> A
        [[1, 2], [3, 4]]
        >>> A == DDM.from_list_flat(A.to_list_flat(), A.shape, A.domain)
        True

        See Also
        ========

        to_list_flat
        sympy.polys.matrices.domainmatrix.DomainMatrix.from_list_flat
        zInconsistent flat-list shaper   )r#   r$   r+   r   rE   )rO   rZ   r3   r6   r4   r5   r:   Úlols           r(   Úfrom_list_flatzDDM.from_list_flatÚ   sz   € ô, �D‹zœTÑ!Ð!Ð!Ø‰
ˆˆdÜ�D“	˜T $™YÒ&Ü!Ð"@ÓAÐAÜ05°d´Ó<±¨1ˆt�A�d‘F˜A˜a™C ™:Ò&°ˆÐ<Ù�3˜˜vÓ&Ð&ùò =s   ÁA#c                 ó,   — t        j                  | «      S r"   )r   Úfrom_iterable©r7   s    r(   ÚflatiterzDDM.flatiter÷   s   € Ü×"Ñ" 4Ó(Ð(r@   c                 ó:   — g }| D ]  }|j                  |«       Œ |S r"   rX   )r7   Úitemsr'   s      r(   rZ   zDDM.flatú   s"   € ØˆÛˆCØ�L‰L˜Õð àˆr@   c                 ó>   — | j                  «       j                  «       S )a@  
        Convert to a flat list of nonzero elements and data.

        Explanation
        ===========

        This is used to operate on a list of the elements of a matrix and then
        reconstruct a matrix using :meth:`from_flat_nz`. Zero elements are
        included in the list but that may change in the future.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> A = DDM([[1, 2], [3, 4]], (2, 2), QQ)
        >>> elements, data = A.to_flat_nz()
        >>> elements
        [1, 2, 3, 4]
        >>> A == DDM.from_flat_nz(elements, data, A.domain)
        True

        See Also
        ========

        from_flat_nz
        sympy.polys.matrices.sdm.SDM.to_flat_nz
        sympy.polys.matrices.domainmatrix.DomainMatrix.to_flat_nz
        )Úto_sdmÚ
to_flat_nzra   s    r(   rg   zDDM.to_flat_nz   s   € ð< �{‰{‹}×'Ñ'Ó)Ð)r@   c                 óL   — t        j                  |||«      j                  «       S )aF  
        Reconstruct a :class:`DDM` after calling :meth:`to_flat_nz`.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> A = DDM([[1, 2], [3, 4]], (2, 2), QQ)
        >>> elements, data = A.to_flat_nz()
        >>> elements
        [1, 2, 3, 4]
        >>> A == DDM.from_flat_nz(elements, data, A.domain)
        True

        See Also
        ========

        to_flat_nz
        sympy.polys.matrices.sdm.SDM.from_flat_nz
        sympy.polys.matrices.domainmatrix.DomainMatrix.from_flat_nz
        )ÚSDMÚfrom_flat_nzÚto_ddm)rO   ÚelementsÚdatar6   s       r(   rj   zDDM.from_flat_nz   s"   € ô0 ×Ñ ¨$°Ó7×>Ñ>Ó@Ð@r@   c                 óŽ   — i }t        | «      D ].  \  }}t        |«      D ��ci c]  \  }}|sŒ	||“Œ }}}|sŒ*|||<   Œ0 |S c c}}w )aÔ  
        Convert to a dictionary of dictionaries (dod) format.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> A = DDM([[1, 2], [3, 4]], (2, 2), QQ)
        >>> A.to_dod()
        {0: {0: 1, 1: 2}, 1: {0: 3, 1: 4}}

        See Also
        ========

        from_dod
        sympy.polys.matrices.sdm.SDM.to_dod
        sympy.polys.matrices.domainmatrix.DomainMatrix.to_dod
        ©Ú	enumerate)r7   Údodr:   r'   r>   Úes         r(   Úto_dodz
DDM.to_dod:  sU   € ð( ˆÜ –o‰FˆAˆsÜ#,¨S¤>Ô7¡>™4˜1˜a²Q�1�Q‘3 >ˆCÑ7ÚØ��A’ð &ð ˆ
ùó 8s
   ¢
A­Ac                 óì   — |\  }}t        |«      D �cg c]  }|j                  g|z  ‘Œ }}|j                  «       D ]%  \  }}	|	j                  «       D ]  \  }
}|||   |
<   Œ Œ' t        |||«      S c c}w )aü  
        Create a :class:`DDM` from a dictionary of dictionaries (dod) format.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> dod = {0: {0: 1, 1: 2}, 1: {0: 3, 1: 4}}
        >>> A = DDM.from_dod(dod, (2, 2), QQ)
        >>> A
        [[1, 2], [3, 4]]

        See Also
        ========

        to_dod
        sympy.polys.matrices.sdm.SDM.from_dod
        sympy.polys.matrices.domainmatrix.DomainMatrix.from_dod
        ©rE   Úzerord   r   )rO   rq   r3   r6   r4   r5   Ú_r]   r:   r'   r>   Úelements               r(   Úfrom_dodzDDM.from_dodU  s{   € ð, ‰
ˆˆdÜ-2°4¬[Ó9©[¨�—‘ˆ}˜tÓ#¨[ˆÐ9Ø—i‘i–k‰FˆAˆsØ!Ÿi™ižk‘
��7Ø#��A‘�q’	ñ *ð "ô �3˜˜vÓ&Ð&ùò	 :s   “A1c                 ój   — i }t        | «      D ]"  \  }}t        |«      D ]  \  }}|sŒ	||||f<   Œ Œ$ |S )aá  
        Convert :class:`DDM` to dictionary of keys (dok) format.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> A = DDM([[1, 2], [3, 4]], (2, 2), QQ)
        >>> A.to_dok()
        {(0, 0): 1, (0, 1): 2, (1, 0): 3, (1, 1): 4}

        See Also
        ========

        from_dok
        sympy.polys.matrices.sdm.SDM.to_dok
        sympy.polys.matrices.domainmatrix.DomainMatrix.to_dok
        ro   )r7   Údokr:   r'   r>   rx   s         r(   Úto_dokz
DDM.to_dokr  sD   € ð( ˆÜ –o‰FˆAˆsÜ'¨žn‘
��7ÚØ '�C˜˜1˜’Iñ -ð &ð ˆ
r@   c                 óÂ   — |\  }}t        |«      D �cg c]  }|j                  g|z  ‘Œ }}|j                  «       D ]  \  \  }}	}
|
||   |	<   Œ t        |||«      S c c}w )aþ  
        Create a :class:`DDM` from a dictionary of keys (dok) format.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> dok = {(0, 0): 1, (0, 1): 2, (1, 0): 3, (1, 1): 4}
        >>> A = DDM.from_dok(dok, (2, 2), QQ)
        >>> A
        [[1, 2], [3, 4]]

        See Also
        ========

        to_dok
        sympy.polys.matrices.sdm.SDM.from_dok
        sympy.polys.matrices.domainmatrix.DomainMatrix.from_dok
        ru   )rO   r{   r3   r6   r4   r5   rw   r]   r:   r>   rx   s              r(   Úfrom_dokzDDM.from_dok�  si   € ð, ‰
ˆˆdÜ-2°4¬[Ó9©[¨�—‘ˆ}˜tÓ#¨[ˆÐ9Ø"Ÿy™yž{‰O‰FˆQ��GØˆC�‰F�1ŠIð  +ä�3˜˜vÓ&Ð&ùò :s   “Ac              #   óF   K  — | D ]  }t        d|«      E d{  –—†  Œ y7 Œ­w)aÀ  
        Iterate over the non-zero values of the matrix.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> A = DDM([[QQ(1), QQ(0)], [QQ(3), QQ(4)]], (2, 2), QQ)
        >>> list(A.iter_values())
        [1, 3, 4]

        See Also
        ========

        iter_items
        to_list_flat
        sympy.polys.matrices.domainmatrix.DomainMatrix.iter_values
        N)ÚfilterrU   s     r(   Úiter_valueszDDM.iter_values©  s%   è ø€ ó( ˆCÜ˜d CÓ(×(Ñ(ñ Ø(ús   ‚!—˜!c              #   ón   K  — t        | «      D ]#  \  }}t        |«      D ]  \  }}|sŒ	||f|f–— Œ Œ% y­w)aê  
        Iterate over indices and values of nonzero elements of the matrix.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> A = DDM([[QQ(1), QQ(0)], [QQ(3), QQ(4)]], (2, 2), QQ)
        >>> list(A.iter_items())
        [((0, 0), 1), ((1, 0), 3), ((1, 1), 4)]

        See Also
        ========

        iter_values
        to_dok
        sympy.polys.matrices.domainmatrix.DomainMatrix.iter_items
        Nro   )r7   r:   r'   r>   rx   s        r(   Ú
iter_itemszDDM.iter_itemsÀ  s=   è ø€ ô(   –o‰FˆAˆsÜ'¨žn‘
��7ÚØ˜a˜& '˜/Ó)ñ -ñ &ùs   ‚%5¨5c                 ó   — | S )au  
        Convert to a :class:`DDM`.

        This just returns ``self`` but exists to parallel the corresponding
        method in other matrix types like :class:`~.SDM`.

        See Also
        ========

        to_sdm
        to_dfm
        to_dfm_or_ddm
        sympy.polys.matrices.sdm.SDM.to_ddm
        sympy.polys.matrices.domainmatrix.DomainMatrix.to_ddm
        r=   ra   s    r(   rk   z
DDM.to_ddmÙ  s	   € ð  ˆr@   c                 óX   — t        j                  | | j                  | j                  «      S )aÄ  
        Convert to a :class:`~.SDM`.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> A = DDM([[1, 2], [3, 4]], (2, 2), QQ)
        >>> A.to_sdm()
        {0: {0: 1, 1: 2}, 1: {0: 3, 1: 4}}
        >>> type(A.to_sdm())
        <class 'sympy.polys.matrices.sdm.SDM'>

        See Also
        ========

        SDM
        sympy.polys.matrices.sdm.SDM.to_ddm
        )ri   rP   r3   r6   ra   s    r(   rf   z
DDM.to_sdmë  s   € ô* �}‰}˜T 4§:¡:¨t¯{©{Ó;Ð;r@   r   )Úground_typesc                 óV   — t        t        | «      | j                  | j                  «      S )aÄ  
        Convert to :class:`~.DDM` to :class:`~.DFM`.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> A = DDM([[1, 2], [3, 4]], (2, 2), QQ)
        >>> A.to_dfm()
        [[1, 2], [3, 4]]
        >>> type(A.to_dfm())
        <class 'sympy.polys.matrices._dfm.DFM'>

        See Also
        ========

        DFM
        sympy.polys.matrices._dfm.DFM.to_ddm
        )ÚDFMr$   r3   r6   ra   s    r(   Úto_dfmz
DDM.to_dfm  s   € ô, ”4˜“:˜tŸz™z¨4¯;©;Ó7Ð7r@   c                 ód   — t        j                  | j                  «      r| j                  «       S | S )a  
        Convert to :class:`~.DFM` if possible or otherwise return self.

        Examples
        ========

        >>> from sympy.polys.matrices.ddm import DDM
        >>> from sympy import QQ
        >>> A = DDM([[1, 2], [3, 4]], (2, 2), QQ)
        >>> A.to_dfm_or_ddm()
        [[1, 2], [3, 4]]
        >>> type(A.to_dfm_or_ddm())
        <class 'sympy.polys.matrices._dfm.DFM'>

        See Also
        ========

        to_dfm
        to_ddm
        sympy.polys.matrices.domainmatrix.DomainMatrix.to_dfm_or_ddm
        )rˆ   Ú_supports_domainr6   r‰   ra   s    r(   Úto_dfm_or_ddmzDDM.to_dfm_or_ddm  s'   € ô. ×Ñ §¡Ô,Ø—;‘;“=Ð Øˆr@   c                 óæ   — | j                   }||k(  r| j                  «       S | D ��cg c]"  }|D �cg c]  }|j                  ||«      ‘Œ c}‘Œ$ }}}t        || j                  |«      S c c}w c c}}w r"   )r6   r2   Úconvert_fromr   r3   )r7   ÚKÚKoldr'   rr   r4   s         r(   Ú
convert_tozDDM.convert_to5  sg   € Ø�{‰{ˆØ�Š9Ø—9‘9“;ÐÙBFÔGÁ$¸3±#Ó6±#¨Q�—‘  4Õ(°#Ó6À$ˆÑGÜ�4˜Ÿ™ QÓ'Ð'ùò 7ùÓGs   §	A-°A(Á	A-Á(A-c           
      ó’   — | D �cg c]$  }ddj                  t        t        |«      «      z  ‘Œ& }}ddj                  |«      z  S c c}w )Nz[%s]ú, )ÚjoinÚmapÚstr)r7   r'   Úrowsstrs      r(   Ú__str__zDDM.__str__<  sD   € Ù@DÓEÁ¸�6˜DŸI™I¤c¬#¨s£mÓ4Ó4ÀˆÐEØ˜Ÿ	™	 'Ó*Ñ*Ð*ùò Fs   …)Ac                 óš   — t        | «      j                  }t        j                  | «      }|›d|›d| j                  ›d| j
                  ›d�S )NÚ(r“   Ú))r#   Ú__name__r$   Ú__repr__r3   r6   )r7   rO   r4   s      r(   r�   zDDM.__repr__@  s6   € Ü�4‹j×!Ñ!ˆÜ�}‰}˜TÓ"ˆÚ#&ª¨d¯j«j¸$¿+»+ÐFÐFr@   c                 óz   •— t        |t        «      syt        ‰| �  |«      xr | j                  |j                  k(  S )NF)r-   r   r0   Ú__eq__r6   )r7   rR   r;   s     €r(   rŸ   z
DDM.__eq__E  s1   ø€ Ü˜%¤Ô%ØÜ‘‘˜uÓ%ÒE¨$¯+©+¸¿¹Ñ*EÐFr@   c                 ó&   — | j                  |«       S r"   )rŸ   )r7   rR   s     r(   Ú__ne__z
DDM.__ne__J  s   € Ø—;‘;˜uÓ%Ð%Ð%r@   c                 ó€   — |j                   }|\  }}t        |«      D �cg c]  }|g|z  ‘Œ
 }}t        |||«      S c c}w r"   )rv   rE   r   )rO   r3   r6   Úzr9   r,   rw   r8   s           r(   Úzerosz	DDM.zerosM  sF   € à�K‰KˆØ‰ˆˆ1Ü%*¨1¤XÓ.¡X �Q�C˜!“G XˆÐ.Ü�8˜U FÓ+Ð+ùò /ó   Ÿ;c                 ó€   — |j                   }|\  }}t        |«      D �cg c]  }|g|z  ‘Œ
 }}t        |||«      S c c}w r"   )ÚonerE   r   )rO   r3   r6   r§   r9   r,   rw   Úrowlists           r(   ÚoneszDDM.onesT  sF   € à�j‰jˆØ‰ˆˆ1Ü&+¨A¤hÓ/¡h �C�5˜1“9 hˆÐ/Ü�7˜E 6Ó*Ð*ùò 0r¥   c                 óÞ   — t        |t        «      r|\  }}nt        |t        «      r|x}}|j                  }| j	                  f|«      }t        t        ||«      «      D ]
  }|||   |<   Œ |S r"   )r-   ÚtupleÚintr§   r¤   rE   Úmin)rO   Úsizer6   r9   r,   r§   rH   r:   s           r(   ÚeyezDDM.eye[  sl   € ä�dœEÔ"Ø‰DˆA‰qÜ˜œcÔ"ØˆLˆA�Ø�j‰jˆØ�i‰i˜˜A˜ Ó'ˆÜ”s˜1˜a“yÖ!ˆAØˆC�‰F�1ŠIð "àˆ
r@   c                 ór   — | D �cg c]  }|d d  ‘Œ	 }}t        || j                  | j                  «      S c c}w r"   )r   r3   r6   )r7   r'   Úcopyrowss      r(   r2   zDDM.copyg  s6   € Ù&*Ó+¡d˜s�C™’F dˆÐ+Ü�8˜TŸZ™Z¨¯©Ó5Ð5ùò ,s   …4c                 óz   — | j                   \  }}|rt        | «      }ng g|z  }t        |||f| j                  «      S r"   )r3   r   r   r6   )r7   r4   r5   ÚddmTs       r(   Ú	transposezDDM.transposek  s>   € Ø—Z‘Z‰
ˆˆdÙÜ  Ó&‰Dà�4˜$‘;ˆDÜ�4˜$ ˜ t§{¡{Ó3Ð3r@   c                 óP   — t        |t        «      st        S | j                  |«      S r"   )r-   r   ÚNotImplementedÚadd©ÚaÚbs     r(   Ú__add__zDDM.__add__s  ó   € Ü˜!œSÔ!Ü!Ð!Ø�u‰u�Q‹xˆr@   c                 óP   — t        |t        «      st        S | j                  |«      S r"   )r-   r   r¶   Úsubr¸   s     r(   Ú__sub__zDDM.__sub__x  r¼   r@   c                 ó"   — | j                  «       S r"   )Úneg©r¹   s    r(   Ú__neg__zDDM.__neg__}  s   € Ø�u‰u‹wˆr@   c                 óL   — || j                   v r| j                  |«      S t        S r"   ©r6   Úmulr¶   r¸   s     r(   Ú__mul__zDDM.__mul__€  ó    € Ø�—‘‰=Ø—5‘5˜“8ˆOä!Ð!r@   c                 óL   — || j                   v r| j                  |«      S t        S r"   rÅ   r¸   s     r(   Ú__rmul__zDDM.__rmul__†  rÈ   r@   c                 óP   — t        |t        «      r| j                  |«      S t        S r"   )r-   r   Úmatmulr¶   r¸   s     r(   Ú
__matmul__zDDM.__matmul__Œ  s    € Ü�aœÔØ—8‘8˜A“;Ðä!Ð!r@   c                 óè   — |j                   |j                   k7  r*d|j                   ›d|›d|j                   ›�}t        |«      ‚||k7  r*d|j                  ›d|›d|j                  ›�}t        |«      ‚y )NzDomain mismatch: Ú zShape mismatch: )r6   r   r3   r
   )rO   r¹   Úoprº   ÚashapeÚbshapeÚmsgs          r(   Ú_checkz
DDM._check’  s]   € à�8‰8�q—x‘xÓØ12·³º2¸q¿xºxÐHˆCÜ Ó$Ð$Ø�VÓØ01·³º¸Q¿WºWÐEˆCÜ˜sÓ#Ð#ð r@   c                 ó�   — | j                  | d|| j                  |j                  «       | j                  «       }t        ||«       |S )za + bÚ+)rÔ   r3   r2   r   ©r¹   rº   Úcs      r(   r·   zDDM.add›  ó7   € à	�‰��C˜˜AŸG™G Q§W¡WÔ-Ø�F‰F‹HˆÜ��AŒØˆr@   c                 ó�   — | j                  | d|| j                  |j                  «       | j                  «       }t        ||«       |S )za - bÚ-)rÔ   r3   r2   r   r×   s      r(   r¾   zDDM.sub¢  rÙ   r@   c                 ó<   — | j                  «       }t        |«       |S )z-a)r2   r   r¸   s     r(   rÁ   zDDM.neg©  s   € à�F‰F‹HˆÜ�ŒØˆr@   c                 ó>   — | j                  «       }t        ||«       |S r"   )r2   r   r×   s      r(   rÆ   zDDM.mul¯  s   € Ø�F‰F‹HˆÜ��AŒØˆr@   c                 ó>   — | j                  «       }t        ||«       |S r"   )r2   r   r×   s      r(   ÚrmulzDDM.rmul´  s   € Ø�F‰F‹HˆÜ�!�QŒØˆr@   c                 óÂ   — | j                   \  }}|j                   \  }}| j                  | d|||«       | j                  ||f| j                  «      }t	        || |«       |S )za @ b (matrix product)Ú*)r3   rÔ   r¤   r6   r   )r¹   rº   r9   ÚoÚo2r,   rØ   s          r(   rÌ   z
DDM.matmul¹  sY   € à�w‰w‰ˆˆ1Ø—‘‰ˆˆAØ	�‰��C˜˜A˜rÔ"Ø�G‰G�Q˜�F˜AŸH™HÓ%ˆÜ�A�q˜!ÔØˆr@   c                 óP  — | j                   |j                   k(  sJ ‚| j                  |j                  k(  sJ ‚t        | |«      D ����cg c]'  \  }}t        ||«      D ��cg c]
  \  }}||z  ‘Œ c}}‘Œ) }}}}}t        || j                   | j                  «      S c c}}w c c}}}}w r"   )r3   r6   Úzipr   )r¹   rº   ÚaiÚbiÚaijÚbijrØ   s          r(   Úmul_elementwisezDDM.mul_elementwiseÂ  sˆ   € Ø�w‰w˜!Ÿ'™'Ò!Ð!Ð!Ø�x‰x˜1Ÿ8™8Ò#Ð#Ð#ÜCFÀqÈ!Ä9ÖMÁ9¹¸¸R¬¨B°¬Ô4©™H˜C ˆc�C‹i¨Ô4À9ˆÓMÜ�1�a—g‘g˜qŸx™xÓ(Ð(ùó 5ùÕMs   ÁB 
ÁBÁ.B 
ÂB 
c                 óP  — t        | j                  «       «      }| j                  \  }}| j                  }|D ]U  }|j                  \  }}||k(  sJ ‚|j                  |k(  sJ ‚||z  }t	        |«      D ]  \  }	}
||	   j                  |
«       Œ ŒW t        |||f| j                  «      S )a	  Horizontally stacks :py:class:`~.DDM` matrices.

        Examples
        ========

        >>> from sympy import ZZ
        >>> from sympy.polys.matrices.sdm import DDM

        >>> A = DDM([[ZZ(1), ZZ(2)], [ZZ(3), ZZ(4)]], (2, 2), ZZ)
        >>> B = DDM([[ZZ(5), ZZ(6)], [ZZ(7), ZZ(8)]], (2, 2), ZZ)
        >>> A.hstack(B)
        [[1, 2, 5, 6], [3, 4, 7, 8]]

        >>> C = DDM([[ZZ(9), ZZ(10)], [ZZ(11), ZZ(12)]], (2, 2), ZZ)
        >>> A.hstack(B, C)
        [[1, 2, 5, 6, 9, 10], [3, 4, 7, 8, 11, 12]]
        )r$   r2   r3   r6   rp   rY   r   )ÚAÚBÚAnewr4   r5   r6   ÚBkÚBkrowsÚBkcolsr:   ÚBkis              r(   Úhstackz
DDM.hstackÈ  s¢   € ô$ �A—F‘F“H‹~ˆØ—W‘W‰
ˆˆdØ—‘ˆãˆBØŸX™X‰NˆF�FØ˜T’>Ð!�>Ø—9‘9 Ò&Ð&Ð&à�F‰NˆDä# Bž-‘��3Ø�Q‘—‘˜sÕ#ñ (ð ô �4˜$ ˜ q§x¡xÓ0Ð0r@   c                 ó@  — t        | j                  «       «      }| j                  \  }}| j                  }|D ]M  }|j                  \  }}||k(  sJ ‚|j                  |k(  sJ ‚||z  }|j	                  |j                  «       «       ŒO t        |||f| j                  «      S )a  Vertically stacks :py:class:`~.DDM` matrices.

        Examples
        ========

        >>> from sympy import ZZ
        >>> from sympy.polys.matrices.sdm import DDM

        >>> A = DDM([[ZZ(1), ZZ(2)], [ZZ(3), ZZ(4)]], (2, 2), ZZ)
        >>> B = DDM([[ZZ(5), ZZ(6)], [ZZ(7), ZZ(8)]], (2, 2), ZZ)
        >>> A.vstack(B)
        [[1, 2], [3, 4], [5, 6], [7, 8]]

        >>> C = DDM([[ZZ(9), ZZ(10)], [ZZ(11), ZZ(12)]], (2, 2), ZZ)
        >>> A.vstack(B, C)
        [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]]
        )r$   r2   r3   r6   rY   r   )	rì   rí   rî   r4   r5   r6   rï   rð   rñ   s	            r(   Úvstackz
DDM.vstackê  s’   € ô$ �A—F‘F“H‹~ˆØ—W‘W‰
ˆˆdØ—‘ˆãˆBØŸX™X‰NˆF�FØ˜T’>Ð!�>Ø—9‘9 Ò&Ð&Ð&à�F‰NˆDà�K‰K˜Ÿ™›	Õ"ð ô �4˜$ ˜ q§x¡xÓ0Ð0r@   c           	      ó~   — | D �cg c]  }t        t        ||«      «      ‘Œ }}t        || j                  |«      S c c}w r"   )r$   r•   r   r3   )r7   Úfuncr6   r'   rl   s        r(   Ú	applyfunczDDM.applyfunc  s9   € Ù48Ó9±D¨S”Dœ˜T 3›Õ(°DˆÐ9Ü�8˜TŸZ™Z¨Ó0Ð0ùò :s   …:c                 ó&   — t        d„ | D «       «      S )zŸNumber of non-zero entries in :py:class:`~.DDM` matrix.

        See Also
        ========

        sympy.polys.matrices.domainmatrix.DomainMatrix.nnz
        c              3   óN   K  — | ]  }t        t        t        |«      «      –— Œ y ­wr"   )Úsumr•   Úboolr%   s     r(   r)   zDDM.nnz.<locals>.<genexpr>  s   è ø€ Ð4±!¨3”3”sœ4 “~×&±!ùs   ‚#%)rû   rÂ   s    r(   ÚnnzzDDM.nnz  s   € ô Ñ4±!Ó4Ó4Ð4r@   c                 ó>   — | j                  «       j                  «       S )a�  Strongly connected components of a square matrix *a*.

        Examples
        ========

        >>> from sympy import ZZ
        >>> from sympy.polys.matrices.sdm import DDM
        >>> A = DDM([[ZZ(1), ZZ(0)], [ZZ(0), ZZ(1)]], (2, 2), ZZ)
        >>> A.scc()
        [[0], [1]]

        See also
        ========

        sympy.polys.matrices.domainmatrix.DomainMatrix.scc

        )rf   ÚsccrÂ   s    r(   rÿ   zDDM.scc  s   € ð$ �x‰x‹z�~‰~ÓÐr@   c                 óJ   — t        j                  ||«      j                  «       S )a|  Returns a square diagonal matrix with *values* on the diagonal.

        Examples
        ========

        >>> from sympy import ZZ
        >>> from sympy.polys.matrices.sdm import DDM
        >>> DDM.diag([ZZ(1), ZZ(2), ZZ(3)], ZZ)
        [[1, 0, 0], [0, 2, 0], [0, 0, 3]]

        See also
        ========

        sympy.polys.matrices.domainmatrix.DomainMatrix.diag
        )ri   Údiagrk   )rO   Úvaluesr6   s      r(   r  zDDM.diag-  s   € ô" �x‰x˜ Ó'×.Ñ.Ó0Ð0r@   c                 ó�   — | j                  «       }| j                  }|j                  xs |j                  }t	        ||¬«      }||fS )a"  Reduced-row echelon form of a and list of pivots.

        See Also
        ========

        sympy.polys.matrices.domainmatrix.DomainMatrix.rref
            Higher level interface to this function.
        sympy.polys.matrices.dense.ddm_irref
            The underlying algorithm.
        )Ú_partial_pivot)r2   r6   Úis_RealFieldÚis_ComplexFieldr   )r¹   rº   r�   Úpartial_pivotÚpivotss        r(   ÚrrefzDDM.rref@  sB   € ð �F‰F‹HˆØ�H‰HˆØŸ™Ò;¨!×*;Ñ*;ˆÜ˜1¨]Ô;ˆØ�&ˆyÐr@   c                 ób   — | j                  «       }| j                  }t        ||«      \  }}|||fS )a:  Reduced-row echelon form of a with denominator and list of pivots

        See Also
        ========

        sympy.polys.matrices.domainmatrix.DomainMatrix.rref_den
            Higher level interface to this function.
        sympy.polys.matrices.dense.ddm_irref_den
            The underlying algorithm.
        )r2   r6   r   )r¹   rº   r�   Údenomr  s        r(   Úrref_denzDDM.rref_denQ  s5   € ð �F‰F‹HˆØ�H‰HˆÜ% a¨Ó+‰ˆˆvØ�%˜ÐÐr@   c                 óJ   — | j                  «       \  }}|j                  |«      S )zÕReturns a basis for the nullspace of a.

        The domain of the matrix must be a field.

        See Also
        ========

        rref
        sympy.polys.matrices.domainmatrix.DomainMatrix.nullspace
        )r	  Únullspace_from_rref)r¹   r	  r  s      r(   Ú	nullspacezDDM.nullspacea  s$   € ð —v‘v“x‰ˆˆfØ×'Ñ'¨Ó/Ð/r@   c                 ó†  — | j                   \  }}| j                  }|€Gg }d}t        |«      D ]5  }| |   }t        |dz   |«      D ]  }||   sŒ	|}|j                  |«        Œ5 Œ7 |s&| j	                  ||«      t        t        |«      «      fS | d   |d      }	g }
g }t        |«      D ]x  }||v rŒ|j                  |«       t        |«      D �cg c]  }||k(  r|	n|j                  ‘Œ }}t        |«      D ]  \  }}||xx   | |   |   z  cc<   Œ |
j                  |«       Œz t        |
t        |
«      |f|«      }||fS c c}w )a9  Compute the nullspace of a matrix from its rref.

        The domain of the matrix can be any domain.

        Returns a tuple (basis, nonpivots).

        See Also
        ========

        sympy.polys.matrices.domainmatrix.DomainMatrix.nullspace
            The higher level interface to this function.
        éÿÿÿÿr   r   )
r3   r6   rE   rK   r¯   r$   rv   rp   r   r+   )r¹   r  r9   r,   r�   Ú
last_pivotr:   ræ   r>   Ú	pivot_valÚbasisÚ	nonpivotsÚvecÚiiÚjjÚ	basis_ddms                   r(   r  zDDM.nullspace_from_rrefo  sZ  € ð �w‰w‰ˆˆ1Ø�H‰Hˆàˆ>ØˆFØˆJÜ˜1–X�Ø�q‘T�Ü˜z¨!™|¨QÖ/�AØ˜!“uØ%&˜
ØŸ™ aÔ(Ùñ	 0ð ñ Ø—E‘E˜!˜Q“K¤¤e¨A£h£Ð0Ð0ð �a‘D˜ ™‘Oˆ	àˆØˆ	Ü�q–ˆAØ�F‰{ØØ×Ñ˜QÔÜ<AÀ!¼HÓE¹H°q  Q¢‘9¨A¯F©FÑ2¸HˆCÐEÜ# FÖ+‘��BØ�B“˜1˜R™5 ™8Ñ#”ð ,à�L‰L˜Õð ô ˜¤ E£
¨A˜°Ó2ˆ	à˜9Ð%Ð%ùò Fs   ÃD>c                 óZ   — | j                  «       j                  «       j                  «       S r"   )rf   Ú
particularrk   rÂ   s    r(   r  zDDM.particularŸ  s    € Ø�x‰x‹z×$Ñ$Ó&×-Ñ-Ó/Ð/r@   c                 ó”   — | j                   \  }}||k7  rt        d«      ‚| j                  «       }|j                  }t	        ||«      }|S )zDeterminant of aú Determinant of non-square matrix)r3   r	   r2   r6   r   )r¹   r9   r,   rº   r�   Údetas         r(   ÚdetzDDM.det¢  sF   € à�w‰w‰ˆˆ1Ø�Š6Ü(Ð)KÓLÐLØ�F‰F‹HˆØ�H‰HˆÜ˜˜1‹~ˆØˆr@   c                 ó–   — | j                   \  }}||k7  rt        d«      ‚| j                  «       }| j                  }t	        || |«       |S )zInverse of ar  )r3   r	   r2   r6   r   )r¹   r9   r,   Úainvr�   s        r(   ÚinvzDDM.inv¬  sG   € à�w‰w‰ˆˆ1Ø�Š6Ü(Ð)KÓLÐLØ�v‰v‹xˆØ�H‰HˆÜ��q˜!ÔØˆr@   c                 ó    — | j                   \  }}| j                  }| j                  «       }| j                  ||«      }t	        |||«      }|||fS )zL, U decomposition of a)r3   r6   r2   r¯   r   )r¹   r9   r,   r�   ÚUÚLÚswapss          r(   ÚluzDDM.lu¶  sL   € à�w‰w‰ˆˆ1Ø�H‰Hˆà�F‰F‹HˆØ�E‰E�!�Q‹KˆÜ˜a  AÓ&ˆà�!�Uˆ{Ðr@   c                 óÞ  ‡‡‡— | j                   \  }}| j                  Š| j                  «       Št        t	        |«      «      }d}t	        t        ||«      «      D �]  Št        ˆˆˆfd„t	        |«      D «       «      rŒ$d}t	        ||«      D ]  }‰|   ‰   ‰j                  k7  sŒ|} n |dk(  rŒV||k7  r"‰|   ‰|   c‰|<   ‰|<   ||   ||   c||<   ||<   ‰|   ‰   }t	        |dz   |«      D ]r  }‰|   ‰   }|dkD  r‰|dz
     |dz
     n‰j                  }	t	        ‰dz   |«      D ]/  }
‰j                  |‰|   |
   z  ‰|   |
   |z  z
  |	«      ‰|   |
<   Œ1 |‰|   ‰<   Œt |dz  }�Œ ‰|fS )a&  
        Private method for Phase 1 of fraction-free LU decomposition.
        Performs row operations and elimination to compute U and permutation indices.

        Returns:
            LU : decomposition as a single matrix.
            perm (list): Permutation indices for row swaps.
        r   c              3   óH   •K  — | ]  }‰|   ‰   ‰j                   k(  –— Œ y ­wr"   )rv   )r&   r:   r�   ÚLUr>   s     €€€r(   r)   zDDM._fflu.<locals>.<genexpr>Ó  s#   øè ø€ Ð;©{¨!�2�a‘5˜‘8˜qŸv™vÕ%©{ùó   ƒ"r  r   )
r3   r6   r2   r$   rE   r­   r.   rv   r§   Úexquo)r7   r4   r5   ÚpermÚrankÚ	pivot_rowr:   ÚpivotÚ
multiplierÚdenominatorÚkr�   r*  r>   s              @@@r(   Ú_ffluz	DDM._ffluÁ  s«  ú€ ð —Z‘Z‰
ˆˆdØ�K‰Kˆà�Y‰Y‹[ˆÜ”E˜$“KÓ ˆØˆä”s˜4 “×'ˆAäÕ;¬u°T¬{Ó;Ô;Øð ˆIÜ˜4 Ö&�Ø�a‘5˜‘8˜qŸv™vÓ%Ø !�IÙð 'ð ˜BŠØð ˜DÒ Ø*,¨Y©-¸¸D¹Ð'��4‘˜"˜Y™-Ø.2°9©o¸tÀD¹zÐ+��T‘
˜D ™Oð �t‘H˜Q‘KˆEÜ˜4 !™8 TÖ*�Ø ™U 1™X�
à8<¸qº˜b ¨¡™l¨4°!©8Ò4ÀaÇeÁe�Ü˜q 1™u dÖ+�AØ Ÿw™w u¨r°!©u°Q©xÑ'7¸"¸T¹(À1¹+È
Ñ:RÑ'RÐT_Ó`�B�q‘E˜!’Hð ,ð &��1‘�a’ð +ð �A‰IŠDð? (ðB �4ˆxˆr@   c                 ó  — | j                   \  }}| j                  }| j                  «       \  }}| j                  ||f|«      }t	        |«      D ]  \  }}|j
                  ||   |<   Œ | j                  ||f|«      }	dx}}
||k  rq|
|k  rl||   |
   |j                  k7  rG||   |
   |	|   |<   t        |dz   |«      D ]"  }||   |
   |	|   |<   |j                  ||   |
<   Œ$ |dz  }|
dz  }
||k  r|
|k  rŒlt        ||«      D ]  }|j
                  |	|   |<   Œ | j                  ||f|«      }|dk\  r|	d   d   |d   d<   |j
                  }t        d|«      D ]!  }|	|dz
     |dz
     |	|   |   z  }|||   |<   Œ# ||	||fS )zÑ
        Fraction-free LU decomposition of DDM.

        See Also
        ========

        sympy.polys.matrices.domainmatrix.DomainMatrix.fflu
            The higher-level interface to this function.
        r   r   )r3   r6   r4  r¤   rp   r§   rv   rE   )r7   r4   r5   r�   r$  r-  ÚPr:   Úpir%  r>   ÚlÚDÚdis                 r(   ÚffluzDDM.ffluô  sÆ  € ð —Z‘Z‰
ˆˆdØ�K‰Kˆð —*‘*“,‰ˆˆ4ð �J‰J˜˜d�| QÓ'ˆÜ˜t–_‰EˆAˆrØ—u‘uˆAˆa‰D�ŠHð %ð �J‰J˜˜d�| QÓ'ˆØˆ	ˆˆAØ�$Šh˜1˜tš8Ø�‰t�A‰w˜!Ÿ&™&Ò ð ˜A™$˜q™'��!‘�Q‘Ü˜q 1™u dÖ+�Aà ™d 1™g�A�a‘D˜‘GàŸf™f�A�a‘D˜’Gð	 ,ð
 �Q‘�Ø�‰FˆAð �$Šh˜1˜t›8ô �q˜$–ˆAØ—e‘eˆAˆa‰D�ŠGð  ð �J‰J˜˜d�| QÓ'ˆØ�1Š9Ø˜‘d˜1‘gˆAˆa‰D�‰GØ�U‰UˆÜ�q˜$–ˆAà�1�q‘5‘˜!˜a™%‘ 1 Q¡4¨¡7Ñ*ˆBØˆAˆa‰D�ŠGð  ð
 �!�Q˜ˆzÐr@   c           	      ó¤  ‡	‡
‡— | j                   \  Š}| j                  Š	| j                  «       Š
| j                  t	        ‰|«      |f‰	«      }‰	j
                  st        d«      ‚ˆ	ˆ
ˆfd„}t        |«      D ]§  }t        t	        |‰«      «      D ]\  } |||«      }|‰	j                  k7  sŒ |||«      |z  ||   |<   t        ‰«      D ]!  }‰
|   |xx   ||   |   ‰
|   |   z  z  cc<   Œ# Œ^ |‰k  sŒ} |||«      }|‰	j                  k7  sŒ–‰	j                  ||   |<   Œ© ‰
j                  t        ‰«      t        t	        ‰|«      «      «      Š
‰
|fS )a4  
        QR decomposition for DDM.

        Returns:
            - Q: Orthogonal matrix as a DDM.
            - R: Upper triangular matrix as a DDM.

        See Also
        ========

        sympy.polys.matrices.domainmatrix.DomainMatrix.qr
            The higher-level interface to this function.
        z,QR decomposition requires a field (e.g. QQ).c                 óR   •‡ ‡— ‰j                  ˆˆ ˆfd„t        ‰«      D «       «      S )Nc              3   ó@   •K  — | ]  }‰|   ‰   ‰|   ‰   z  –— Œ y ­wr"   r=   )r&   r3  ÚQr:   r>   s     €€€r(   r)   z+DDM.qr.<locals>.<lambda>.<locals>.<genexpr>A  s'   øè ø€ Ð%MÁ¸A a¨¡d¨1¡g°°!±°Q±Õ&7Áùs   ƒ)rû   rE   )r:   r>   r�   r?  r4   s   ``€€€r(   Ú<lambda>zDDM.qr.<locals>.<lambda>A  s   ú€  §¡Õ%MÄÀtÄÓ%MÔ Mr@   )r3   r6   r2   r¤   r­   Úis_Fieldr   rE   rv   r§   rM   )r7   r5   ÚRÚdot_colsr>   r:   Údot_iir3  Údot_jjr�   r?  r4   s            @@@r(   ÚqrzDDM.qr*  s=  ú€ ð —Z‘Z‰
ˆˆdØ�K‰KˆØ�I‰I‹KˆØ�J‰Jœ˜D $›¨Ð.°Ó2ˆð �zŠzÜÐ NÓOÐOåMˆä�t–ˆAÜœ3˜q $›<Ö(�Ù! ! Q›�Ø˜QŸV™VÓ#Ù& q¨!›n¨vÑ5�A�a‘D˜‘GÜ" 4ž[˜Ø˜!™˜Q› 1 Q¡4¨¡7¨Q¨q©T°!©WÑ#4Ñ4œñ )ð	 )ð �4‹xÙ! ! Q›�Ø˜QŸV™VÓ#ØŸe™e�A�a‘D˜’Gð ð �I‰I”e˜D“k¤5¬¨T°4«Ó#9Ó:ˆà�!ˆtˆr@   c                 ó0  — | j                   \  }}|j                   \  }}| j                  | d|||«       | j                  j                  st	        d«      ‚| j                  «       \  }}}| j                  ||f| j                  «      }	t        |	||||«       |	S )zx where a*x = bÚlu_solvezlu_solve requires a field)r3   rÔ   r6   rA  r   r'  r¤   r   )
r¹   rº   r9   r,   Úm2râ   r%  r$  r&  Úxs
             r(   rH  zDDM.lu_solveT  s‡   € à�w‰w‰ˆˆ1Ø—‘‰ˆˆAØ	�‰��J  1 bÔ)Ø�x‰x× Ò ÜÐ ;Ó<Ð<à—d‘d“f‰ˆˆ1ˆeØ�G‰G�Q˜�F˜AŸH™HÓ%ˆÜ�a˜˜A˜u aÔ(Øˆr@   c                 óÀ   — | j                   }| j                  \  }}||k7  rt        d«      ‚t        | |«      }t	        |dz   «      D �cg c]
  }||   d   ‘Œ }}|S c c}w )z.Coefficients of characteristic polynomial of azCharpoly of non-square matrixr   r   )r6   r3   r	   r   rE   )r¹   r�   r9   r,   r  r:   Úcoeffss          r(   ÚcharpolyzDDM.charpolya  sd   € à�H‰HˆØ�w‰w‰ˆˆ1Ø�Š6Ü(Ð)HÓIÐIÜ�q˜!‹nˆÜ%*¨1¨Q©3¤ZÓ0¡Z �#�a‘&˜“) ZˆÐ0Øˆùò 1s   ÁAc                 ót   ‡— | j                   j                  Št        ˆfd„| j                  «       D «       «      S )z@
        Says whether this matrix has all zero entries.
        c              3   ó(   •K  — | ]	  }|‰k(  –— Œ y ­wr"   r=   )r&   ÚMijrv   s     €r(   r)   z%DDM.is_zero_matrix.<locals>.<genexpr>p  s   øè ø€ Ð:©/ 3�3˜$•;©/ùs   ƒ)r6   rv   r.   rb   ©r7   rv   s    @r(   Úis_zero_matrixzDDM.is_zero_matrixk  s+   ø€ ð �{‰{×ÑˆÜÓ:¨$¯-©-¬/Ó:Ó:Ð:r@   c                 ój   ‡— | j                   j                  Št        ˆfd„t        | «      D «       «      S )z~
        Says whether this matrix is upper-triangular. True can be returned
        even if the matrix is not square.
        c              3   óB   •K  — | ]  \  }}|d | D ]	  }|‰k(  –— Œ Œ y ­wr"   r=   ©r&   r:   ÚMirP  rv   s       €r(   r)   zDDM.is_upper.<locals>.<genexpr>x  s(   øè ø€ ÐN©O¡5 1 bÀrÈ"È1ÃvÀ�3˜$•;Àv�;©Oùs   ƒ©r6   rv   r.   rp   rQ  s    @r(   Úis_upperzDDM.is_upperr  s)   ø€ ð
 �{‰{×ÑˆÜÓN¬I°d¬OÓNÓNÐNr@   c                 ój   ‡— | j                   j                  Št        ˆfd„t        | «      D «       «      S )z~
        Says whether this matrix is lower-triangular. True can be returned
        even if the matrix is not square.
        c              3   óH   •K  — | ]  \  }}||d z   d D ]	  }|‰k(  –— Œ Œ y­w)r   Nr=   rU  s       €r(   r)   zDDM.is_lower.<locals>.<genexpr>€  s,   øè ø€ ÐP©O¡5 1 bÀrÈ!ÈAÉ#È$ÃxÀ�3˜$•;Àx�;©Oùr+  rW  rQ  s    @r(   Úis_lowerzDDM.is_lowerz  s)   ø€ ð
 �{‰{×ÑˆÜÓP¬I°d¬OÓPÓPÐPr@   c                 óF   — | j                  «       xr | j                  «       S )zv
        Says whether this matrix is diagonal. True can be returned even if
        the matrix is not square.
        )rX  r[  ra   s    r(   Úis_diagonalzDDM.is_diagonal‚  s   € ð
 �}‰}‹Ò2 4§=¡=£?Ð2r@   c                 ó|   — | j                   \  }}t        t        ||«      «      D �cg c]
  }| |   |   ‘Œ c}S c c}w )zQ
        Returns a list of the elements from the diagonal of the matrix.
        )r3   rE   r­   )r7   r9   r,   r:   s       r(   ÚdiagonalzDDM.diagonal‰  s>   € ð �z‰z‰ˆˆ1Ü$)¬#¨a°«)Ô$4Ó5Ñ$4˜q��Q‘˜“
Ð$4Ñ5Ð5ùÒ5s   §9é   é   c                 ó   — t        | |¬«      S ©N)Údelta)r   ©rì   rd  s     r(   ÚlllzDDM.lll�  s   € Ü�q Ô&Ð&r@   c                 ó   — t        | |¬«      S rc  )r   re  s     r(   Úlll_transformzDDM.lll_transform“  s   € Ü  ¨%Ô0Ð0r@   r"   )Urœ   Ú
__module__Ú__qualname__Ú__doc__ÚfmtÚis_DFMÚis_DDMr1   r?   rC   rI   rM   ÚclassmethodrP   rS   rV   r[   r^   rb   rZ   rg   rj   rs   ry   r|   r~   r�   rƒ   rk   rf   r   r‰   rŒ   r‘   r˜   r�   rŸ   r¡   r¤   r©   r¯   r2   r´   r»   r¿   rÃ   rÇ   rÊ   rÍ   rÔ   r·   r¾   rÁ   rÆ   rß   rÌ   rê   ró   rõ   rø   rý   rÿ   r  r	  r  r  r  r  r  r"  r'  r4  r;  rF  rH  rM  rR  rX  r[  r]  r_  r   rf  rh  Ú__classcell__)r;   s   @r(   r   r   f   s  ø„ ñð €CØ€FØ€Fôòòò3ò=ð ñ,ó ð,ð, ñó ðò(ò*ð2 ñ'ó ð'ò8)òò*ð@ ñAó ðAò2ð6 ñ'ó ð'ò8ð6 ñ'ó ð'ò6)ò.*ò2ò$<ñ.  g YÔ/ñ8ó 0ð8ñ.  g YÔ/ñó 0ðò4(ò+òGô
Gò
&ð ñ,ó ð,ð ñ+ó ð+ð ñ	ó ð	ò6ò4òò
ò
ò"ò"ò"ð ñ$ó ð$òòòòò
ò
ò)ò 1òD1òB1ò5ò ð( ñ1ó ð1ò$ò" ò 0ó.&ò`0òòò	ò1òf4òl(òTòò;òOòQò3ò6ñ ˜˜1“Xó 'ñ  " ! Q›x÷ 1r@   r   )ri   )rˆ   N)'rk  Ú	itertoolsr   Úsympy.external.gmpyr   Úsympy.utilities.decoratorr   Ú
exceptionsr   r   r	   r
   Úsympy.polys.domainsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rf  r   r   Ú__doctest_skip__r$   r   Úsdmri   Údfmrˆ   r=   r@   r(   Ú<module>ry     sk   ðñ>õ~ å ,Ý 8÷ó õ #÷
÷ 
÷ 
÷ 
÷" ,ð �7ÒØ$Ð&9Ð:Ðôn1ˆ$ô n1õb! Þ r@   