U
    ZÊ¹j¬$  ã                   @   sv   d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZ G dd„ deeƒZeZG d	d
„ d
eƒZeZdS )z"Finite extensions of ring domains.é    )ÚDomain)ÚDomainElement)ÚCoercionFailedÚNotInvertibleÚGeneratorsError)ÚPoly)ÚDefaultPrintingc                   @   sì   e Zd Zd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eZdd„ Zdd„ Zdd„ ZeZdd„ Zdd„ Zdd„ ZeZdd „ ZeZd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ ZeZe d/d0„ ƒZ!d1d2„ Z"d3S )4ÚExtensionElementa#  
    Element of a finite extension.

    A class of univariate polynomials modulo the ``modulus``
    of the extension ``ext``. It is represented by the
    unique polynomial ``rep`` of lowest degree. Both
    ``rep`` and the representation ``mod`` of ``modulus``
    are of class DMP.

    ©ÚrepÚextc                 C   s   || _ || _d S ©Nr
   )Úselfr   r   © r   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/polys/agca/extensions.pyÚ__init__   s    zExtensionElement.__init__c                 C   s   | j S r   )r   ©Úfr   r   r   Úparent   s    zExtensionElement.parentc                 C   s   | j  | ¡S r   )r   Úto_sympyr   r   r   r   Úas_expr   s    zExtensionElement.as_exprc                 C   s
   t | jƒS r   )Úboolr   r   r   r   r   Ú__bool__"   s    zExtensionElement.__bool__c                 C   s   | S r   r   r   r   r   r   Ú__pos__%   s    zExtensionElement.__pos__c                 C   s   t | j | jƒS r   )ÚExtElemr   r   r   r   r   r   Ú__neg__(   s    zExtensionElement.__neg__c                 C   sR   t |tƒr"|j| jkr|jS d S n,z| j |¡}|jW S  tk
rL   Y d S X d S r   )Ú
isinstancer   r   r   Úconvertr   ©r   Úgr   r   r   Ú_get_rep+   s    
zExtensionElement._get_repc                 C   s,   |   |¡}|d k	r$t| j| | jƒS tS d S r   ©r    r   r   r   ÚNotImplemented©r   r   r   r   r   r   Ú__add__8   s    
zExtensionElement.__add__c                 C   s,   |   |¡}|d k	r$t| j| | jƒS tS d S r   r!   r#   r   r   r   Ú__sub__A   s    
zExtensionElement.__sub__c                 C   s,   |   |¡}|d k	r$t|| j | jƒS tS d S r   r!   r#   r   r   r   Ú__rsub__H   s    
zExtensionElement.__rsub__c                 C   s4   |   |¡}|d k	r,t| j| | jj | jƒS tS d S r   )r    r   r   r   Úmodr"   r#   r   r   r   Ú__mul__O   s    
zExtensionElement.__mul__c                 C   sZ   | st dƒ‚nH| jjrdS | jjr:| jj | j ¡ ¡r:dS d| › d| j› d�}t|ƒ‚dS )z5Raise if division is not implemented for this divisorzZero divisorTzCan not invert z in z7. Only division by invertible constants is implemented.N)	r   r   Úis_Fieldr   Ú	is_groundÚdomainÚis_unitZLCÚNotImplementedError)r   Úmsgr   r   r   Ú	_divcheckX   s    
zExtensionElement._divcheckc                 C   sF   |   ¡  | jjr"| j | jj¡}n| jj}| |j| j¡}t	|| jƒS )z…Multiplicative inverse.

        Raises
        ======

        NotInvertible
            If the element is a zero divisor.

        )
r/   r   r)   r   Úinvertr'   ÚringÚexquoÚoner   )r   ZinvrepÚRr   r   r   Úinversei   s    
zExtensionElement.inversec                 C   s^   |   |¡}|d krtS t|| jƒ}z| ¡ }W n& tk
rT   t| › d|› �ƒ‚Y nX | | S )Nz / )r    r"   r   r   r5   r   ÚZeroDivisionError)r   r   r   Zginvr   r   r   Ú__truediv__}   s    
zExtensionElement.__truediv__c                 C   s2   z| j  |¡}W n tk
r(   t Y S X ||  S r   ©r   r   r   r"   r   r   r   r   Ú__rtruediv__Œ   s
    
zExtensionElement.__rtruediv__c                 C   s^   |   |¡}|d krtS t|| jƒ}z| ¡  W n& tk
rT   t| › d|› �ƒ‚Y nX | jjS )Nz % )r    r"   r   r   r/   r   r6   Úzeror#   r   r   r   Ú__mod__•   s    
zExtensionElement.__mod__c                 C   s2   z| j  |¡}W n tk
r(   t Y S X ||  S r   r8   r   r   r   r   Ú__rmod__£   s
    
zExtensionElement.__rmod__c                 C   s¢   t |tƒstdƒ‚|dk rLz|  ¡ |  } }W n tk
rJ   tdƒ‚Y nX | j}| jj}| jj	j}|dkr–|d r€|| | }|| | }|d }qdt
|| jƒS )Nzexponent of type 'int' expectedr   znegative powers are not definedé   )r   ÚintÚ	TypeErrorr5   r-   Ú
ValueErrorr   r   r'   r3   r   )r   ÚnÚbÚmÚrr   r   r   Ú__pow__ª   s     


zExtensionElement.__pow__c                 C   s*   t |tƒr"| j|jko | j|jkS tS d S r   )r   r   r   r   r"   r   r   r   r   Ú__eq__¾   s    
zExtensionElement.__eq__c                 C   s
   | |k S r   r   r   r   r   r   Ú__ne__Ä   s    zExtensionElement.__ne__c                 C   s   t | j| jfƒS r   )Úhashr   r   r   r   r   r   Ú__hash__Ç   s    zExtensionElement.__hash__c                 C   s   ddl m} ||  ¡ ƒS )Nr   )Ússtr)Zsympy.printing.strrJ   r   )r   rJ   r   r   r   Ú__str__Ê   s    zExtensionElement.__str__c                 C   s   | j jS r   )r   r*   r   r   r   r   r*   Ð   s    zExtensionElement.is_groundc                 C   s   | j  ¡ \}|S r   )r   Zto_list)r   Úcr   r   r   Ú	to_groundÔ   s    zExtensionElement.to_groundN)#Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   r   r   r   r   r    r$   Ú__radd__r%   r&   r(   Ú__rmul__r/   r5   r7   Ú__floordiv__r9   Ú__rfloordiv__r;   r<   rE   rF   rG   rI   rK   Ú__repr__Úpropertyr*   rM   r   r   r   r   r	      s@   

r	   c                   @   sª   e Zd ZdZdZeZdd„ Zdd„ Zdd„ Z	d	d
„ Z
dd„ ZeZedd„ ƒZd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#„ Zd$d%„ ZdS )'ÚMonogenicFiniteExtensionaà  
    Finite extension generated by an integral element.

    The generator is defined by a monic univariate
    polynomial derived from the argument ``mod``.

    A shorter alias is ``FiniteExtension``.

    Examples
    ========

    Quadratic integer ring $\mathbb{Z}[\sqrt2]$:

    >>> from sympy import Symbol, Poly
    >>> from sympy.polys.agca.extensions import FiniteExtension
    >>> x = Symbol('x')
    >>> R = FiniteExtension(Poly(x**2 - 2)); R
    ZZ[x]/(x**2 - 2)
    >>> R.rank
    2
    >>> R(1 + x)*(3 - 2*x)
    x - 1

    Finite field $GF(5^3)$ defined by the primitive
    polynomial $x^3 + x^2 + 2$ (over $\mathbb{Z}_5$).

    >>> F = FiniteExtension(Poly(x**3 + x**2 + 2, modulus=5)); F
    GF(5)[x]/(x**3 + x**2 + 2)
    >>> F.basis
    (1, x, x**2)
    >>> F(x + 3)/(x**2 + 2)
    -2*x**2 + x + 2

    Function field of an elliptic curve:

    >>> t = Symbol('t')
    >>> FiniteExtension(Poly(t**2 - x**3 - x + 1, t, field=True))
    ZZ(x)[t]/(t**2 - x**3 - x + 1)

    Tc                    sÊ   t |tƒr|jstdƒ‚|jdd�}| ¡ ˆ_|ˆ_|jˆ_	|j
 ˆ_
}|j|jŽ ˆ_ˆ ˆjj¡ˆ_ˆ ˆjj¡ˆ_ˆjjd ‰ ˆjjd ˆ_ˆ ˆ ¡ˆ_t‡ ‡fdd„tˆjƒD ƒƒˆ_ˆj
jˆ_d S )Nz!modulus must be a univariate PolyF)Úautor   c                 3   s   | ]}ˆ  ˆ | ¡V  qd S r   ©r   )Ú.0Úi©Úgenr   r   r   Ú	<genexpr>  s     z4MonogenicFiniteExtension.__init__.<locals>.<genexpr>)r   r   Zis_univariater?   ZmonicZdegreeZrankÚmodulusr   r'   r+   Zold_poly_ringZgensr1   r   r:   r3   ÚsymbolsÚsymbolÚ	generatorÚtupleÚrangeZbasisr)   )r   r'   Údomr   r^   r   r     s    
 z!MonogenicFiniteExtension.__init__c                 C   s   | j  |¡}t|| j | ƒS r   ©r1   r   r   r'   )r   Úargr   r   r   r   Únew$  s    zMonogenicFiniteExtension.newc                 C   s   t |tƒsdS | j|jkS ©NF)r   ÚFiniteExtensionra   )r   Úotherr   r   r   rF   (  s    
zMonogenicFiniteExtension.__eq__c                 C   s   t | jj| jfƒS r   )rH   Ú	__class__rN   ra   ©r   r   r   r   rI   -  s    z!MonogenicFiniteExtension.__hash__c                 C   s   d| j | j ¡ f S )Nz%s/(%s))r1   ra   r   ro   r   r   r   rK   0  s    z MonogenicFiniteExtension.__str__c                 C   s   | j jS r   )r+   Úhas_CharacteristicZeroro   r   r   r   rp   5  s    z/MonogenicFiniteExtension.has_CharacteristicZeroc                 C   s
   | j  ¡ S r   )r+   Úcharacteristicro   r   r   r   rq   9  s    z'MonogenicFiniteExtension.characteristicNc                 C   s   | j  ||¡}t|| j | ƒS r   rh   ©r   r   Úbaser   r   r   r   r   <  s    z MonogenicFiniteExtension.convertc                 C   s   | j  ||¡}t|| j | ƒS r   rh   rr   r   r   r   Úconvert_from@  s    z%MonogenicFiniteExtension.convert_fromc                 C   s   | j  |j¡S r   )r1   r   r   ©r   r   r   r   r   r   D  s    z!MonogenicFiniteExtension.to_sympyc                 C   s
   |   |¡S r   r[   ru   r   r   r   Ú
from_sympyG  s    z#MonogenicFiniteExtension.from_sympyc                 C   s   | j  |¡}|  |¡S r   )ra   Ú
set_domainrn   )r   ÚKr'   r   r   r   rw   J  s    z#MonogenicFiniteExtension.set_domainc                 G   s(   | j |krtdƒ‚| jj|Ž }|  |¡S )Nz+Can not drop generator from FiniteExtension)rc   r   r+   Údroprw   )r   rb   rx   r   r   r   ry   N  s    
zMonogenicFiniteExtension.dropc                 C   s   |   ||¡S r   )r2   )r   r   r   r   r   r   ÚquoT  s    zMonogenicFiniteExtension.quoc                 C   s"   | j  |j|j¡}t|| j | ƒS r   )r1   r2   r   r   r'   )r   r   r   r   r   r   r   r2   W  s    zMonogenicFiniteExtension.exquoc                 C   s   dS rk   r   ©r   Úar   r   r   Úis_negative[  s    z$MonogenicFiniteExtension.is_negativec                 C   s(   | j rt|ƒS |jr$| j | ¡ ¡S d S r   )r)   r   r*   r+   r,   rM   r{   r   r   r   r,   ^  s    z MonogenicFiniteExtension.is_unit)N)rN   rO   rP   rQ   Zis_FiniteExtensionr	   Zdtyper   rj   rF   rI   rK   rW   rX   rp   rq   r   rt   r   rv   rw   ry   rz   r2   r}   r,   r   r   r   r   rY   Û   s,   (

rY   N)rQ   Zsympy.polys.domains.domainr   Z!sympy.polys.domains.domainelementr   Zsympy.polys.polyerrorsr   r   r   Zsympy.polys.polytoolsr   Zsympy.printing.defaultsr   r	   r   rY   rl   r   r   r   r   Ú<module>   s    N 
