a
    RG5dÉ  ã                   @   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 )(ÚGMPYIntegerRingz³Integer 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   é   ÚZZ_gmpyc                 C   s   dS )z$Allow instantiation of this domain. N© )Úselfr   r   ú_/var/www/html/django/DPS/env/lib/python3.9/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)Ú
is_Integerr   ÚpÚ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)Ú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   r0   r   r   r   ÚgcdZ   s    zGMPYIntegerRing.gcdc                 C   s
   t ||ƒS )z Compute LCM of ``a`` and ``b``. )r   r5   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   ÚdtypeÚzeroÚoneÚtypeÚtpÚaliasr   r   r   r   r    r%   r&   r'   r(   r)   r,   r/   r4   r6   r7   r   r   r   r   r   r   r      s.   	r   N)r=   Úsympy.polys.domains.groundtypesr   r   r   r9   r   r   r   r   r8   Zsympy.polys.domains.integerringr	   Úsympy.polys.polyerrorsr
   Úsympy.utilitiesr   r   r   r   r   r   Ú<module>   s   $