B
    ˜‘[c  ã               @   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mZmZmZ ddlmZ eG d	d
„ d
ee	eƒƒZdS )z1Implementation of :class:`AlgebraicField` class. é    )Úprint_functionÚdivision)ÚField)ÚSimpleDomain)ÚCharacteristicZero)ÚANP)ÚCoercionFailedÚDomainErrorÚNotAlgebraicÚIsomorphismFailed)Úpublicc               @   sÈ   e Zd ZdZeZd ZZdZdZ	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!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,S )-ÚAlgebraicFieldz2A class for representing algebraic number fields. TFc             G   sš   |j stdƒ‚ddlm} || _||ƒ| _| jjj| _| | _	| _
d| _| jf | _| _| |dƒ|dƒgƒ| _| j | jj|¡| _| j | jj|¡| _d S )Nz&ground domain must be a rational fieldr   )Úto_number_fieldé   )Zis_QQr	   Úsympy.polys.numberfieldsr   Zorig_extÚextZminpolyÚrepÚmodZdomainÚdomZngensZsymbolsZgensZunitÚdtypeZzeroÚone)Úselfr   r   r   © r   úAlib/python3.7/site-packages/sympy/polys/domains/algebraicfield.pyÚ__init__   s    
zAlgebraicField.__init__c             C   s   |   || jj| j¡S )N)r   r   r   r   )r   Úelementr   r   r   Únew,   s    zAlgebraicField.newc             C   s   t | jƒd t | jƒ d S )Nú<ú>)Ústrr   r   )r   r   r   r   Ú__str__/   s    zAlgebraicField.__str__c             C   s   t | jj| j| j| jfƒS )N)ÚhashÚ	__class__Ú__name__r   r   r   )r   r   r   r   Ú__hash__2   s    zAlgebraicField.__hash__c             C   s"   t |tƒo | j|jko | j|jkS )z0Returns ``True`` if two domains are equivalent. )Ú
isinstancer   r   r   )r   Úotherr   r   r   Ú__eq__5   s    
zAlgebraicField.__eq__c             G   s   t | jf| jf| žŽ S )z?Returns an algebraic field, i.e. `\mathbb{Q}(\alpha, \ldots)`. )r   r   r   )r   Ú	extensionr   r   r   Úalgebraic_field:   s    zAlgebraicField.algebraic_fieldc             C   s   ddl m} || j|ƒ ¡ S )z!Convert ``a`` to a SymPy object. r   )ÚAlgebraicNumber)r   r*   r   Zas_expr)r   Úar*   r   r   r   Úto_sympy>   s    zAlgebraicField.to_sympyc          	   C   sv   y| | j  |¡gƒS  tk
r&   Y nX ddlm} y| ||| jƒ ¡ ƒS  ttfk
rp   td|| f ƒ‚Y nX dS )z)Convert SymPy's expression to ``dtype``. r   )r   z(%s is not a valid algebraic number in %sN)	r   Ú
from_sympyr   r   r   r   Znative_coeffsr
   r   )r   r+   r   r   r   r   r-   C   s    zAlgebraicField.from_sympyc             C   s   | | j  ||¡ƒS )z.Convert a Python ``int`` object to ``dtype``. )r   Úconvert)ÚK1r+   ÚK0r   r   r   Úfrom_ZZ_pythonR   s    zAlgebraicField.from_ZZ_pythonc             C   s   | | j  ||¡ƒS )z3Convert a Python ``Fraction`` object to ``dtype``. )r   r.   )r/   r+   r0   r   r   r   Úfrom_QQ_pythonV   s    zAlgebraicField.from_QQ_pythonc             C   s   | | j  ||¡ƒS )z,Convert a GMPY ``mpz`` object to ``dtype``. )r   r.   )r/   r+   r0   r   r   r   Úfrom_ZZ_gmpyZ   s    zAlgebraicField.from_ZZ_gmpyc             C   s   | | j  ||¡ƒS )z,Convert a GMPY ``mpq`` object to ``dtype``. )r   r.   )r/   r+   r0   r   r   r   Úfrom_QQ_gmpy^   s    zAlgebraicField.from_QQ_gmpyc             C   s   | | j  ||¡ƒS )z.Convert a mpmath ``mpf`` object to ``dtype``. )r   r.   )r/   r+   r0   r   r   r   Úfrom_RealFieldb   s    zAlgebraicField.from_RealFieldc             C   s   t d|  ƒ‚dS )z)Returns a ring associated with ``self``. z#there is no ring associated with %sN)r	   )r   r   r   r   Úget_ringf   s    zAlgebraicField.get_ringc             C   s   | j  | ¡ ¡S )z#Returns True if ``a`` is positive. )r   Úis_positiveÚLC)r   r+   r   r   r   r7   j   s    zAlgebraicField.is_positivec             C   s   | j  | ¡ ¡S )z#Returns True if ``a`` is negative. )r   Úis_negativer8   )r   r+   r   r   r   r9   n   s    zAlgebraicField.is_negativec             C   s   | j  | ¡ ¡S )z'Returns True if ``a`` is non-positive. )r   Úis_nonpositiver8   )r   r+   r   r   r   r:   r   s    zAlgebraicField.is_nonpositivec             C   s   | j  | ¡ ¡S )z'Returns True if ``a`` is non-negative. )r   Úis_nonnegativer8   )r   r+   r   r   r   r;   v   s    zAlgebraicField.is_nonnegativec             C   s   |S )zReturns numerator of ``a``. r   )r   r+   r   r   r   Únumerz   s    zAlgebraicField.numerc             C   s   | j S )zReturns denominator of ``a``. )r   )r   r+   r   r   r   Údenom~   s    zAlgebraicField.denomN)r#   Ú
__module__Ú__qualname__Ú__doc__r   r   Zis_AlgebraicFieldZis_AlgebraicZis_NumericalZhas_assoc_RingZhas_assoc_Fieldr   r   r    r$   r'   r)   r,   r-   r1   r2   r3   r4   r5   r6   r7   r9   r:   r;   r<   r=   r   r   r   r   r      s4   r   N)r@   Z
__future__r   r   Zsympy.polys.domains.fieldr   Z sympy.polys.domains.simpledomainr   Z&sympy.polys.domains.characteristiczeror   Zsympy.polys.polyclassesr   Zsympy.polys.polyerrorsr   r	   r
   r   Zsympy.utilitiesr   r   r   r   r   r   Ú<module>   s   