§
    OŠtj¬<  ã                   óÂ   — d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	m
Z
 ddœd„Zddd	œd
„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zddœd„Zddœd„Zddœd„Zd„ Zd„ Zd„ Zd„ ZdS )é    )ÚZZ)ÚSDMÚ	sdm_irrefÚsdm_rref_den)ÚDDM)Ú	ddm_irrefÚddm_irref_denÚauto)Úmethodc                óÖ  — t          | |d¬¦  «        \  }}t          | |¦  «        \  } }|dk    r"t          | ¦  «        }t          |¦  «        \  }}nƒ|dk    r&t	          | ¦  «        \  }}}t          |¦  «        |z  }nW|dk    r?|                      d¬¦  «        \  }	}
t	          |
¦  «        \  }}}t          |¦  «        |z  }nt          d|› �¦  «        ‚t          ||¦  «        \  }}	||fS )	aŽ  
    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              úW/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/polys/matrices/rref.pyÚ_dm_rrefr'   %   s  € õ& -¨Q°ÀEÐJÑJÔJ�O€FˆGå˜A˜wÑ'Ô'�J€A€wà�‚~€~å�q‰\Œ\ˆÝ$ R™œ‰ˆ��à	�4Šˆå /°Ñ 2Ô 2Ñˆ�#�vÝ˜8Ñ$Ô$ sÑ*ˆˆà	�4Šˆà×&Ò&¨tÐ&Ñ4Ô4‰ˆˆ2Ý /°Ñ 3Ô 3Ñˆ�#�vÝ˜8Ñ$Ô$ sÑ*ˆˆõ Ð=°VÐ=Ð=Ñ>Ô>Ð>å˜6 7Ñ+Ô+�I€FˆAð �6ˆ>Ðó    T)Úkeep_domainr   c                óø  — t          | |d¬¦  «        \  }}t          | |¦  «        \  } }|dk    rt          | ¦  «        \  }}}�n |dk    r~t          t	          | ¦  «        ¦  «        \  }}|rN|j        | j        k    r>|                     d¬¦  «        \  }	}|r|d|d         f         j        }n¸|j        j        }n«|}|j        j        }nœ|dk    r„|  	                    d¬¦  «        \  }	}
t          |
¦  «        \  }}}|r/|j        | j        k    rt	          |¦  «        |z  }| j        j        }n9|}|r|d|d         f         j        }n|j        j        }nt          d|› �¦  «        ‚t          ||¦  «        \  }}	|||fS )	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   s´  € õ( -¨Q°ÀDÐIÑIÔI�O€FˆGå˜A˜wÑ'Ô'�J€A€wà�‚~€~å-¨aÑ0Ô0Ñˆ��V‘Và	�4Šˆå&¥y°¡|¤|Ñ4Ô4Ñˆ�&ð ð 
	$˜8œ?¨a¬hÒ6Ð6Ø ×-Ò-°dÐ-Ñ;Ô;‰IˆAˆvàð (Ø˜Q  q¤	˜\Ô*Ô2��à”mÔ'��ð ˆFØ”-Ô#ˆCˆCà	�4Šˆà×&Ò&¨tÐ&Ñ4Ô4‰ˆˆ2å /°Ñ 3Ô 3Ñˆ�#�vàð 	(˜8œ?¨a¬hÒ6Ð6å˜xÑ(Ô(¨3Ñ.ˆFØ”(”,ˆCˆCð ˆFàð (Ø˜Q  q¤	˜\Ô*Ô2��à”mÔ'��åÐ=°VÐ=Ð=Ñ>Ô>Ð>å˜6 7Ñ+Ô+�I€FˆAð �3˜ÐÐr(   c                 óÀ   — | j         j        }||k    rnH|dk    r|                      ¦   «         } n-|dk    r|                      ¦   «         } nt	          d|› �¦  «        ‚| |fS )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   §   sh   € àŒeŒi€GØ�#‚~€~ØØ	�ŠˆØ�JŠJ‰LŒLˆˆØ	�ŠˆØ�KŠK‰MŒMˆˆåÐ1¨CÐ1Ð1Ñ2Ô2Ð2Øˆgˆ:Ðr(   c                 ó^   — | j         j        dk    rt          | ¦  «        S t          | ¦  «        S )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„y�HÒÐÝ! !Ñ$Ô$Ð$å  Ñ#Ô#Ð#r(   c                 ó^   — | j         j        dk    rt          | ¦  «        S t          | ¦  «        S )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„y�HÒÐÝ% aÑ(Ô(Ð(å$ QÑ'Ô'Ð'r(   c                 ó´   — t          | j        ¦  «        \  }}}t          || j        | j        ¦  «        }t          |¦  «        }|                      |¦  «        |fS )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   È   sO   € å# A¤EÑ*Ô*Ñ€Hˆf�aÝ�X˜qœw¨¬Ñ1Ô1€JÝ�6‰]Œ]€FØ�:Š:�jÑ!Ô! 6Ð)Ð)r(   c                 óP  — | j         j        p| j         j        }| j                             ¦   «                              ¦   «         }t          ||¬¦  «        }t          || j        | j         ¦  «        }t          |¦  «        }|  
                    |                     ¦   «         ¦  «        |fS )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:   Ð   s„   € à”H”NÐ4 a¤h¤n€MØ
Œ%�,Š,‰.Œ.×
Ò
Ñ
Ô
€CÝ�s¨=Ð9Ñ9Ô9€FÝ�S˜!œ' 1¤8Ñ,Ô,€JÝ�6‰]Œ]€FØ�:Š:�j×.Ò.Ñ0Ô0Ñ1Ô1°6Ð9Ð9r(   c                 óÂ   — t          | j        | j        ¦  «        \  }}}t          || j        | j        ¦  «        }t          |¦  «        }|                      |¦  «        ||fS ©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=   Ú   sU   € å(¨¬°´Ñ9Ô9Ñ€Hˆc�6Ý�X˜qœw¨¬Ñ1Ô1€JÝ�6‰]Œ]€FØ�:Š:�jÑ!Ô! 3¨Ð.Ð.r(   c                 ó0  — | j                              ¦   «                              ¦   «         }t          || j        ¦  «        \  }}t          || j        | j        ¦  «        }t          |¦  «        }|                      | 	                    ¦   «         ¦  «        ||fS rP   )
r4   rI   rJ   r	   r+   r   r@   rA   rB   rK   )r   rM   r#   r!   rN   s        r&   r>   r>   â   sw   € à
Œ%�,Š,‰.Œ.×
Ò
Ñ
Ô
€CÝ  Q¤XÑ.Ô.�K€CˆÝ�S˜!œ' 1¤8Ñ,Ô,€JÝ�6‰]Œ]€FØ�:Š:�j×.Ò.Ñ0Ô0Ñ1Ô1°3¸Ð>Ð>r(   Fr   c                ób  — |dk    r3|                      d¦  «        r|dt          d¦  «         …         }d}nvd}nsd}| j        }|j        rt	          | |¬¦  «        }nQ|j        rt          | |¬¦  «        }n8|j        s|j        rd}d}n%|j	        r| j
        j        dk    r|sd}d}n|rd}nd}||fS )	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œm˜^˜OÔ,ˆFØˆGˆGàˆGˆGð ˆàŒHˆàŒ7ð 	Ý.¨q¸kÐJÑJÔJˆFˆFØŒWð 	Ý.¨q¸kÐJÑJÔJˆFˆFØŒWð 	˜œð 	àˆFØˆGˆGØŒWð 	˜œœ gÒ-Ð-°kÐ-ð ˆFØˆGˆGð ð Ø��à�à�7ˆ?Ðr(   c                ót  — t          | ¦  «        \  }}}|t          d|dz  ¦  «        k     rdS t          | ¦  «        \  }}t          d„ |D ¦   «         d¬¦  «        }t          j        }|D ]5}	t	          j        ||	¦  «        }|                     ¦   «         d|z  k    r dS Œ6|                     ¦   «         dk     rdS d	S )
z5Choose the fastest method for computing RREF over QQ.é   é   r   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS © ©Ú
bit_length)Ú.0Úns     r&   ú
<listcomp>z-_dm_rref_choose_method_QQ.<locals>.<listcomp>/  s    € Ð5Ð5Ð5¨�a—l’l‘n”nÐ5Ð5Ð5r(   é   ©Údefaulté2   r   r   )Ú_dm_row_densityÚminÚ_dm_QQ_numers_denomsÚmaxr   r.   Úlcmrb   )
r   r   Údensityr$   ÚncolsÚnumersÚdenomsÚ
numer_bitsÚ	denom_lcmÚds
             r&   rY   rY     sÛ   € õ (¨Ñ*Ô*Ñ€GˆQ�ð •�Q˜˜a™‘”Ò Ð Øˆtõ *¨!Ñ,Ô,�N€FˆFÝÐ5Ð5¨fÐ5Ñ5Ô5¸qÐAÑAÔA€Jå”€IØð ð ˆÝ”F˜9 aÑ(Ô(ˆ	Ø×ÒÑ!Ô! A j¡LÒ0Ð0Ø�4�4ð 1ð ×ÒÑÔ Ò"Ð"Øˆtàˆtr(   c                ó4  — d}t          | ¦  «        \  }}}|dk     r||dz  k     rdS dS |dk     rdS |d||z  z   k    rdS t          | ¦  «        }t          d„ |D ¦   «         d¬	¦  «        }t          dd
|z  |z  ¦  «        }d|||dz  z  z  z   |z  }	||	k     rdS dS )z5Choose the fastest method for computing RREF over ZZ.i'  é
   r^   r   r   r]   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r`   ra   ©rc   Úes     r&   re   z-_dm_rref_choose_method_ZZ.<locals>.<listcomp>n  s    € Ð1Ð1Ð1 1�—’‘”Ð1Ð1Ð1r(   rf   rg   gUUUUUUå?)rj   Ú_dm_elementsrm   )
r   r   ÚPARAMro   Únrows_nzrp   ÚelementsÚbitsÚwidenessÚmax_densitys
             r&   rW   rW   F  sæ   € ð$ €Eõ
  /¨qÑ1Ô1Ñ€GˆX�uð �"‚}€}Ø�U˜1‘WÒÐØ�4à�4ð �‚{€{ØˆtØ	�1�u˜X‘~Ñ%Ò	%Ð	%Øˆtõ ˜A‰Œ€HÝÐ1Ð1¨Ð1Ñ1Ô1¸1Ð=Ñ=Ô=€Dõ �1�c˜%‘i Ñ(Ñ)Ô)€Hà�u˜h t¨Q¡wÑ.Ñ/Ñ/°8Ñ;€Kà�ÒÐØˆtàˆtr(   c                 óò   — | j         d         }| j                             ¦   «                              ¦   «         }|sdd|fS t	          |¦  «        }t          t          t          |¦  «        ¦  «        |z  }|||fS )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.
    rf   r   )r@   r4   Úto_sdmÚvaluesrU   ÚsumÚmap)r   rp   Úrows_nzr}   ro   s        r&   rj   rj   |  sr   € ð ŒG�AŒJ€EØŒe�lŠl‰nŒn×#Ò#Ñ%Ô%€GØð (Ø�!�Uˆ{Ðå�w‘<”<ˆÝ•c�#˜wÑ'Ô'Ñ(Ô(¨8Ñ3ˆØ˜ %Ð'Ð'r(   c                 ó4   — |                       ¦   «         \  }}|S )z*Return nonzero elements of a DomainMatrix.)Ú
to_flat_nz)r   r~   r$   s      r&   r{   r{   ’  s   € à—,’,‘.”.�K€HˆaØ€Or(   c                 óX   — t          | ¦  «        }d„ |D ¦   «         }d„ |D ¦   «         }||fS )zBReturns the numerators and denominators of a DomainMatrix over QQ.c                 ó   — g | ]	}|j         ‘Œ
S r`   )Ú	numeratorry   s     r&   re   z(_dm_QQ_numers_denoms.<locals>.<listcomp>›  s   € Ð,Ð,Ð,˜aˆaŒkÐ,Ð,Ð,r(   c                 ó   — g | ]	}|j         ‘Œ
S r`   r   ry   s     r&   re   z(_dm_QQ_numers_denoms.<locals>.<listcomp>œ  s   € Ð.Ð.Ð. ˆaŒmÐ.Ð.Ð.r(   )r{   )ÚMqr~   rq   rr   s       r&   rl   rl   ˜  s?   € å˜BÑÔ€HØ,Ð, 8Ð,Ñ,Ô,€FØ.Ð. XÐ.Ñ.Ô.€FØ�6ˆ>Ðr(   c                 óJ   — | j         }|j        r|                      ¦   «         S | S )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   rj   r{   rl   r   r`   r(   r&   ú<module>r–      s²  ðð< #Ð "Ð "Ð "Ð "Ð "à AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ (Ð (Ð (Ð (Ð (Ð (Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?ð !ð 1ð 1ð 1ð 1ð 1ðh $(°ð Kð Kð Kð Kð Kð\ð ð ð"$ð $ð $ð(ð (ð (ð*ð *ð *ð:ð :ð :ð/ð /ð /ð?ð ?ð ?ð 6;ð +ð +ð +ð +ð +ð\ 16ð *ð *ð *ð *ð *ðZ 16ð 3ð 3ð 3ð 3ð 3ðl(ð (ð (ð,ð ð ðð ð ðð ð ð ð r(   