U
    me                     @   sd   d 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 ddlmZ eG dd deZdS )	z2Implementation of :class:`GMPYIntegerRing` class.     )GMPYIntegerSymPyInteger	factorial
gmpy_gcdexgmpy_gcdgmpy_lcmsqrt)IntegerRing)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#d$ Zd%d& Zd'S )(GMPYIntegerRingzInteger ring based on GMPY's ``mpz`` type.

    This will be the implementation of :ref:`ZZ` if ``gmpy`` or ``gmpy2`` is
    installed. Elements will be of type ``gmpy.mpz``.
    r      ZZZ_gmpyc                 C   s   dS )z$Allow instantiation of this domain. N )selfr   r   G/tmp/pip-unpacked-wheel-rdz2gdd2/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   
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   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   	numeratorr   r   r   r   from_QQ3   s    
zGMPYIntegerRing.from_QQc                 C   s   |j dkrt|jS dS r   r   r   r   r   r   from_QQ_python8   s    
zGMPYIntegerRing.from_QQ_pythonc                 C   s   |  S )z3Convert ``ModularInteger(mpz)`` to GMPY's ``mpz``. )r   r   r   r   r   from_FF_gmpy=   s    zGMPYIntegerRing.from_FF_gmpyc                 C   s   |S )z*Convert GMPY's ``mpz`` to GMPY's ``mpz``. r   r   r   r   r   from_ZZ_gmpyA   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   from_QQ_gmpyE   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_RealFieldJ   s    zGMPYIntegerRing.from_RealFieldc                 C   s   |j dkr|jS d S )Nr   )yxr   r   r   r   from_GaussianIntegerRingQ   s    
z(GMPYIntegerRing.from_GaussianIntegerRingc                 C   s   t ||\}}}|||fS )z)Compute extended GCD of ``a`` and ``b``. )r   )r   r   bhstr   r   r   gcdexU   s    zGMPYIntegerRing.gcdexc                 C   s
   t ||S )z Compute GCD of ``a`` and ``b``. )r   r   r   r,   r   r   r   gcdZ   s    zGMPYIntegerRing.gcdc                 C   s
   t ||S )z Compute LCM of ``a`` and ``b``. )r   r1   r   r   r   lcm^   s    zGMPYIntegerRing.lcmc                 C   s   t |S )zCompute square root of ``a``. )	gmpy_sqrtr   r   r   r   r   b   s    zGMPYIntegerRing.sqrtc                 C   s   t |S )zCompute factorial of ``a``. )gmpy_factorialr   r   r   r   r   f   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+   r0   r2   r3   r   r   r   r   r   r   r      s.   	r   N)r9   Zsympy.polys.domains.groundtypesr   r   r   r5   r   r   r   r   r4   Zsympy.polys.domains.integerringr	   Zsympy.polys.polyerrorsr
   Zsympy.utilitiesr   r   r   r   r   r   <module>   s   $