o
    8Va                     @   sz   d 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 eG d	d
 d
eeeZe ZdS )z,Implementation of :class:`RealField` class.     )Float)Field)SimpleDomain)CharacteristicZero)	MPContext)CoercionFailed)publicc                   @   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eddf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d7d+d,Z d-d. Z!d/d0 Z"d1d2 Z#d3d4 Z$d8d5d6Z%dS )9	RealFieldz(Real numbers up to the given precision. RRTF5   c                 C   s   | j | jkS N)	precision_default_precisionself r   ?/usr/lib/python3/dist-packages/sympy/polys/domains/realfield.pyhas_default_precision      zRealField.has_default_precisionc                 C      | j jS r   )_contextprecr   r   r   r   r   !      zRealField.precisionc                 C   r   r   )r   dpsr   r   r   r   r   %   r   zRealField.dpsc                 C   r   r   )r   	tolerancer   r   r   r   r   )   r   zRealField.toleranceNc                 C   s>   t |||d}| |_|| _|j| _| d| _| d| _d S )NTr      )r   Z_parentr   ZmpfdtypeZzeroone)r   r   r   Ztolcontextr   r   r   __init__-   s   zRealField.__init__c                 C   s"   t |to| j|jko| j|jkS r   )
isinstancer	   r   r   )r   otherr   r   r   __eq__6   s
   


zRealField.__eq__c                 C   s   t | jj| j| j| jfS r   )hash	__class____name__r   r   r   r   r   r   r   __hash__;      zRealField.__hash__c                 C   s   t || jS )z%Convert ``element`` to SymPy number. )r   r   )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``. )nzexpected real number, got %s)evalfr   Z	is_Numberr   r   )r   exprZnumberr   r   r   
from_sympyB   s   
zRealField.from_sympyc                 C   
   |  |S r   r   r   r(   baser   r   r   from_ZZK      
zRealField.from_ZZc                 C   r.   r   r/   r0   r   r   r   from_ZZ_pythonN   r3   zRealField.from_ZZ_pythonc                 C      |  |j|j S r   r   	numeratordenominatorr0   r   r   r   from_QQQ      zRealField.from_QQc                 C   r5   r   r6   r0   r   r   r   from_QQ_pythonT   r:   zRealField.from_QQ_pythonc                 C   s   |  t|S r   )r   intr0   r   r   r   from_ZZ_gmpyW   s   zRealField.from_ZZ_gmpyc                 C   s   |  t|jt|j S r   )r   r<   r7   r8   r0   r   r   r   from_QQ_gmpyZ   r'   zRealField.from_QQ_gmpyc                 C   s   |  ||| jS r   )r-   r)   r+   r   r0   r   r   r   from_AlgebraicField]   s   zRealField.from_AlgebraicFieldc                 C   s   | |kr|S |  |S r   r/   r0   r   r   r   from_RealField`   s   
zRealField.from_RealFieldc                 C   s   |j s	| |jS d S r   )imagr   realr0   r   r   r   from_ComplexFieldf   s   zRealField.from_ComplexFieldc                 C   s   | j ||S )z*Convert a real number to rational number. )r   to_rational)r   r(   limitr   r   r   rD   j   s   zRealField.to_rationalc                 C   s   | S )z)Returns a ring associated with ``self``. r   r   r   r   r   get_ringn   s   zRealField.get_ringc                 C   s   ddl m} |S )z2Returns an exact domain associated with ``self``. r   )QQ)Zsympy.polys.domainsrG   )r   rG   r   r   r   	get_exactr   s   zRealField.get_exactc                 C   s   | j S )z Returns GCD of ``a`` and ``b``. )r   r   abr   r   r   gcdw   s   zRealField.gcdc                 C   s   || S )z Returns LCM of ``a`` and ``b``. r   rI   r   r   r   lcm{   r   zRealField.lcmc                 C   s   | j |||S )z+Check if ``a`` and ``b`` are almost equal. )r   almosteq)r   rJ   rK   r   r   r   r   rN      s   zRealField.almosteq)Tr   )&r%   
__module____qualname____doc__ZrepZis_RealFieldZis_RRZis_ExactZis_NumericalZis_PIDZhas_assoc_RingZhas_assoc_Fieldr   propertyr   r   r   r   r   r"   r&   r)   r-   r2   r4   r9   r;   r=   r>   r?   r@   rC   rD   rF   rH   rL   rM   rN   r   r   r   r   r	      sL    



		
r	   N)rQ   Zsympy.core.numbersr   Zsympy.polys.domains.fieldr   Z sympy.polys.domains.simpledomainr   Z&sympy.polys.domains.characteristiczeror   Zsympy.polys.domains.mpelementsr   Zsympy.polys.polyerrorsr   Zsympy.utilitiesr   r	   r
   r   r   r   r   <module>   s    
w