a
    kº”h  ã                   @   s^   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	 e	G dd„ dƒƒZ
G dd	„ d	eƒZd
S )z.Implementation of :class:`QuotientRing` class.é    ©ÚFreeModuleQuotientRing)ÚRing)ÚNotReversibleÚCoercionFailed)Úpublicc                   @   s„   e Zd ZdZdd„ Zdd„ ZeZdd„ Zdd	„ ZeZ	d
d„ Z
dd„ Zdd„ Zdd„ ZeZdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚQuotientRingElementzº
    Class representing elements of (commutative) quotient rings.

    Attributes:

    - ring - containing ring
    - data - element of ring.ring (i.e. base ring) representing self
    c                 C   s   || _ || _d S ©N)ÚringÚdata)Úselfr
   r   © r   úN/var/www/auris/lib/python3.9/site-packages/sympy/polys/domains/quotientring.pyÚ__init__   s    zQuotientRingElement.__init__c                 C   s4   ddl m} | jj | j¡}||ƒd t| jjƒ S )Nr   )Ússtrz + )Zsympy.printing.strr   r
   Úto_sympyr   ÚstrÚ
base_ideal)r   r   r   r   r   r   Ú__str__   s    zQuotientRingElement.__str__c                 C   s   | j  | ¡ S r	   )r
   Úis_zero©r   r   r   r   Ú__bool__$   s    zQuotientRingElement.__bool__c              	   C   sV   t || jƒr|j| jkrDz| j |¡}W n ttfyB   t Y S 0 |  | j|j ¡S r	   ©Ú
isinstanceÚ	__class__r
   ÚconvertÚNotImplementedErrorr   ÚNotImplementedr   ©r   Zomr   r   r   Ú__add__'   s    
zQuotientRingElement.__add__c                 C   s   |   | j| j j  d¡ ¡S )Néÿÿÿÿ)r
   r   r   r   r   r   r   Ú__neg__1   s    zQuotientRingElement.__neg__c                 C   s   |   | ¡S r	   ©r   r   r   r   r   Ú__sub__4   s    zQuotientRingElement.__sub__c                 C   s   |    |¡S r	   r"   r   r   r   r   Ú__rsub__7   s    zQuotientRingElement.__rsub__c              	   C   sJ   t || jƒs8z| j |¡}W n ttfy6   t Y S 0 |  | j|j ¡S r	   r   ©r   Úor   r   r   Ú__mul__:   s    
zQuotientRingElement.__mul__c                 C   s   | j  | ¡| S r	   )r
   Úrevertr%   r   r   r   Ú__rtruediv__D   s    z QuotientRingElement.__rtruediv__c              	   C   sH   t || jƒs8z| j |¡}W n ttfy6   t Y S 0 | j |¡|  S r	   )r   r   r
   r   r   r   r   r(   r%   r   r   r   Ú__truediv__G   s    
zQuotientRingElement.__truediv__c                 C   s*   |dk r| j  | ¡|  S |   | j| ¡S )Nr   )r
   r(   r   )r   Zothr   r   r   Ú__pow__O   s    zQuotientRingElement.__pow__c                 C   s,   t || jƒr|j| jkrdS | j | | ¡S )NF)r   r   r
   r   r   r   r   r   Ú__eq__T   s    zQuotientRingElement.__eq__c                 C   s
   | |k S r	   r   r   r   r   r   Ú__ne__Y   s    zQuotientRingElement.__ne__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__repr__r   r   Ú__radd__r!   r#   r$   r'   Ú__rmul__r)   r*   r+   r,   r-   r   r   r   r   r      s"   	r   c                   @   s¨   e Zd ZdZdZdZeZdd„ Zdd„ Z	dd	„ Z
d
d„ Zdd„ Zdd„ ZeZeZeZeZeZeZe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 )!ÚQuotientRingaa  
    Class representing (commutative) quotient rings.

    You should not usually instantiate this by hand, instead use the constructor
    from the base ring in the construction.

    >>> from sympy.abc import x
    >>> from sympy import QQ
    >>> I = QQ.old_poly_ring(x).ideal(x**3 + 1)
    >>> QQ.old_poly_ring(x).quotient_ring(I)
    QQ[x]/<x**3 + 1>

    Shorter versions are possible:

    >>> QQ.old_poly_ring(x)/I
    QQ[x]/<x**3 + 1>

    >>> QQ.old_poly_ring(x)/[x**3 + 1]
    QQ[x]/<x**3 + 1>

    Attributes:

    - ring - the base ring
    - base_ideal - the ideal used to form the quotient
    TFc                 C   sF   |j |kstd||f ƒ‚|| _ || _| | j jƒ| _| | j jƒ| _d S )NzIdeal must belong to %s, got %s)r
   Ú
ValueErrorr   ZzeroZone)r   r
   Úidealr   r   r   r   |   s    
zQuotientRing.__init__c                 C   s   t | jƒd t | jƒ S )Nú/)r   r
   r   r   r   r   r   r   „   s    zQuotientRing.__str__c                 C   s   t | jj| j| j| jfƒS r	   )Úhashr   r.   Údtyper
   r   r   r   r   r   Ú__hash__‡   s    zQuotientRing.__hash__c                 C   s,   t || jjƒs|  |¡}|  | | j |¡¡S )z4Construct an element of ``self`` domain from ``a``. )r   r
   r:   r   Zreduce_element©r   Úar   r   r   ÚnewŠ   s    
zQuotientRing.newc                 C   s"   t |tƒo | j|jko | j|jkS )z0Returns ``True`` if two domains are equivalent. )r   r5   r
   r   )r   Úotherr   r   r   r,   ‘   s
    

ÿ
ÿzQuotientRing.__eq__c                 C   s   | | j  ||¡ƒS )z.Convert a Python ``int`` object to ``dtype``. )r
   r   )ZK1r=   ÚK0r   r   r   Úfrom_ZZ–   s    zQuotientRing.from_ZZc                 C   s   | | j  |¡ƒS r	   )r
   Ú
from_sympyr<   r   r   r   rB   ¢   s    zQuotientRing.from_sympyc                 C   s   | j  |j¡S r	   )r
   r   r   r<   r   r   r   r   ¥   s    zQuotientRing.to_sympyc                 C   s   || kr|S d S r	   r   )r   r=   r@   r   r   r   Úfrom_QuotientRing¨   s    zQuotientRing.from_QuotientRingc                 G   s   t dƒ‚dS )z*Returns a polynomial ring, i.e. ``K[X]``. únested domains not allowedN©r   ©r   Zgensr   r   r   Ú	poly_ring¬   s    zQuotientRing.poly_ringc                 G   s   t dƒ‚dS )z)Returns a fraction field, i.e. ``K(X)``. rD   NrE   rF   r   r   r   Ú
frac_field°   s    zQuotientRing.frac_fieldc                 C   sP   | j  |j¡| j }z| | d¡d ƒW S  tyJ   td|| f ƒ‚Y n0 dS )z/
        Compute a**(-1), if possible.
        é   r   z%s not a unit in %rN)r
   r7   r   r   Zin_terms_of_generatorsr6   r   )r   r=   ÚIr   r   r   r(   ´   s
    zQuotientRing.revertc                 C   s   | j  |j¡S r	   )r   Úcontainsr   r<   r   r   r   r   ¾   s    zQuotientRing.is_zeroc                 C   s
   t | |ƒS )zè
        Generate a free module of rank ``rank`` over ``self``.

        >>> from sympy.abc import x
        >>> from sympy import QQ
        >>> (QQ.old_poly_ring(x)/[x**2 + 1]).free_module(2)
        (QQ[x]/<x**2 + 1>)**2
        r   )r   Zrankr   r   r   Úfree_moduleÁ   s    	zQuotientRing.free_moduleN)r.   r/   r0   r1   Zhas_assoc_RingZhas_assoc_Fieldr   r:   r   r   r;   r>   r,   rA   Zfrom_ZZ_pythonZfrom_QQ_pythonZfrom_ZZ_gmpyZfrom_QQ_gmpyZfrom_RealFieldZfrom_GlobalPolynomialRingZfrom_FractionFieldrB   r   rC   rG   rH   r(   r   rL   r   r   r   r   r5   ]   s2   
r5   N)r1   Zsympy.polys.agca.modulesr   Zsympy.polys.domains.ringr   Zsympy.polys.polyerrorsr   r   Zsympy.utilitiesr   r   r5   r   r   r   r   Ú<module>   s   N