B
    ˜‘[Z
  ã               @   st   d Z ddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ eG dd„ deƒƒZd	S )
z1Implementaton of :class:`GMPYIntegerRing` class. é    )Úprint_functionÚdivision)ÚIntegerRing)ÚGMPYIntegerÚSymPyIntegerÚgmpy_factorialÚ
gmpy_gcdexÚgmpy_gcdÚgmpy_lcmÚ	gmpy_sqrt)ÚCoercionFailed)Úpublicc               @   s¨   e Zd ZdZeZedƒZedƒZeeƒ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#S )$ÚGMPYIntegerRingz+Integer ring based on GMPY's ``mpz`` type. r   é   ZZZ_gmpyc             C   s   dS )z$Allow instantiation of this domain. N© )Úselfr   r   úBlib/python3.7/site-packages/sympy/polys/domains/gmpyintegerring.pyÚ__init__   s    zGMPYIntegerRing.__init__c             C   s   t t|ƒƒS )z!Convert ``a`` to a SymPy object. )r   Úint)r   Úar   r   r   Úto_sympy   s    zGMPYIntegerRing.to_sympyc             C   s>   |j rt|jƒS |jr.t|ƒ|kr.tt|ƒƒS td| ƒ‚dS )z&Convert SymPy's Integer to ``dtype``. zexpected an integer, got %sN)Z
is_Integerr   ÚpZis_Floatr   r   )r   r   r   r   r   Ú
from_sympy    s
    
zGMPYIntegerRing.from_sympyc             C   s   t | ¡ ƒS )z3Convert ``ModularInteger(int)`` to GMPY's ``mpz``. )r   Úto_int)ÚK1r   ÚK0r   r   r   Úfrom_FF_python)   s    zGMPYIntegerRing.from_FF_pythonc             C   s   t |ƒS )z,Convert Python's ``int`` to GMPY's ``mpz``. )r   )r   r   r   r   r   r   Úfrom_ZZ_python-   s    zGMPYIntegerRing.from_ZZ_pythonc             C   s   |j dkrt|jƒS dS )z1Convert Python's ``Fraction`` to GMPY's ``mpz``. r   N)Údenominatorr   Ú	numerator)r   r   r   r   r   r   Úfrom_QQ_python1   s    
zGMPYIntegerRing.from_QQ_pythonc             C   s   |  ¡ S )z3Convert ``ModularInteger(mpz)`` to GMPY's ``mpz``. )r   )r   r   r   r   r   r   Úfrom_FF_gmpy6   s    zGMPYIntegerRing.from_FF_gmpyc             C   s   |S )z*Convert GMPY's ``mpz`` to GMPY's ``mpz``. r   )r   r   r   r   r   r   Úfrom_ZZ_gmpy:   s    zGMPYIntegerRing.from_ZZ_gmpyc             C   s   |j dkr|jS dS )z(Convert GMPY ``mpq`` to GMPY's ``mpz``. r   N)r   r   )r   r   r   r   r   r   Úfrom_QQ_gmpy>   s    
zGMPYIntegerRing.from_QQ_gmpyc             C   s"   |  |¡\}}|dkrt|ƒS dS )z,Convert mpmath's ``mpf`` to GMPY's ``mpz``. r   N)Zto_rationalr   )r   r   r   r   Úqr   r   r   Úfrom_RealFieldC   s    zGMPYIntegerRing.from_RealFieldc             C   s   t ||ƒ\}}}|||fS )z)Compute extended GCD of ``a`` and ``b``. )r   )r   r   ÚbÚhÚsÚtr   r   r   ÚgcdexJ   s    zGMPYIntegerRing.gcdexc             C   s
   t ||ƒS )z Compute GCD of ``a`` and ``b``. )r	   )r   r   r&   r   r   r   ÚgcdO   s    zGMPYIntegerRing.gcdc             C   s
   t ||ƒS )z Compute LCM of ``a`` and ``b``. )r
   )r   r   r&   r   r   r   ÚlcmS   s    zGMPYIntegerRing.lcmc             C   s   t |ƒS )zCompute square root of ``a``. )r   )r   r   r   r   r   ÚsqrtW   s    zGMPYIntegerRing.sqrtc             C   s   t |ƒS )zCompute factorial of ``a``. )r   )r   r   r   r   r   Ú	factorial[   s    zGMPYIntegerRing.factorialN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ZdtypeZzeroZoneÚtypeÚtpÚaliasr   r   r   r   r   r    r!   r"   r#   r%   r*   r+   r,   r-   r.   r   r   r   r   r      s*   	r   N)r2   Z
__future__r   r   Zsympy.polys.domains.integerringr   Zsympy.polys.domains.groundtypesr   r   r   r   r	   r
   r   Zsympy.polys.polyerrorsr   Zsympy.utilitiesr   r   r   r   r   r   Ú<module>   s   $