o
    Rh8                     @   s   d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ dddZeG dd deee	Ze ZdS )z,Implementation of :class:`RealField` class.     )
SYMPY_INTSMPQ)Float)Field)SimpleDomain)CharacteristicZero)CoercionFailed)public)	MPContext)to_rationalTc                 C   s  t | j\}}t|}t|}|r||kr||fS d\}}}}||}	}
	 |	|
 }|||  }||kr4n|||||  |f\}}}}|
|	||
  }	}
q%|| | }t||}t|||  |||  }t||}|rm|sq||fS t|| t|| kr|j|jfS |j|jfS )N)r      r   r   )_mpmath_to_rational_mpf_intr   abs	numeratordenominator)s	max_denomlimitpqp0q0p1q1ndaq2knumberbound1bound2 r$   _/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/sympy/polys/domains/realfield.pyr      s0   


r   c                   @   s.  e Zd ZdZdZd ZZdZdZdZ	dZ
dZdZedd Zedd	 Zed
d Zedd Zd?ddZedd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Z d-d. Z!d@d/d0Z"d1d2 Z#d3d4 Z$d5d6 Z%d7d8 Z&dAd9d:Z'd;d< Z(d=d> Z)dS )B	RealFieldz(Real numbers up to the given precision. RRTF5   c                 C   s   | j | jkS N)	precision_default_precisionselfr$   r$   r%   has_default_precisionG      zRealField.has_default_precisionc                 C      | j jS r)   )_contextprecr,   r$   r$   r%   r*   K      zRealField.precisionc                 C   r0   r)   )r1   dpsr,   r$   r$   r%   r4   O   r3   zRealField.dpsc                 C      | j S r)   )
_tolerancer,   r$   r$   r%   	toleranceS      zRealField.toleranceNc                 C   s   t  }|d u r|d u r| j|_n|d u r||_n|d u r ||_ntd|| _|j| _| d| _	| d| _
td|j d d| _| j
| j | _d S )NzCannot set both prec and dpsr   r         c   )r
   r+   r2   r4   	TypeErrorr1   mpf_dtypedtypezeroonemax
_max_denomr6   )r-   r2   r4   tolcontextr$   r$   r%   __init__W   s   
zRealField.__init__c                 C   r5   r)   )r>   r,   r$   r$   r%   tpq   s   zRealField.tpc                 C   s   t |tr	t|}| |S r)   )
isinstancer   r   r>   )r-   argr$   r$   r%   r?   y   s   

zRealField.dtypec                 C   s   t |to
| j|jkS r)   )rH   r&   r*   )r-   otherr$   r$   r%   __eq__      zRealField.__eq__c                 C   s   t | jj| j| jfS r)   )hash	__class____name__r>   r*   r,   r$   r$   r%   __hash__   rL   zRealField.__hash__c                 C   s   t || jS )z%Convert ``element`` to SymPy number. )r   r4   )r-   elementr$   r$   r%   to_sympy   r/   zRealField.to_sympyc                 C   s*   |j | jd}|jr| |S td| )z%Convert SymPy's number to ``dtype``. )r   zexpected real number, got %s)evalfr4   	is_Numberr?   r   )r-   exprr!   r$   r$   r%   
from_sympy   s   
zRealField.from_sympyc                 C   
   |  |S r)   r?   r-   rQ   baser$   r$   r%   from_ZZ      
zRealField.from_ZZc                 C   rW   r)   rX   rY   r$   r$   r%   from_ZZ_python   r\   zRealField.from_ZZ_pythonc                 C   s   |  t|S r)   )r?   r   rY   r$   r$   r%   from_ZZ_gmpy   s   zRealField.from_ZZ_gmpyc                 C      |  |jt|j S r)   r?   r   r   r   rY   r$   r$   r%   from_QQ   rL   zRealField.from_QQc                 C   r_   r)   r`   rY   r$   r$   r%   from_QQ_python   rL   zRealField.from_QQ_pythonc                 C   s   |  t|jt|j S r)   )r?   r   r   r   rY   r$   r$   r%   from_QQ_gmpy   s   zRealField.from_QQ_gmpyc                 C   s   |  ||| jS r)   )rV   rR   rS   r4   rY   r$   r$   r%   from_AlgebraicField   s   zRealField.from_AlgebraicFieldc                 C   rW   r)   rX   rY   r$   r$   r%   from_RealField   r\   zRealField.from_RealFieldc                 C   s   |j s	| |jS d S r)   )imagr?   realrY   r$   r$   r%   from_ComplexField   s   zRealField.from_ComplexFieldc                 C   s   t || j|dS )z*Convert a real number to rational number. )r   )r   rC   )r-   rQ   r   r$   r$   r%   r         zRealField.to_rationalc                 C   s   | S )z)Returns a ring associated with ``self``. r$   r,   r$   r$   r%   get_ring   s   zRealField.get_ringc                 C   s   ddl m} |S )z2Returns an exact domain associated with ``self``. r   )QQ)sympy.polys.domainsrk   )r-   rk   r$   r$   r%   	get_exact   s   zRealField.get_exactc                 C   r5   )z Returns GCD of ``a`` and ``b``. )rA   r-   r   br$   r$   r%   gcd   r8   zRealField.gcdc                 C   s   || S )z Returns LCM of ``a`` and ``b``. r$   rn   r$   r$   r%   lcm   r3   zRealField.lcmc                 C   s   | j |||S )z+Check if ``a`` and ``b`` are almost equal. )r1   almosteq)r-   r   ro   r7   r$   r$   r%   rr      ri   zRealField.almosteqc                 C   s   |dkS )z8Returns ``True`` if ``a >= 0`` and ``False`` otherwise. r   r$   r-   r   r$   r$   r%   	is_square   r3   zRealField.is_squarec                 C   s   |dkr|d S dS )zNon-negative square root for ``a >= 0`` and ``None`` otherwise.

        Explanation
        ===========
        The square root may be slightly inaccurate due to floating point
        rounding error.
        r   g      ?Nr$   rs   r$   r$   r%   exsqrt   s   zRealField.exsqrt)NNNTr)   )*rO   
__module____qualname____doc__repis_RealFieldis_RRis_Exactis_Numericalis_PIDhas_assoc_Ringhas_assoc_Fieldr+   propertyr.   r*   r4   r7   rF   rG   r?   rK   rP   rR   rV   r[   r]   r^   ra   rb   rc   rd   re   rh   r   rj   rm   rp   rq   rr   rt   ru   r$   r$   r$   r%   r&   6   sV    





	

r&   Nrv   )ry   sympy.external.gmpyr   r   sympy.core.numbersr   sympy.polys.domains.fieldr    sympy.polys.domains.simpledomainr   &sympy.polys.domains.characteristiczeror   sympy.polys.polyerrorsr   sympy.utilitiesr	   mpmathr
   mpmath.libmpr   r   r&   r'   r$   r$   r$   r%   <module>   s    
& 
&