B
    ˜‘[ê  ã               @   sv   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 eG d	d
„ d
eeƒƒZdS )z.Implementation of :class:`FiniteField` class. é    )Úprint_functionÚdivision)ÚField)ÚSimpleDomain)ÚSymPyInteger)ÚModularIntegerFactory)Ú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$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d„Zd&dd„Zd'dd„Zd(dd„Zd)dd„Zd*d d!„Zd"d#„ ZdS )+ÚFiniteFieldz!General class for finite fields. ZFFTFNc             C   sd   |dkrt d| ƒ‚|d kr,ddlm} |}t|||| ƒ| _|  d¡| _|  d¡| _|| _|| _d S )Nr   z*modulus must be a positive integer, got %s)ÚZZé   )	Ú
ValueErrorZsympy.polys.domainsr   r   ÚdtypeZzeroZoneÚdomÚmod)Úselfr   r   Z	symmetricr   © r   ú>lib/python3.7/site-packages/sympy/polys/domains/finitefield.pyÚ__init__   s    zFiniteField.__init__c             C   s
   d| j  S )NzGF(%s))r   )r   r   r   r   Ú__str__)   s    zFiniteField.__str__c             C   s   t | jj| j| j| jfƒS )N)ÚhashÚ	__class__Ú__name__r   r   r   )r   r   r   r   Ú__hash__,   s    zFiniteField.__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__/   s    
zFiniteField.__eq__c             C   s   | j S )z*Return the characteristic of this domain. )r   )r   r   r   r   Úcharacteristic4   s    zFiniteField.characteristicc             C   s   | S )z*Returns a field associated with ``self``. r   )r   r   r   r   Ú	get_field8   s    zFiniteField.get_fieldc             C   s   t t|ƒƒS )z!Convert ``a`` to a SymPy object. )r   Úint)r   Úar   r   r   Úto_sympy<   s    zFiniteField.to_sympyc             C   sT   |j r|  | j t|ƒ¡¡S |jrDt|ƒ|krD|  | j t|ƒ¡¡S td| ƒ‚dS )z0Convert SymPy's Integer to SymPy's ``Integer``. zexpected an integer, got %sN)Z
is_Integerr   r   r   Zis_Floatr   )r   r    r   r   r   Ú
from_sympy@   s
    zFiniteField.from_sympyc             C   s   |   | j |j|j¡¡S )z.Convert ``ModularInteger(int)`` to ``dtype``. )r   r   Úfrom_ZZ_pythonÚval)ÚK1r    ÚK0r   r   r   Úfrom_FF_pythonI   s    zFiniteField.from_FF_pythonc             C   s   |   | j ||¡¡S )z'Convert Python's ``int`` to ``dtype``. )r   r   r#   )r%   r    r&   r   r   r   r#   M   s    zFiniteField.from_ZZ_pythonc             C   s   |j dkr|  |j¡S dS )z,Convert Python's ``Fraction`` to ``dtype``. r   N)Údenominatorr#   Ú	numerator)r%   r    r&   r   r   r   Úfrom_QQ_pythonQ   s    
zFiniteField.from_QQ_pythonc             C   s   |   | j |j|j¡¡S )z.Convert ``ModularInteger(mpz)`` to ``dtype``. )r   r   Úfrom_ZZ_gmpyr$   )r%   r    r&   r   r   r   Úfrom_FF_gmpyV   s    zFiniteField.from_FF_gmpyc             C   s   |   | j ||¡¡S )z%Convert GMPY's ``mpz`` to ``dtype``. )r   r   r+   )r%   r    r&   r   r   r   r+   Z   s    zFiniteField.from_ZZ_gmpyc             C   s   |j dkr|  |j¡S dS )z%Convert GMPY's ``mpq`` to ``dtype``. r   N)r(   r+   r)   )r%   r    r&   r   r   r   Úfrom_QQ_gmpy^   s    
zFiniteField.from_QQ_gmpyc             C   s,   |  |¡\}}|dkr(|  tj |¡¡S dS )z'Convert mpmath's ``mpf`` to ``dtype``. r   N)Zto_rationalr   r   r   )r%   r    r&   ÚpÚqr   r   r   Úfrom_RealFieldc   s    zFiniteField.from_RealField)NT)N)N)N)N)N)N)r   Ú
__module__Ú__qualname__Ú__doc__ZrepZis_FiniteFieldZis_FFZis_NumericalZhas_assoc_RingZhas_assoc_Fieldr   r   r   r   r   r   r   r   r!   r"   r'   r#   r*   r,   r+   r-   r0   r   r   r   r   r
      s.   
	





r
   N)r3   Z
__future__r   r   Zsympy.polys.domains.fieldr   Z sympy.polys.domains.simpledomainr   Zsympy.polys.domains.groundtypesr   Z"sympy.polys.domains.modularintegerr   Zsympy.polys.polyerrorsr   Zsympy.utilitiesr	   r
   r   r   r   r   Ú<module>   s   