ó
    Š*£hj~  ã                   óâ   • S r SSKJr  SSKJr  SSKJr  SSKJrJ	r	J
r
Jr  SSKJr  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJr  SS	KJrJr  \S
:w  a  SS/r  " S S\!5      r"SSK#J$r$  SSK%J&r&  g)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                   ó¶  ^ • \ rS rSrSrSrSrSrU 4S jrS r	S r
S	 rS
 r\S 5       r\S 5       rS rS r\S 5       rS rS rS r\S 5       rS r\S 5       rS r\S 5       rS rS rS rS r\" S/S9S 5       r \" S/S9S 5       r!S  r"S! r#S" r$U 4S# jr%S$ r&\S% 5       r'\S& 5       r(\S' 5       r)S( r*S) r+S* r,S+ r-S, r.S- r/S. r0S/ r1\S0 5       r2S1 r3S2 r4S3 r5S4 r6S5 r7S6 r8S7 r9S8 r:S9 r;S: r<S; r=S< r>\S= 5       r?S> r@S? rAS@ rBSUSA jrCSB rDSC rESD rFSE rGSF rHSG rISH rJSI rKSJ rLSK rMSL rNSM rOSN rPSO rQ\R" SPSQ5      4SR jrS\R" SPSQ5      4SS jrTSTrUU =rV$ )VÚDDMéf   z�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                 ó„  >^• [        U[        5      (       a  [        S U 5       5      (       d  [        S5      eUu  nm[	        U5      U:w  d  [        U4S jU 5       5      (       a  [        S5      e[        TU ]  U Vs/ s H  oUR                  5       PM     sn5        UT4U l	        X@l
        TU l        X0l        g s  snf )Nc              3   óD   #   • U  H  n[        U5      [        L v •  M     g 7f©N)ÚtypeÚlist©Ú.0Úrows     ÚU/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/polys/matrices/ddm.pyÚ	<genexpr>ÚDDM.__init__.<locals>.<genexpr>r   s   é € Ð2YÒPXÈ´4¸³9ÄÕ3DÒPXùs   ‚ z rowslist must be a list of listsc              3   ó@   >#   • U  H  n[        U5      T:g  v •  M     g 7fr#   )Úlen)r'   r(   Úns     €r)   r*   r+   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Úrowslistr5   r8   ÚmÚir.   Ú	__class__s         @€r)   r3   ÚDDM.__init__q   sŸ   ù€ Ü˜8¤T×*Ñ*¬sÑ2YÑPXÓ2Y×/YÑ/YÜ!Ð"DÓEÐEØ‰ˆˆ1Üˆx‹=˜AÓ¤Ô$G¹hÓ$G×!GÑ!GÜ!Ð"?Ó@Ð@ä‰Ñ©HÓ5ªH qŸ&™&ž(©HÑ5Ô6Ø˜�VˆŒ
ØŒ	ØˆŒ	Ø�ùò	 6s   Â B=c                 ó   • X   U   $ r#   © )r9   r<   Újs      r)   ÚgetitemÚDDM.getitem~   s   € Ø‰w�q‰zÐó    c                 ó   • X0U   U'   g r#   r@   )r9   r<   rA   Úvalues       r)   ÚsetitemÚDDM.setitem�   s   € ØˆQ‰�Š
rD   c                 óð   • X    Vs/ s H  o3U   PM	     nn[        U5      nU(       a  [        US   5      O#[        [        U R                  S   5      U   5      n[        XEU4U R                  5      $ s  snf )Nr   r   )r-   Úranger5   r   r8   )r9   Úslice1Úslice2r(   Úddmr6   r7   s          r)   Úextract_sliceÚDDM.extract_slice„   se   € Ø&*¢lÓ3¢l˜s�6Œ{¡lˆÐ3Ü�3‹xˆÞ!Œs�3�q‘6Œ{¤s¬5°·±¸A±Ó+?ÀÑ+GÓ'HˆÜ�3˜t˜ d§k¡kÓ2Ð2ùò 4s   ‡A3c                 óÈ   • / nU H+  nX   nUR                  U Vs/ s H  oeU   PM	     sn5        M-     [        U[        U5      [        U5      4U R                  5      $ s  snf r#   )Úappendr   r-   r8   )r9   r6   r7   rM   r<   ÚrowirA   s          r)   ÚextractÚDDM.extractŠ   s\   € ØˆÛˆAØ‘7ˆDØ�J‰J©Ó.ª A˜Qœ©Ñ.Ö/ñ ô �3œ˜T›¤C¨£IÐ.°·±Ó<Ð<ùò /s   ›A
c                 ó   • U " XU5      $ )aH  
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@   )Úclsr:   r5   r8   s       r)   Ú	from_listÚDDM.from_list‘   s   € ñ* �8 FÓ+Ð+rD   c                 ó"   • UR                  5       $ r#   )r4   )rV   Úothers     r)   Úfrom_ddmÚDDM.from_ddm¨   s   € à�z‰z‹|ÐrD   c                 ó6   • U  Vs/ s H  oSS PM	     sn$ s  snf )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@   ©r9   r(   s     r)   Úto_listÚDDM.to_list¬   s   € ñ& #'Ó'¢$˜3‘A“¡$Ñ'Ð'ùÒ's   …c                 ó>   • / nU  H  nUR                  U5        M     U$ )aa  
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)r9   Úflatr(   s      r)   Úto_list_flatÚDDM.to_list_flatÁ   s$   € ð( ˆÛˆCØ�K‰K˜Öñ àˆrD   c                 óÐ   • [        U5      [        L d   eUu  pE[        U5      XE-  :X  d  [        S5      e[	        U5       Vs/ s H  oaXe-  US-   U-   PM     nnU " XrU5      $ s  snf )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   rJ   )rV   rd   r5   r8   r6   r7   r<   Úlols           r)   Úfrom_list_flatÚDDM.from_list_flatÚ   sp   € ô, �D‹zœTÒ!Ð!Ð!Ø‰
ˆÜ�D“	˜T™YÓ&Ü!Ð"@ÓAÐAÜ05°d´Ó<²¨1�A‘F˜A˜a™C ™:Ó&±ˆÐ<Ù�3˜vÓ&Ð&ùò =s   ÁA#c                 ó.   • [         R                  " U 5      $ r#   )r   Úfrom_iterable©r9   s    r)   ÚflatiterÚDDM.flatiter÷   s   € Ü×"Ò" 4Ó(Ð(rD   c                 ó>   • / nU  H  nUR                  U5        M     U$ r#   rb   )r9   Úitemsr(   s      r)   rd   ÚDDM.flatú   s"   € ØˆÛˆCØ�L‰L˜Öñ àˆrD   c                 ó>   • U R                  5       R                  5       $ )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_nzrm   s    r)   ru   ÚDDM.to_flat_nz   s   € ð< �{‰{‹}×'Ñ'Ó)Ð)rD   c                 óL   • [         R                  " XU5      R                  5       $ )a¾  
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)rV   ÚelementsÚdatar8   s       r)   ry   ÚDDM.from_flat_nz   s    € ô0 ×Ò °Ó7×>Ñ>Ó@Ð@rD   c                 ó¨   • 0 n[        U 5       H:  u  p#[        U5       VVs0 s H  u  pEU(       d  M  XE_M     nnnU(       d  M6  X1U'   M<     U$ s  snnf )ad  
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)r9   Údodr<   r(   rA   Úes         r)   Úto_dodÚ
DDM.to_dod:  sQ   € ð( ˆÜ –o‰FˆAÜ#,¨S¤>Ô7¢>™4˜1´Q“3�1’3¡>ˆCÑ7ßˆsØ�A“ñ &ð ˆ
ùó 8s
   ¡A²Ac                 óî   • Uu  pE[        U5       Vs/ s H  ocR                  /U-  PM     nnUR                  5        H%  u  p‰U	R                  5        H  u  p«X·U   U
'   M     M'     [        XrU5      $ s  snf )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
©rJ   Úzerorq   r   )rV   r�   r5   r8   r6   r7   Ú_rh   r<   r(   rA   Úelements               r)   Úfrom_dodÚDDM.from_dodU  so   € ð, ‰
ˆÜ-2°4¬[Ó9ª[¨—‘ˆ}˜tÔ#©[ˆÐ9Ø—i‘i–k‰FˆAØ!Ÿi™ižk‘
�Ø#�A‘�q“	ó *ñ "ô �3˜vÓ&Ð&ùò	 :s   ’A2c                 óv   • 0 n[        U 5       H'  u  p#[        U5       H  u  pEU(       d  M  XQX$4'   M     M)     U$ )aq  
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
r   )r9   Údokr<   r(   rA   r‰   s         r)   Úto_dokÚ
DDM.to_dokr  s>   € ð( ˆÜ –o‰FˆAÜ'¨žn‘
�ß�7Ø '˜˜“Ió -ñ &ð ˆ
rD   c                 óÂ   • Uu  pE[        U5       Vs/ s H  ocR                  /U-  PM     nnUR                  5        H  u  u  p‰n
X§U   U	'   M     [        XrU5      $ s  snf )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
r†   )rV   r�   r5   r8   r6   r7   rˆ   rh   r<   rA   r‰   s              r)   Úfrom_dokÚDDM.from_dok�  s_   € ð, ‰
ˆÜ-2°4¬[Ó9ª[¨—‘ˆ}˜tÔ#©[ˆÐ9Ø"Ÿy™yž{‰O‰FˆQ�GØ�‰F�1‹Iñ  +ä�3˜vÓ&Ð&ùò :s   ’Ac              #   óJ   #   • U  H  n[        SU5       Sh  v•N   M     g N	7f)aP  
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)Úfilterr^   s     r)   Úiter_valuesÚDDM.iter_values©  s$   é € ó( ˆCÜ˜d CÓ(×(Ò(ò Ù(ùs   ‚#—!˜
#c              #   ó|   #   • [        U 5       H)  u  p[        U5       H  u  p4U(       d  M  X4U4v •  M     M+     g7f)az  
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
Nr   )r9   r<   r(   rA   r‰   s        r)   Ú
iter_itemsÚDDM.iter_itemsÀ  s8   é € ô(   –o‰FˆAÜ'¨žn‘
�ß�7Ø˜& '˜/Ô)ó -ò &ùs   ‚&<¬<c                 ó   • U $ )a  
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@   rm   s    r)   rz   Ú
DDM.to_ddmÙ  s	   € ð  ˆrD   c                 óX   • [         R                  " X R                  U R                  5      $ )aL  
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
)rx   rW   r5   r8   rm   s    r)   rt   Ú
DDM.to_sdmë  s   € ô* �}Š}˜T§:¡:¨t¯{©{Ó;Ð;rD   r   )Úground_typesc                 óV   • [        [        U 5      U R                  U R                  5      $ )aL  
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%   r5   r8   rm   s    r)   Úto_dfmÚ
DDM.to_dfm  s   € ô, ”4˜“:˜tŸz™z¨4¯;©;Ó7Ð7rD   c                 óp   • [         R                  " U R                  5      (       a  U R                  5       $ U $ )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_domainr8   r¡   rm   s    r)   Úto_dfm_or_ddmÚDDM.to_dfm_or_ddm  s*   € ô. ×Ò §¡×,Ñ,Ø—;‘;“=Ð ØˆrD   c                 óê   • U R                   nX:X  a  U R                  5       $ U  VVs/ s H#  o3 Vs/ s H  oAR                  XB5      PM     snPM%     nnn[        XPR                  U5      $ s  snf s  snnf r#   )r8   r4   Úconvert_fromr   r5   )r9   ÚKÚKoldr(   r‚   r6   s         r)   Ú
convert_toÚDDM.convert_to5  s_   € Ø�{‰{ˆØ‹9Ø—9‘9“;ÐÙBFÔGÂ$¸3°#Ó6²#¨Q—‘ Ö(±#Ô6Á$ˆÑGÜ�4Ÿ™ QÓ'Ð'ùò 7ùÓGs   §	A/°A*Á
A/Á*A/c           
      ó˜   • U  Vs/ s H%  nSSR                  [        [        U5      5      -  PM'     nnSSR                  U5      -  $ s  snf )Nz[%s]ú, )ÚjoinÚmapÚstr)r9   r(   Úrowsstrs      r)   Ú__str__ÚDDM.__str__<  sD   € Ù@DÓEÂ¸�6˜DŸI™I¤c¬#¨s£mÓ4Ô4ÁˆÐEØ˜Ÿ	™	 'Ó*Ñ*Ð*ùò Fs   …,Ac                 ó¢   • [        U 5      R                  n[        R                  U 5      nU< SU< SU R                  < SU R
                  < S3$ )NÚ(r®   Ú))r$   Ú__name__r%   Ú__repr__r5   r8   )r9   rV   r6   s      r)   r¹   ÚDDM.__repr__@  s6   € Ü�4‹j×!Ñ!ˆÜ�}‰}˜TÓ"ˆÛ#&«¨d¯j¬j¸$¿+¼+ÐFÐFrD   c                 óŽ   >• [        U[        5      (       d  g[        TU ]  U5      =(       a    U R                  UR                  :H  $ )NF)r/   r   r2   Ú__eq__r8   )r9   rZ   r=   s     €r)   r¼   Ú
DDM.__eq__E  s4   ø€ Ü˜%¤×%Ñ%ØÜ‘‘˜uÓ%×E¨$¯+©+¸¿¹Ñ*EÐFrD   c                 ó.   • U R                  U5      (       + $ r#   )r¼   )r9   rZ   s     r)   Ú__ne__Ú
DDM.__ne__J  s   € Ø—;‘;˜uÓ%Ô%Ð%rD   c                 ó€   • UR                   nUu  pE[        U5       Vs/ s H  oc/U-  PM
     nn[        XqU5      $ s  snf r#   )r‡   rJ   r   )rV   r5   r8   Úzr;   r.   rˆ   r:   s           r)   ÚzerosÚ	DDM.zerosM  s@   € à�K‰KˆØ‰ˆÜ%*¨1¤XÓ.¢X �C˜!”G¡XˆÐ.Ü�8 FÓ+Ð+ùò /ó   ž;c                 ó€   • UR                   nUu  pE[        U5       Vs/ s H  oc/U-  PM
     nn[        XqU5      $ s  snf r#   )ÚonerJ   r   )rV   r5   r8   rÇ   r;   r.   rˆ   Úrowlists           r)   ÚonesÚDDM.onesT  s@   € à�j‰jˆØ‰ˆÜ&+¨A¤hÓ/¢h �5˜1”9¡hˆÐ/Ü�7 6Ó*Ð*ùò 0rÅ   c                 óî   • [        U[        5      (       a  Uu  p4O[        U[        5      (       a  U=p4UR                  nU R	                  WW4U5      n[        [        X45      5       H
  nXVU   U'   M     U$ r#   )r/   ÚtupleÚintrÇ   rÃ   rJ   Úmin)rV   Úsizer8   r;   r.   rÇ   rM   r<   s           r)   ÚeyeÚDDM.eye[  sl   € ä�dœE×"Ñ"Ø‰DˆAˆqÜ˜œc×"Ñ"ØˆLˆAØ�j‰jˆØ�i‰i˜˜A˜ Ó'ˆÜ”s˜1“yÖ!ˆAØ�‰F�1‹Iñ "àˆ
rD   c                 ót   • U  Vs/ s H  oS S  PM	     nn[        X R                  U R                  5      $ s  snf r#   )r   r5   r8   )r9   r(   Úcopyrowss      r)   r4   ÚDDM.copyg  s2   € Ù&*Ó+¢d˜s™“F¡dˆÐ+Ü�8ŸZ™Z¨¯©Ó5Ð5ùò ,s   …5c                 ó€   • U R                   u  pU(       a  [        U 5      nO/ /U-  n[        X2U4U R                  5      $ r#   )r5   r   r   r8   )r9   r6   r7   ÚddmTs       r)   Ú	transposeÚDDM.transposek  s:   € Ø—Z‘Z‰
ˆÞÜ  Ó&‰Dà�4˜$‘;ˆDÜ�4 ˜ t§{¡{Ó3Ð3rD   c                 óZ   • [        U[        5      (       d  [        $ U R                  U5      $ r#   )r/   r   ÚNotImplementedÚadd©ÚaÚbs     r)   Ú__add__ÚDDM.__add__s  ó"   € Ü˜!œS×!Ñ!Ü!Ð!Ø�u‰u�Q‹xˆrD   c                 óZ   • [        U[        5      (       d  [        $ U R                  U5      $ r#   )r/   r   rÚ   ÚsubrÜ   s     r)   Ú__sub__ÚDDM.__sub__x  rá   rD   c                 ó"   • U R                  5       $ r#   )Úneg©rÝ   s    r)   Ú__neg__ÚDDM.__neg__}  s   € Ø�u‰u‹wˆrD   c                 óN   • XR                   ;   a  U R                  U5      $ [        $ r#   ©r8   ÚmulrÚ   rÜ   s     r)   Ú__mul__ÚDDM.__mul__€  ó   € Ø—‘‹=Ø—5‘5˜“8ˆOä!Ð!rD   c                 óN   • XR                   ;   a  U R                  U5      $ [        $ r#   rì   rÜ   s     r)   Ú__rmul__ÚDDM.__rmul__†  rð   rD   c                 óZ   • [        U[        5      (       a  U R                  U5      $ [        $ r#   )r/   r   ÚmatmulrÚ   rÜ   s     r)   Ú
__matmul__ÚDDM.__matmul__Œ  s#   € Ü�aœ×ÑØ—8‘8˜A“;Ðä!Ð!rD   c                 óö   • UR                   UR                   :w  a-  SUR                   < SU< SUR                   < 3n[        U5      eXE:w  a-  SUR                  < SU< SUR                  < 3n[        U5      eg )NzDomain mismatch: Ú zShape mismatch: )r8   r   r5   r
   )rV   rÝ   ÚoprÞ   ÚashapeÚbshapeÚmsgs          r)   Ú_checkÚ
DDM._check’  s[   € à�8‰8�q—x‘xÔØ12·´»2¸q¿x»xÐHˆCÜ Ó$Ð$ØÔØ01·´»¸Q¿W»WÐEˆCÜ˜sÓ#Ð#ð rD   c                 óŒ   • U R                  U SXR                  UR                  5        U R                  5       n[        X!5        U$ )za + bÚ+)rþ   r5   r4   r   ©rÝ   rÞ   Úcs      r)   rÛ   ÚDDM.add›  ó3   € à	�‰��C˜ŸG™G Q§W¡WÔ-Ø�F‰F‹HˆÜ�ŒØˆrD   c                 óŒ   • U R                  U SXR                  UR                  5        U R                  5       n[        X!5        U$ )za - bÚ-)rþ   r5   r4   r   r  s      r)   rã   ÚDDM.sub¢  r  rD   c                 ó<   • U R                  5       n[        U5        U$ )z-a)r4   r   rÜ   s     r)   rç   ÚDDM.neg©  s   € à�F‰F‹HˆÜ�ŒØˆrD   c                 ó<   • U R                  5       n[        X!5        U$ r#   )r4   r   r  s      r)   rí   ÚDDM.mul¯  s   € Ø�F‰F‹HˆÜ�ŒØˆrD   c                 ó<   • U R                  5       n[        X!5        U$ r#   )r4   r   r  s      r)   ÚrmulÚDDM.rmul´  s   € Ø�F‰F‹HˆÜ�!ŒØˆrD   c                 ó¸   • U R                   u  p#UR                   u  pEU R                  U SXU5        U R                  X%4U R                  5      n[	        X`U5        U$ )za @ b (matrix product)Ú*)r5   rþ   rÃ   r8   r   )rÝ   rÞ   r;   ÚoÚo2r.   r  s          r)   rõ   Ú
DDM.matmul¹  sO   € à�w‰w‰ˆØ—‘‰ˆØ	�‰��C˜˜rÔ"Ø�G‰G�Q�F˜AŸH™HÓ%ˆÜ�A˜!ÔØˆrD   c                 óT  • U R                   UR                   :X  d   eU R                  UR                  :X  d   e[        X5       VVVVs/ s H'  u  p#[        X#5       VVs/ s H	  u  pEXE-  PM     snnPM)     nnnnn[        X`R                   U R                  5      $ s  snnf s  snnnnf r#   )r5   r8   Úzipr   )rÝ   rÞ   ÚaiÚbiÚaijÚbijr  s          r)   Úmul_elementwiseÚDDM.mul_elementwiseÂ  s|   € Ø�w‰w˜!Ÿ'™'Ó!Ð!Ð!Ø�x‰x˜1Ÿ8™8Ó#Ð#Ð#ÜCFÀqÄ9ÖMÂ9¹¸¬¨B¬Ô4ª™H˜CˆcŒi©Õ4Á9ˆÓMÜ�1—g‘g˜qŸx™xÓ(Ð(ùó 5ùÕMs   Á	B"
ÁBÁ/B"
ÂB"
c                 óN  • [        U R                  5       5      nU R                  u  p4U R                  nU HU  nUR                  u  pxXs:X  d   eUR                  U:X  d   eXH-  n[	        U5       H  u  pšX)   R                  U
5        M     MW     [        X#U4U R                  5      $ )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%   r4   r5   r8   r€   rc   r   )ÚAÚBÚAnewr6   r7   r8   ÚBkÚBkrowsÚBkcolsr<   ÚBkis              r)   ÚhstackÚ
DDM.hstackÈ  s”   € ô$ �A—F‘F“H‹~ˆØ—W‘W‰
ˆØ—‘ˆãˆBØŸX™X‰NˆFØ“>Ð!�>Ø—9‘9 Ó&Ð&Ð&à‰NˆDä# Bž-‘�Ø‘—‘˜sÖ#ó (ñ ô �4 ˜ q§x¡xÓ0Ð0rD   c                 ó>  • [        U R                  5       5      nU R                  u  p4U R                  nU HM  nUR                  u  pxX„:X  d   eUR                  U:X  d   eX7-  nUR	                  UR                  5       5        MO     [        X#U4U R                  5      $ )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%   r4   r5   r8   rc   r   )	r  r  r   r6   r7   r8   r!  r"  r#  s	            r)   ÚvstackÚ
DDM.vstackê  sˆ   € ô$ �A—F‘F“H‹~ˆØ—W‘W‰
ˆØ—‘ˆãˆBØŸX™X‰NˆFØ“>Ð!�>Ø—9‘9 Ó&Ð&Ð&à‰NˆDà�K‰K˜Ÿ™›	Ö"ñ ô �4 ˜ q§x¡xÓ0Ð0rD   c           	      ó€   • U  Vs/ s H  n[        [        X5      5      PM     nn[        X@R                  U5      $ s  snf r#   )r%   r°   r   r5   )r9   Úfuncr8   r(   r{   s        r)   Ú	applyfuncÚDDM.applyfunc  s5   € Ù48Ó9²D¨S”Dœ˜T›Ö(±DˆÐ9Ü�8ŸZ™Z¨Ó0Ð0ùò :s   …;c                 ó&   • [        S U  5       5      $ )zNumber of non-zero entries in :py:class:`~.DDM` matrix.

See Also
========

sympy.polys.matrices.domainmatrix.DomainMatrix.nnz
c              3   óT   #   • U  H  n[        [        [        U5      5      v •  M      g 7fr#   )Úsumr°   Úboolr&   s     r)   r*   ÚDDM.nnz.<locals>.<genexpr>  s   é € Ð4²!¨3”3”sœ4 “~×&Ð&²!ùs   ‚&()r0  rè   s    r)   ÚnnzÚDDM.nnz  s   € ô Ñ4±!Ó4Ó4Ð4rD   c                 ó>   • U R                  5       R                  5       $ )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

)rt   Úsccrè   s    r)   r6  ÚDDM.scc  s   € ð$ �x‰x‹z�~‰~ÓÐrD   c                 óJ   • [         R                  " X5      R                  5       $ )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
)rx   Údiagrz   )rV   Úvaluesr8   s      r)   r9  ÚDDM.diag-  s   € ô" �xŠx˜Ó'×.Ñ.Ó0Ð0rD   c                 ó�   • U R                  5       nU R                  nUR                  =(       d    UR                  n[	        XS9nX4$ )zê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)r4   r8   Úis_RealFieldÚis_ComplexFieldr   )rÝ   rÞ   r©   Úpartial_pivotÚpivotss        r)   ÚrrefÚDDM.rref@  s>   € ð �F‰F‹HˆØ�H‰HˆØŸ™×;¨!×*;Ñ*;ˆÜ˜1Ñ;ˆØˆyÐrD   c                 ó\   • U R                  5       nU R                  n[        X5      u  p4XU4$ )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.
)r4   r8   r   )rÝ   rÞ   r©   ÚdenomrA  s        r)   Úrref_denÚDDM.rref_denQ  s/   € ð �F‰F‹HˆØ�H‰HˆÜ% aÓ+‰ˆØ˜ÐÐrD   c                 óH   • U R                  5       u  pUR                  U5      $ )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
)rB  Únullspace_from_rref)rÝ   rB  rA  s      r)   Ú	nullspaceÚDDM.nullspacea  s"   € ð —v‘v“x‰ˆØ×'Ñ'¨Ó/Ð/rD   c                 ó¨  • U R                   u  p#U R                  nUcO  / nSn[        U5       H<  nX   n[        US-   U5       H"  nXx   (       d  M  UnUR                  U5          M:     M>     U(       d%  U R	                  X45      [        [        U5      5      4$ U S   US      n	/ n
/ n[        U5       H}  nXa;   a  M
  UR                  U5        [        U5       Vs/ s H  o†U:X  a  U	OUR                  PM     nn[        U5       H  u  pÞXÎ==   X   U   -  ss'   M     U
R                  U5        M     [        U
[        U
5      U4U5      nXû4$ s  snf )a  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   )
r5   r8   rJ   rQ   rÐ   r%   r‡   r€   r   r-   )rÝ   rA  r;   r.   r©   Ú
last_pivotr<   r  rA   Ú	pivot_valÚbasisÚ	nonpivotsÚvecÚiiÚjjÚ	basis_ddms                   r)   rI  ÚDDM.nullspace_from_rrefo  sH  € ð �w‰w‰ˆØ�H‰Hˆà‰>ØˆFØˆJÜ˜1–X�Ø‘T�Ü˜z¨!™|¨QÖ/�AØ—u‘uØ%&˜
ØŸ™ aÔ(Úó	 0ñ ö Ø—E‘E˜!“K¤¤e¨A£h£Ð0Ð0ð �a‘D˜ ™‘Oˆ	àˆØˆ	Ü�q–ˆAØ‹{ÙØ×Ñ˜QÔÜ<AÀ!¼HÓEºH°q Q£‘9¨A¯F©FÒ2¹HˆCÐEÜ# FÖ+‘�Ø“˜1™5 ™8Ñ#•ñ ,à�L‰L˜Öñ ô ˜¤ E£
¨A˜°Ó2ˆ	àÐ%Ð%ùò Fs   ÃEc                 óZ   • U R                  5       R                  5       R                  5       $ r#   )rt   Ú
particularrz   rè   s    r)   rX  ÚDDM.particularŸ  s    € Ø�x‰x‹z×$Ñ$Ó&×-Ñ-Ó/Ð/rD   c                 ó�   • U R                   u  pX:w  a  [        S5      eU R                  5       nUR                  n[	        X45      nU$ )zDeterminant of aú Determinant of non-square matrix)r5   r	   r4   r8   r   )rÝ   r;   r.   rÞ   r©   Údetas         r)   ÚdetÚDDM.det¢  s@   € à�w‰w‰ˆØ‹6Ü(Ð)KÓLÐLØ�F‰F‹HˆØ�H‰HˆÜ˜‹~ˆØˆrD   c                 ó’   • U R                   u  pX:w  a  [        S5      eU R                  5       nU R                  n[	        X0U5        U$ )zInverse of ar[  )r5   r	   r4   r8   r   )rÝ   r;   r.   Úainvr©   s        r)   ÚinvÚDDM.inv¬  sA   € à�w‰w‰ˆØ‹6Ü(Ð)KÓLÐLØ�v‰v‹xˆØ�H‰HˆÜ�˜!ÔØˆrD   c                 ó˜   • U R                   u  pU R                  nU R                  5       nU R                  X5      n[	        XTU5      nXTU4$ )zL, U decomposition of a)r5   r8   r4   rÐ   r   )rÝ   r;   r.   r©   ÚUÚLÚswapss          r)   ÚluÚDDM.lu¶  sD   € à�w‰w‰ˆØ�H‰Hˆà�F‰F‹HˆØ�E‰E�!‹KˆÜ˜a AÓ&ˆà�Uˆ{ÐrD   c                 óö  ^^^• U R                   u  pU R                  mU R                  5       m[        [	        U5      5      nSn[	        [        X5      5       GH  m[        UUU4S j[	        U5       5       5      (       a  M+  Sn[	        XA5       H  nTU   T   TR                  :w  d  M  Un  O   US:X  a  Ma  XT:w  a  TU   TU   sTU'   TU'   X5   X4   sX4'   X5'   TU   T   n[	        US-   U5       Hv  nTU   T   nUS:”  a  TUS-
     US-
     OTR                  n	[	        TS-   U5       H0  n
TR                  UTU   U
   -  TU   U
   U-  -
  U	5      TU   U
'   M2     UTU   T'   Mx     US-  nGM     TU4$ )zö
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   óN   >#   • U  H  nTU   T   TR                   :H  v •  M     g 7fr#   )r‡   )r'   r<   r©   ÚLUrA   s     €€€r)   r*   ÚDDM._fflu.<locals>.<genexpr>Ó  s"   øé € Ð;ª{¨!�2�a‘5˜‘8˜qŸv™vÖ%ª{ùó   ƒ"%rM  r   )
r5   r8   r4   r%   rJ   rÎ   r0   r‡   rÇ   Úexquo)r9   r6   r7   ÚpermÚrankÚ	pivot_rowr<   ÚpivotÚ
multiplierÚdenominatorÚkr©   rk  rA   s              @@@r)   Ú_ffluÚ	DDM._ffluÁ  sž  ú€ ð —Z‘Z‰
ˆØ�K‰Kˆà�Y‰Y‹[ˆÜ”E˜$“KÓ ˆØˆä”s˜4“×'ˆAäÖ;¬u°T¬{Ó;×;Ñ;Ùð ˆIÜ˜4Ö&�Ø�a‘5˜‘8˜qŸv™vÕ%Ø !�IÙñ 'ð ˜B‹Ùð Ó Ø*,¨Y©-¸¸D¹Ð'��4‘˜"˜Y™-Ø.2©o¸t¹zÐ+�‘
˜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ˆrD   c                 óð  • U R                   u  pU R                  nU R                  5       u  pEU R                  X4U5      n[	        U5       H  u  pxUR
                  Xg   U'   M     U R                  X4U5      n	S=pzXq:  ao  X¢:  aj  XG   U
   UR                  :w  aD  XG   U
   X—   U'   [        US-   U5       H   nXK   U
   X›   U'   UR                  XK   U
'   M"     US-  nU
S-  n
Xq:  a  X¢:  a  Mj  [        Xq5       H  nUR
                  X—   U'   M     U R                  X4U5      nUS:¼  a  U	S   S   US   S'   UR
                  n[        SU5       H  nX—S-
     US-
     X—   U   -  nXÜU   U'   M!     XiXÄ4$ )z¡
Fraction-free LU decomposition of DDM.

See Also
========

sympy.polys.matrices.domainmatrix.DomainMatrix.fflu
    The higher-level interface to this function.
r   r   )r5   r8   rv  rÃ   r€   rÇ   r‡   rJ   )r9   r6   r7   r©   rd  ro  ÚPr<   Úpire  rA   ÚlÚDÚdis                 r)   ÚffluÚDDM.ffluô  s”  € ð —Z‘Z‰
ˆØ�K‰Kˆð —*‘*“,‰ˆð �J‰J˜�| QÓ'ˆÜ˜t–_‰EˆAØ—u‘uˆA‰D�‹Hñ %ð �J‰J˜�| QÓ'ˆØˆ	ˆØ‹h˜1›8Ø‰t�A‰w˜!Ÿ&™&Ó ð ™$˜q™'�‘�Q‘Ü˜q 1™u dÖ+�Aà™d 1™g�A‘D˜‘GàŸf™f�A‘D˜“Gñ	 ,ð
 �Q‘�Ø�‰FˆAð ‹h˜1�8ô �q–ˆAØ—e‘eˆA‰D�‹Gñ  ð �J‰J˜�| QÓ'ˆØ�1‹9Ø˜‘d˜1‘gˆAˆa‰D�‰GØ�U‰UˆÜ�q˜$–ˆAà�q‘5‘˜!˜a™%‘ 1¡4¨¡7Ñ*ˆBØˆa‰D�‹Gñ  ð
 �QˆzÐrD   c           	      ó¼  ^	^
^• U R                   u  mnU R                  m	U R                  5       m
U R                  [	        TU5      U4T	5      nT	R
                  (       d  [        S5      eU	U
U4S jn[        U5       H¬  n[        [	        UT5      5       H]  nU" XU5      nUT	R                  :w  d  M  U" XT5      U-  X%   U'   [        T5       H!  nT
U   U==   X%   U   T
U   U   -  -  ss'   M#     M_     UT:  d  M�  U" XD5      nUT	R                  :w  d  M›  T	R                  X$   U'   M®     T
R                  [        T5      [        [	        TU5      5      5      m
T
U4$ )zì
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                 óT   >^ ^• TR                  UU U4S j[        T5       5       5      $ )Nc              3   óF   >#   • U  H  nTU   T   TU   T   -  v •  M     g 7fr#   r@   )r'   ru  ÚQr<   rA   s     €€€r)   r*   Ú+DDM.qr.<locals>.<lambda>.<locals>.<genexpr>A  s&   øé € Ð%MÂ¸A a¨¡d¨1¡g°°!±°Q±Ö&7Âùs   ƒ!)r0  rJ   )r<   rA   r©   rƒ  r6   s   ``€€€r)   Ú<lambda>ÚDDM.qr.<locals>.<lambda>A  s   ú€  §¡Ö%MÄÀtÄÓ%MÔ MrD   )r5   r8   r4   rÃ   rÎ   Úis_Fieldr   rJ   r‡   rÇ   rS   )r9   r7   ÚRÚdot_colsrA   r<   Údot_iiru  Údot_jjr©   rƒ  r6   s            @@@r)   ÚqrÚDDM.qr*  s1  ú€ ð —Z‘Z‰
ˆˆdØ�K‰KˆØ�I‰I‹KˆØ�J‰Jœ˜D $›¨Ð.°Ó2ˆð �z�zÜÐ NÓOÐOæMˆä�t–ˆAÜœ3˜q $›<Ö(�Ù! !›�Ø˜QŸV™VÕ#Ù& q›n¨vÑ5�A‘D˜‘GÜ" 4ž[˜Ø˜!™˜Q› 1¡4¨¡7¨Q¨q©T°!©WÑ#4Ñ4�ó )ñ	 )ð �4�xÙ! !›�Ø˜QŸV™VÕ#ØŸe™e�A‘D˜“Gñ ð �I‰I”e˜D“k¤5¬¨T°4«Ó#9Ó:ˆà�!ˆtˆrD   c                 ó,  • U R                   u  p#UR                   u  pEU R                  U SXU5        U R                  R                  (       d  [	        S5      eU R                  5       u  pgnU R                  X54U R                  5      n	[        X–XxU5        U	$ )zx where a*x = bÚlu_solvezlu_solve requires a field)r5   rþ   r8   r‡  r   rg  rÃ   r   )
rÝ   rÞ   r;   r.   Úm2r  re  rd  rf  Úxs
             r)   r�  ÚDDM.lu_solveT  sy   € à�w‰w‰ˆØ—‘‰ˆØ	�‰��J  bÔ)Ø�x‰x× × ÜÐ ;Ó<Ð<à—d‘d“f‰ˆˆeØ�G‰G�Q�F˜AŸH™HÓ%ˆÜ�a˜A aÔ(ØˆrD   c                 óÀ   • U R                   nU R                  u  p#X#:w  a  [        S5      e[        X5      n[	        US-   5       Vs/ s H
  oTU   S   PM     nnU$ s  snf )z.Coefficients of characteristic polynomial of azCharpoly of non-square matrixr   r   )r8   r5   r	   r   rJ   )rÝ   r©   r;   r.   rR  r<   Úcoeffss          r)   ÚcharpolyÚDDM.charpolya  s\   € à�H‰HˆØ�w‰w‰ˆØ‹6Ü(Ð)HÓIÐIÜ�q‹nˆÜ%*¨1¨Q©3¤ZÓ0¢Z �a‘&˜”)¡ZˆÐ0Øˆùò 1s   ÁAc                 óv   ^• U R                   R                  m[        U4S jU R                  5        5       5      $ )z0
Says whether this matrix has all zero entries.
c              3   ó,   >#   • U  H	  oT:H  v •  M     g 7fr#   r@   )r'   ÚMijr‡   s     €r)   r*   Ú%DDM.is_zero_matrix.<locals>.<genexpr>p  s   øé € Ð:ª/ 3˜$–;ª/ùs   ƒ)r8   r‡   r0   rn   ©r9   r‡   s    @r)   Úis_zero_matrixÚDDM.is_zero_matrixk  s+   ø€ ð �{‰{×ÑˆÜÔ:¨$¯-©-¬/Ó:Ó:Ð:rD   c                 ól   ^• U R                   R                  m[        U4S j[        U 5       5       5      $ )zf
Says whether this matrix is upper-triangular. True can be returned
even if the matrix is not square.
c              3   óJ   >#   • U  H  u  pUS U   H	  o3T:H  v •  M     M     g 7fr#   r@   ©r'   r<   ÚMir™  r‡   s       €r)   r*   ÚDDM.is_upper.<locals>.<genexpr>x  s#   øé € ÐNªO¡5 1ÀrÈ"È1ÄvÀ˜$–;Áv‘;ªOùs   ƒ #©r8   r‡   r0   r€   r›  s    @r)   Úis_upperÚDDM.is_upperr  s)   ø€ ð
 �{‰{×ÑˆÜÔN¬I°d¬OÓNÓNÐNrD   c                 ól   ^• U R                   R                  m[        U4S j[        U 5       5       5      $ )zf
Says whether this matrix is lower-triangular. True can be returned
even if the matrix is not square.
c              3   óN   >#   • U  H  u  pX!S -   S   H	  o3T:H  v •  M     M     g7f)r   Nr@   r   s       €r)   r*   ÚDDM.is_lower.<locals>.<genexpr>€  s%   øé € ÐPªO¡5 1ÀrÈAÉ#È$ÄxÀ˜$–;Áx‘;ªOùrm  r£  r›  s    @r)   Úis_lowerÚDDM.is_lowerz  s)   ø€ ð
 �{‰{×ÑˆÜÔP¬I°d¬OÓPÓPÐPrD   c                 óP   • U R                  5       =(       a    U R                  5       $ )z^
Says whether this matrix is diagonal. True can be returned even if
the matrix is not square.
)r¤  r©  rm   s    r)   Úis_diagonalÚDDM.is_diagonal‚  s   € ð
 �}‰}‹×2 4§=¡=£?Ð2rD   c                 ó|   • U R                   u  p[        [        X5      5       Vs/ s H
  o0U   U   PM     sn$ s  snf )zA
Returns a list of the elements from the diagonal of the matrix.
)r5   rJ   rÎ   )r9   r;   r.   r<   s       r)   ÚdiagonalÚDDM.diagonal‰  s8   € ð �z‰z‰ˆÜ$)¬#¨a«)Ô$4Ó5Ò$4˜q�Q‘˜”
Ñ$4Ñ5Ð5ùÒ5s   ¥9é   é   c                 ó   • [        XS9$ ©N)Údelta)r   ©r  rµ  s     r)   ÚlllÚDDM.lll�  s   € Ü�qÑ&Ð&rD   c                 ó   • [        XS9$ r´  )r   r¶  s     r)   Úlll_transformÚDDM.lll_transform“  s   € Ü  Ñ0Ð0rD   )r7   r8   r6   r5   r#   )Wr¸   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚfmtÚis_DFMÚis_DDMr3   rB   rG   rN   rS   ÚclassmethodrW   r[   r_   re   ri   rn   rd   ru   ry   rƒ   rŠ   rŽ   r‘   r•   r˜   rz   rt   r   r¡   r¥   r«   r³   r¹   r¼   r¿   rÃ   rÉ   rÐ   r4   r×   rß   rä   ré   rî   rò   rö   rþ   rÛ   rã   rç   rí   r  rõ   r  r%  r(  r,  r3  r6  r9  rB  rF  rJ  rI  rX  r]  ra  rg  rv  r~  rŒ  r�  r•  rœ  r¤  r©  r¬  r¯  r   r·  rº  Ú__static_attributes__Ú__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÷ 1ò 1rD   r   )rx   )r    N)'r¿  Ú	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   r·  r   r   Ú__doctest_skip__r%   r   Úsdmrx   Údfmr    r@   rD   r)   Ú<module>rÎ     sk   ðñ>õ~ å ,Ý 8÷ó õ #÷
÷ 
÷ 
÷ 
÷" ,ð �7ÓØ$Ð&9Ð:Ðôn1ˆ$ô n1õb! Þ rD   