a
    RG5d#                     @   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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-d. Z d/d0 Z!d1S )2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   W/var/www/html/django/DPS/env/lib/python3.9/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
   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   sP   t |tr"|j| jkr|jS d S n*z| j|}|jW S  tyJ   Y d S 0 d S r   )
isinstancer   r   r   convertr   r   gr   r   r   _get_rep(   s    
zExtensionElement._get_repc                 C   s,   |  |}|d ur$t| j| | jS tS d S r   r   r   r   r   NotImplementedr   r   r   r   r   r   __add__5   s    
zExtensionElement.__add__c                 C   s,   |  |}|d ur$t| j| | jS tS d S r   r   r!   r   r   r   __sub__>   s    
zExtensionElement.__sub__c                 C   s,   |  |}|d ur$t|| j | jS tS d S r   r   r!   r   r   r   __rsub__E   s    
zExtensionElement.__rsub__c                 C   s4   |  |}|d ur,t| j| | jj | jS tS d S r   )r   r   r   r   modr    r!   r   r   r   __mul__L   s    
zExtensionElement.__mul__c                 C   s\   | st dnJ| jjrdS | jjr<| jj| jjd r<dS d|  d| j d}t|dS )z5Raise if division is not implemented for this divisorzZero divisorTr   zCan not invert z in z7. Only division by invertible constants is implemented.N)r   r   is_Fieldr   	is_grounddomainis_unitNotImplementedError)r   msgr   r   r   	_divcheckU   s    
zExtensionElement._divcheckc                 C   sF   |    | jjr"| j| jj}n| jj}||j| j}t	|| jS )zMultiplicative inverse.

        Raises
        ======

        NotInvertible
            If the element is a zero divisor.

        )
r-   r   r'   r   invertr%   ringexquooner   )r   ZinvrepRr   r   r   inversef   s    
zExtensionElement.inversec                 C   s\   |  |}|d u rtS t|| j}z| }W n$ tyR   t|  d| Y n0 | | S )Nz / )r   r    r   r   r3   r   ZeroDivisionError)r   r   r   Zginvr   r   r   __truediv__z   s    
zExtensionElement.__truediv__c                 C   s0   z| j |}W n ty&   t Y S 0 ||  S r   r   r   r   r    r   r   r   r   __rtruediv__   s
    
zExtensionElement.__rtruediv__c                 C   s\   |  |}|d u rtS t|| j}z|  W n$ tyR   t|  d| Y n0 | jjS )Nz % )r   r    r   r   r-   r   r4   zeror!   r   r   r   __mod__   s    
zExtensionElement.__mod__c                 C   s0   z| j |}W n ty&   t Y S 0 ||  S r   r6   r   r   r   r   __rmod__   s
    
zExtensionElement.__rmod__c                 C   s   t |tstd|dk rJz|  |  } }W n tyH   tdY n0 | j}| jj}| jj	j}|dkr|d r~|| | }|| | }|d }qbt
|| jS )Nzexponent of type 'int' expectedr   znegative powers are not defined   )r   int	TypeErrorr3   r+   
ValueErrorr   r   r%   r1   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} || jS )Nr   )sstr)sympy.printing.strrH   r   )r   rH   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   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"   __radd__r#   r$   r&   __rmul__r-   r3   r5   __floordiv__r7   __rfloordiv__r9   r:   rC   rD   rE   rG   rJ   __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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pZ|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>      z4MonogenicFiniteExtension.__init__.<locals>.<genexpr>)r   r   is_univariater=   monicdegreerankmodulusr   r%   r)   r/   old_poly_ringgensr   r8   r1   symbolssymbol	generatortuplerangebasisr'   )r   r%   domr   r^   r   r     s    
 z!MonogenicFiniteExtension.__init__c                 C   s   | j |}t|| j | S r   r/   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   FiniteExtensionrf   )r   otherr   r   r   rD   %  s    
zMonogenicFiniteExtension.__eq__c                 C   s   t | jj| jfS r   )rF   	__class__rN   rf   r   r   r   r   rG   *  s    z!MonogenicFiniteExtension.__hash__c                 C   s   d| j | j f S )Nz%s/(%s))r/   rf   as_exprrw   r   r   r   rJ   -  s    z MonogenicFiniteExtension.__str__Nc                 C   s   | j ||}t|| j | S r   rp   r   r   baser   r   r   r   r   2  s    z MonogenicFiniteExtension.convertc                 C   s   | j ||}t|| j | S r   rp   ry   r   r   r   convert_from6  s    z%MonogenicFiniteExtension.convert_fromc                 C   s   | j |jS r   )r/   to_sympyr   r   r   r   r   r   r|   :  s    z!MonogenicFiniteExtension.to_sympyc                 C   s
   |  |S r   r[   r}   r   r   r   
from_sympy=  s    z#MonogenicFiniteExtension.from_sympyc                 C   s   | j |}| |S r   )rf   
set_domainrv   )r   Kr%   r   r   r   r   @  s    z#MonogenicFiniteExtension.set_domainc                 G   s(   | j |v rtd| jj| }| |S )Nz+Can not drop generator from FiniteExtension)rj   r   r)   dropr   )r   ri   r   r   r   r   r   D  s    
zMonogenicFiniteExtension.dropc                 C   s   |  ||S r   )r0   )r   r   r   r   r   r   quoJ  s    zMonogenicFiniteExtension.quoc                 C   s"   | j |j|j}t|| j | S r   )r/   r0   r   r   r%   )r   r   r   r   r   r   r   r0   M  s    zMonogenicFiniteExtension.exquoc                 C   s   dS rs   r   r   ar   r   r   is_negativeQ  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*   T  s    z MonogenicFiniteExtension.is_unit)N)rN   rO   rP   rQ   is_FiniteExtensionr	   dtyper   rr   rD   rG   rJ   rW   r   r{   r|   r~   r   r   r   r0   r   r*   r   r   r   r   rY      s&   (
rY   N)rQ   Zsympy.polys.domains.domainr   !sympy.polys.domains.domainelementr   sympy.polys.polyerrorsr   r   r   sympy.polys.polytoolsr   sympy.printing.defaultsr   r	   r   rY   rt   r   r   r   r   <module>   s    K 