ó
    Š*£h¬<  ã                   óÊ   • S SK Jr  S SKJrJrJr  S SKJr  S SKJ	r	J
r
  SS.S jrSSS	.S
 jrS rS rS rS rS rS rS rSS.S jrSS.S jrSS.S jrS rS rS rS rg)é    )ÚZZ)ÚSDMÚ	sdm_irrefÚsdm_rref_den)ÚDDM)Ú	ddm_irrefÚddm_irref_denÚauto)Úmethodc                ó\  • [        XSS9u  p[        X5      u  pUS:X  a  [        U 5      n[        U5      u  pVOeUS:X  a  [	        U 5      u  pxn[        U5      U-  nOBUS:X  a.  U R                  SS9u  pš[	        U
5      u  pxn[        U5      U-  nO[        SU 35      e[        XS5      u  pYXV4$ )	aZ  
Compute the reduced row echelon form of a ``DomainMatrix``.

This function is the implementation of :meth:`DomainMatrix.rref`.

Chooses the best algorithm depending on the domain, shape, and sparsity of
the matrix as well as things like the bit count in the case of :ref:`ZZ` or
:ref:`QQ`. The result is returned over the field associated with the domain
of the Matrix.

See Also
========

sympy.polys.matrices.domainmatrix.DomainMatrix.rref
    The ``DomainMatrix`` method that calls this function.
sympy.polys.matrices.rref._dm_rref_den
    Alternative function for computing RREF with denominator.
F©ÚdenominatorÚGJÚFFÚCDT©ÚconvertúUnknown method for rref: )Ú_dm_rref_choose_methodÚ
_dm_to_fmtÚ	_to_fieldÚ_dm_rref_GJÚ_dm_rref_den_FFÚclear_denoms_rowwiseÚ
ValueError)ÚMr   Úuse_fmtÚold_fmtÚMfÚM_rrefÚpivotsÚM_rref_fÚdenÚ_ÚMrs              ÚV/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/polys/matrices/rref.pyÚ_dm_rrefr'   %   sÅ   € ô& -¨QÀEÑJ�O€Fä˜AÓ'�J€Aà�ƒ~ä�q‹\ˆÜ$ R›‰ˆ�à	�4‹ä /°Ó 2Ñˆ�vÜ˜8Ó$ sÑ*‰à	�4‹à×&Ñ&¨tÐ&Ð4‰ˆÜ /°Ó 3Ñˆ�vÜ˜8Ó$ sÑ*‰ô Ð4°V°HÐ=Ó>Ð>ä˜6Ó+�I€Fð ˆ>Ðó    T)Úkeep_domainr   c                ó  • [        XSS9u  p#[        X5      u  pUS:X  a  [        U 5      u  pVnGOHUS:X  a”  [        [	        U 5      5      u  p‡U(       a^  UR
                  U R
                  :w  aD  UR                  SS9u  p•U(       a  USUS   4   R                  nOÞUR
                  R                  nOÇUnUR
                  R                  nO®US:X  aš  U R                  SS9u  pš[        U
5      u  p¶nU(       a?  UR
                  U R
                  :w  a%  [	        U5      U-  nU R
                  R                  nOCUnU(       a  USUS   4   R                  nO%UR
                  R                  nO[        SU 35      e[        XT5      u  pYXVU4$ )	aÊ  
Compute the reduced row echelon form of a ``DomainMatrix`` with denominator.

This function is the implementation of :meth:`DomainMatrix.rref_den`.

Chooses the best algorithm depending on the domain, shape, and sparsity of
the matrix as well as things like the bit count in the case of :ref:`ZZ` or
:ref:`QQ`. The result is returned over the same domain as the input matrix
unless ``keep_domain=False`` in which case the result might be over an
associated ring or field domain.

See Also
========

sympy.polys.matrices.domainmatrix.DomainMatrix.rref_den
    The ``DomainMatrix`` method that calls this function.
sympy.polys.matrices.rref._dm_rref
    Alternative function for computing RREF without denominator.
Tr   r   r   r   r   r   r   )r   r   r   r   r   ÚdomainÚclear_denomsÚelementÚoner   r   )r   r)   r   r   r   r    r#   r!   r"   r$   r%   ÚM_rref_rs               r&   Ú_dm_rref_denr0   Y   sk  € ô( -¨QÀDÑI�O€Fä˜AÓ'�J€Aà�ƒ~ä-¨aÓ0Ñˆ’Và	�4‹ä&¤y°£|Ó4Ñˆö ˜8Ÿ?™?¨a¯h©hÓ6Ø ×-Ñ-°dÐ-Ð;‰IˆAæØ˜Q  q¡	˜\Ñ*×2Ñ2‘à—m‘m×'Ñ'‘ð ˆFØ—-‘-×#Ñ#‰Cà	�4‹à×&Ñ&¨tÐ&Ð4‰ˆä /°Ó 3Ñˆ�væ˜8Ÿ?™?¨a¯h©hÓ6ä˜xÓ(¨3Ñ.ˆFØ—(‘(—,‘,‰Cð ˆFæØ˜Q  q¡	˜\Ñ*×2Ñ2‘à—m‘m×'Ñ'‘äÐ4°V°HÐ=Ó>Ð>ä˜6Ó+�I€Fð ˜ÐÐr(   c                 óÀ   • U R                   R                  nX!:X  a   X4$ US:X  a  U R                  5       n X4$ US:X  a  U R                  5       n X4$ [	        SU 35      e)z?Convert a matrix to the given format and return the old format.ÚdenseÚsparsezUnknown format: )ÚrepÚfmtÚto_denseÚ	to_sparser   )r   r5   r   s      r&   r   r   §   sr   € à�e‰e�i‰i€GØƒ~Øð ˆ:Ðð 
�‹Ø�J‰J‹Lˆð
 ˆ:Ðð	 
�‹Ø�K‰K‹Mˆð ˆ:Ðô Ð+¨C¨5Ð1Ó2Ð2r(   c                 ób   • U R                   R                  S:X  a  [        U 5      $ [        U 5      $ )z:Compute RREF using Gauss-Jordan elimination with division.r3   )r4   r5   Ú_dm_rref_GJ_sparseÚ_dm_rref_GJ_dense©r   s    r&   r   r   ¸   s(   € à‡u�u‡y�y�HÓÜ! !Ó$Ð$ä  Ó#Ð#r(   c                 ób   • U R                   R                  S:X  a  [        U 5      $ [        U 5      $ )z:Compute RREF using fraction-free Gauss-Jordan elimination.r3   )r4   r5   Ú_dm_rref_den_FF_sparseÚ_dm_rref_den_FF_denser;   s    r&   r   r   À   s(   € à‡u�u‡y�y�HÓÜ% aÓ(Ð(ä$ QÓ'Ð'r(   c                 ó®   • [        U R                  5      u  pn[        XR                  U R                  5      n[        U5      nU R                  U5      U4$ )zACompute RREF using sparse Gauss-Jordan elimination with division.)r   r4   r   Úshaper+   ÚtupleÚfrom_rep)r   ÚM_rref_dr!   r$   Ú
M_rref_sdms        r&   r9   r9   È   sF   € ä# A§E¡EÓ*Ñ€H�aÜ�XŸw™w¨¯©Ó1€JÜ�6‹]€FØ�:‰:�jÓ! 6Ð)Ð)r(   c                 ób  • U R                   R                  =(       d    U R                   R                  nU R                  R	                  5       R                  5       n[        X!S9n[        X R                  U R                   5      n[        U5      nU R                  UR                  5       5      U4$ )z@Compute RREF using dense Gauss-Jordan elimination with division.)Ú_partial_pivot)r+   Úis_RRÚis_CCr4   Úto_ddmÚcopyr   r   r@   rA   rB   Úto_dfm_or_ddm)r   Úpartial_pivotÚddmr!   Ú
M_rref_ddms        r&   r:   r:   Ð   sx   € à—H‘H—N‘N×4 a§h¡h§n¡n€MØ
�%‰%�,‰,‹.×
Ñ
Ó
€CÜ�sÑ9€FÜ�SŸ'™' 1§8¡8Ó,€JÜ�6‹]€FØ�:‰:�j×.Ñ.Ó0Ó1°6Ð9Ð9r(   c                 óÄ   • [        U R                  U R                  5      u  pn[        XR                  U R                  5      n[        U5      nU R                  U5      X#4$ ©zACompute RREF using sparse fraction-free Gauss-Jordan elimination.)r   r4   r+   r   r@   rA   rB   )r   rC   r#   r!   rD   s        r&   r=   r=   Ú   sL   € ä(¨¯©°·±Ó9Ñ€H�6Ü�XŸw™w¨¯©Ó1€JÜ�6‹]€FØ�:‰:�jÓ! 3Ð.Ð.r(   c                 ó  • U R                   R                  5       R                  5       n[        XR                  5      u  p#[        XR                  U R                  5      n[        U5      nU R                  UR                  5       5      X#4$ rP   )
r4   rI   rJ   r	   r+   r   r@   rA   rB   rK   )r   rM   r#   r!   rN   s        r&   r>   r>   â   sd   € à
�%‰%�,‰,‹.×
Ñ
Ó
€CÜ §X¡XÓ.�K€CÜ�SŸ'™' 1§8¡8Ó,€JÜ�6‹]€FØ�:‰:�j×.Ñ.Ó0Ó1°3Ð>Ð>r(   Fr   c                óä  • US:w  a0  UR                  S5      (       a  US[        S5      *  nSnX4$ Sn X4$ SnU R                  nUR                  (       a  [	        XS9nX4$ UR
                  (       a  [        XS9nX4$ UR                  (       d  UR                  (       a  SnSnX4$ UR                  (       a(  U R                  R                  S:X  a  U(       d  SnSnX4$ U(       a  SnX4$ SnX4$ )	z3Choose the fastest method for computing RREF for M.r
   Ú_denseNr2   r3   r   r   r   )ÚendswithÚlenr+   Úis_ZZÚ_dm_rref_choose_method_ZZÚis_QQÚ_dm_rref_choose_method_QQrG   rH   Úis_EXr4   r5   )r   r   r   r   ÚKs        r&   r   r   ë   s  € ð �ÓØ�?‰?˜8×$Ñ$Ø˜Oœc (›m˜^Ð,ˆFØˆGðJ ˆ?ÐðG ‰GðF ˆ?Ðð? ˆà�H‰Hˆà�7�7Ü.¨qÑJˆFð4 ˆ?Ðð3 �W�WÜ.¨qÑJˆFð0 ˆ?Ðð/ �W�W˜ŸŸàˆFØˆGð( ˆ?Ðð' �W�W˜Ÿ™Ÿ™ gÓ-¶kð ˆFØˆGð ˆ?Ðö Ø�ð ˆ?Ðð �àˆ?Ðr(   c                óv  • [        U 5      u  p#nU[        SUS-  5      :  a  g[        U 5      u  pV[        U Vs/ s H  owR	                  5       PM     snSS9n[
        R                  n	U H2  n
[
        R                  " Xš5      n	U	R	                  5       SU-  :”  d  M2    g   U	R	                  5       S:  a  ggs  snf )	z5Choose the fastest method for computing RREF over QQ.é   é   r   é   ©Údefaulté2   r   r   )Ú_dm_row_densityÚminÚ_dm_QQ_numers_denomsÚmaxÚ
bit_lengthr   r.   Úlcm)r   r   Údensityr$   ÚncolsÚnumersÚdenomsÚnÚ
numer_bitsÚ	denom_lcmÚds              r&   rY   rY     s®   € ô (¨Ó*Ñ€G�ð ”�Q˜˜a™“Ó Øô *¨!Ó,�N€FÜ©fÓ5ªf¨—l‘l–n©fÑ5¸qÑA€Jä—‘€IÛˆÜ—F’F˜9Ó(ˆ	Ø×ÑÓ! A j¡LÕ0Ùñ ð ×ÑÓ Ó"Øàùò) 6s   ¹B6c                ó*  • Sn[        U 5      u  p4nUS:  a
  X5S-  :  a  ggUS:  a  gUSX$-  -   :”  a  g[        U 5      n[        U Vs/ s H  owR                  5       PM     snSS9n[        SS	U-  U-  5      n	SX$US-  -  -  -   U	-  n
X::  a  ggs  snf )
z5Choose the fastest method for computing RREF over ZZ.i'  é
   r^   r   r   r]   r_   r`   gUUUUUUå?)rc   Ú_dm_elementsrf   rg   )r   r   ÚPARAMri   Únrows_nzrj   ÚelementsÚeÚbitsÚwidenessÚmax_densitys              r&   rW   rW   F  s¾   € ð$ €Eô
  /¨qÓ1Ñ€G�uð �"ƒ}Ø˜1‘WÓØàð �ƒ{ØØ	�1�u‘~Ñ%Ó	%Øô ˜A‹€HÜ©Ó1ª 1—‘–©Ñ1¸1Ñ=€Dô �1�c˜%‘i Ñ(Ó)€Hà�u t¨Q¡wÑ.Ñ/Ñ/°8Ñ;€KàÓØàùò 2s   ÁBc                 óÞ   • U R                   S   nU R                  R                  5       R                  5       nU(       d  SSU4$ [	        U5      n[        [        [        U5      5      U-  nXCU4$ )a¨  Density measure for sparse matrices.

Defines the "density", ``d`` as the average number of non-zero entries per
row except ignoring rows that are fully zero. RREF can ignore fully zero
rows so they are excluded. By definition ``d >= 1`` except that we define
``d = 0`` for the zero matrix.

Returns ``(density, nrows_nz, ncols)`` where ``nrows_nz`` counts the number
of nonzero rows and ``ncols`` is the number of columns.
r_   r   )r@   r4   Úto_sdmÚvaluesrU   ÚsumÚmap)r   rj   Úrows_nzru   ri   s        r&   rc   rc   |  sb   € ð �G‰G�A‰J€EØ�e‰e�l‰l‹n×#Ñ#Ó%€GÞØ�!�Uˆ{Ðä�w“<ˆÜ”cœ#˜wÓ'Ó(¨8Ñ3ˆØ %Ð'Ð'r(   c                 ó*   • U R                  5       u  pU$ )z*Return nonzero elements of a DomainMatrix.)Ú
to_flat_nz)r   rv   r$   s      r&   rs   rs   ’  s   € à—,‘,“.�K€HØ€Or(   c                 óž   • [        U 5      nU Vs/ s H  o"R                  PM     nnU Vs/ s H  o"R                  PM     nnX44$ s  snf s  snf )zBReturns the numerators and denominators of a DomainMatrix over QQ.)rs   Ú	numeratorr   )ÚMqrv   rw   rk   rl   s        r&   re   re   ˜  sH   € ä˜BÓ€HÙ#+Ó,¢8˜a�kŒk¡8€FÐ,Ù%-Ó.¢X �mŒm¡X€FÐ.Øˆ>Ðùò -ùÚ.s
   �A«A
c                 ó`   • U R                   nUR                  (       a  U R                  5       $ U $ )z.Convert a DomainMatrix to a field if possible.)r+   Úhas_assoc_FieldÚto_field)r   r[   s     r&   r   r      s%   € à	�‰€AØ××Ø�z‰z‹|Ðàˆr(   N)Úsympy.polys.domainsr   Úsympy.polys.matrices.sdmr   r   r   Úsympy.polys.matrices.ddmr   Úsympy.polys.matrices.denser   r	   r'   r0   r   r   r   r9   r:   r=   r>   r   rY   rW   rc   rs   re   r   © r(   r&   Ú<module>rŽ      s‡   ðõ< #ç AÑ AÝ (ß ?ð !õ 1ðh $(°õ Kò\ò"$ò(ò*ò:ò/ò?ð 6;õ +ð\ 16õ *ðZ 16õ 3òl(ò,òór(   