B
    ˜‘[(  ã               @   sX   d Z ddlmZmZ ddlmZ ddlmZ G dd„ deƒZ	e	Z
G dd„ deƒZeZd	S )
z"Finite extensions of ring domains.é    )Úprint_functionÚdivision)ÚCoercionFailed)ÚPolyc               @   s„   e Zd ZdZddg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dd„ Zdd„ ZeZdS )Ú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 )N)r   r   )Úselfr   r   © r
   ú:lib/python3.7/site-packages/sympy/polys/agca/extensions.pyÚ__init__   s    zExtensionElement.__init__c             C   s   t | j | jƒS )N)ÚExtElemr   r   )Úfr
   r
   r   Ú__neg__   s    zExtensionElement.__neg__c             C   sN   t |tƒr"|j| jkr|jS d S n(y| j |¡}|jS  tk
rH   d S X d S )N)Ú
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 )N)r   r   r   r   ÚNotImplemented)r   r   r   r
   r
   r   Ú__add__)   s    
zExtensionElement.__add__c             C   s,   |   |¡}|d k	r$t| j| | jƒS tS d S )N)r   r   r   r   r   )r   r   r   r
   r
   r   Ú__sub__2   s    
zExtensionElement.__sub__c             C   s,   |   |¡}|d k	r$t|| j | jƒS tS d S )N)r   r   r   r   r   )r   r   r   r
   r
   r   Ú__rsub__9   s    
zExtensionElement.__rsub__c             C   s4   |   |¡}|d k	r,t| j| | jj | jƒS tS d S )N)r   r   r   r   Úmodr   )r   r   r   r
   r
   r   Ú__mul__@   s    
zExtensionElement.__mul__c             C   s|   t |tƒstdƒ‚|dk r"tdƒ‚| j}| jj}| jjj}x4|dkrn|d rX|| | }|| | }|d }q<W t|| jƒS )Nzexponent of type 'int' expectedr   znegative powers are not definedé   )	r   ÚintÚ	TypeErrorÚ
ValueErrorr   r   r   Úoner   )r   ÚnÚbÚmÚrr
   r
   r   Ú__pow__I   s    


zExtensionElement.__pow__c             C   s*   t |tƒr"| j|jko | j|jkS tS d S )N)r   r   r   r   r   )r   r   r
   r
   r   Ú__eq__Z   s    
zExtensionElement.__eq__c             C   s
   | |k S )Nr
   )r   r   r
   r
   r   Ú__ne__`   s    zExtensionElement.__ne__c             C   s   t | j| jfƒS )N)Úhashr   r   )r   r
   r
   r   Ú__hash__c   s    zExtensionElement.__hash__c             C   s   ddl m} || jƒS )Nr   )Ússtr)Zsympy.printing.strr(   r   )r   r(   r
   r
   r   Ú__str__f   s    zExtensionElement.__str__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   r   r   Ú__radd__r   r   r   Ú__rmul__r#   r$   r%   r'   r)   Ú__repr__r
   r
   r
   r   r      s"   
r   c               @   s0   e Zd ZdZdd„ Zdd„ ZeZdd„ ZeZdS )	ÚMonogenicFiniteExtensionz£
    Finite extension generated by an integral element.

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

    c                sÎ   t |tƒr|jstdƒ‚| | ¡ ¡\}}|js8tdƒ‚| ¡ ˆ_	|ˆ_
|jˆ_|j ˆ_}|jjpn|j|jŽ ˆ_ˆ ˆjj¡ˆ_ˆ ˆjj¡ˆ_ˆjjd ‰ ˆ ˆ ¡ˆ_t‡ ‡fdd„tˆj	ƒD ƒƒˆ_d S )Nz!modulus must be a univariate Polyzmodulus could not be made monicr   c             3   s   | ]}ˆ  ˆ | ¡V  qd S )N)r   )Ú.0Úi)Úgenr	   r
   r   ú	<genexpr>‹   s   z4MonogenicFiniteExtension.__init__.<locals>.<genexpr>)r   r   Zis_univariater   ZdivZLCZis_zeror   ZdegreeZrankÚmodulusr   r   ZdomainÚringZold_poly_ringZgensr   Zzeror   Ú	generatorÚtupleÚrangeZbasis)r	   r   ZremZdomr
   )r5   r	   r   r   w   s     
z!MonogenicFiniteExtension.__init__c             C   s   | j  |¡}t|| j | ƒS )N)r8   r   r   r   )r	   r   r   r
   r
   r   r   Ž   s    z MonogenicFiniteExtension.convertc             C   s   d| j | j ¡ f S )Nz%s/(%s))r8   r7   Zas_expr)r	   r
   r
   r   r)   ”   s    z MonogenicFiniteExtension.__str__N)	r*   r+   r,   r-   r   r   Ú__call__r)   r1   r
   r
   r
   r   r2   o   s   r2   N)r-   Z
__future__r   r   Zsympy.polys.polyerrorsr   Zsympy.polys.polytoolsr   Úobjectr   r   r2   ZFiniteExtensionr
   r
   r
   r   Ú<module>   s   d*