o
    jg$                     @   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   S/var/www/html/zoom/venv/lib/python3.10/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      zExtensionElement.as_exprc                 C   s
   t | jS r   )boolr   r   r   r   r   __bool__"      
zExtensionElement.__bool__c                 C   s   | S r   r   r   r   r   r   __pos__%      zExtensionElement.__pos__c                 C   s   t | j | jS r   )ExtElemr   r   r   r   r   r   __neg__(      zExtensionElement.__neg__c                 C   sJ   t |tr|j| jkr|jS d S z
| j|}|jW S  ty$   Y d S w 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 r   r$   r   r   r   NotImplementedr   r#   r   r   r   r   __add__8      
zExtensionElement.__add__c                 C   s(   |  |}|d urt| j| | jS tS r   r%   r'   r   r   r   __sub__A   r)   zExtensionElement.__sub__c                 C   s(   |  |}|d urt|| j | jS tS r   r%   r'   r   r   r   __rsub__H   r)   zExtensionElement.__rsub__c                 C   s0   |  |}|d urt| j| | jj | jS tS r   )r$   r   r   r   modr&   r'   r   r   r   __mul__O   s   
zExtensionElement.__mul__c                 C   sT   | st d| jjrdS | jjr| jj| j rdS d|  d| j d}t|)z5Raise if division is not implemented for this divisorzZero divisorTzCan not invert z in z7. Only division by invertible constants is implemented.)	r   r   is_Fieldr   	is_grounddomainis_unit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 )zMultiplicative inverse.

        Raises
        ======

        NotInvertible
            If the element is a zero divisor.

        )
r5   r   r.   r   invertr,   ringexquooner   )r   invrepRr   r   r   inversei   s   
zExtensionElement.inversec                 C   sV   |  |}|d u rtS t|| j}z	| }W | | S  ty*   t|  d| w )Nz / )r$   r&   r   r   r<   r   ZeroDivisionError)r   r#   r   ginvr   r   r   __truediv__}   s   

zExtensionElement.__truediv__c                 C   s.   z| j |}W ||  S  ty   t Y S w r   r   r!   r   r&   r"   r   r   r   __rtruediv__      zExtensionElement.__rtruediv__c                 C   sV   |  |}|d u rtS t|| j}z	|  W | jjS  ty*   t|  d| w )Nz % )r$   r&   r   r   r5   r   r=   zeror'   r   r   r   __mod__   s   

zExtensionElement.__mod__c                 C   s.   z| j |}W ||  S  ty   t Y S w r   r@   r"   r   r   r   __rmod__   rB   zExtensionElement.__rmod__c                 C   s   t |ts	td|dk r#z
|  | } }W n ty"   tdw | j}| jj}| jj	j}|dkrK|d r=|| | }|| | }|d }|dks3t
|| jS )Nzexponent of type 'int' expectedr   znegative powers are not defined   )r    int	TypeErrorr<   r3   
ValueErrorr   r   r,   r9   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 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__   r   zExtensionElement.__ne__c                 C   s   t | j| jfS r   )hashr   r   r   r   r   r   __hash__   r   zExtensionElement.__hash__c                 C   s   ddl m} ||  S )Nr   )sstr)sympy.printing.strrS   r   )r   rS   r   r   r   __str__   s   zExtensionElement.__str__c                 C      | j jS r   )r   r/   r   r   r   r   r/         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$   r(   __radd__r*   r+   r-   __rmul__r5   r<   r?   __floordiv__rA   __rfloordiv__rD   rE   rN   rO   rP   rR   rU   __repr__propertyr/   rZ   r   r   r   r   r	      sB    

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   is_univariaterH   monicdegreerankmodulusr   r,   r0   old_poly_ringgensr7   r!   rC   r9   symbolssymbol	generatortuplerangebasisr.   )r   r,   domr   rk   r   r     s   
 z!MonogenicFiniteExtension.__init__c                 C   s   | j |}t|| j | S r   r7   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    FiniteExtensionrr   )r   otherr   r   r   rO   (  s   
zMonogenicFiniteExtension.__eq__c                 C   s   t | jj| jfS r   )rQ   	__class__r[   rr   r   r   r   r   rR   -  s   z!MonogenicFiniteExtension.__hash__c                 C   s   d| j | j f S )Nz%s/(%s))r7   rr   r   r   r   r   r   rU   0  s   z MonogenicFiniteExtension.__str__c                 C   rV   r   )r0   has_CharacteristicZeror   r   r   r   r   5  rW   z/MonogenicFiniteExtension.has_CharacteristicZeroc                 C   s
   | j  S r   )r0   characteristicr   r   r   r   r   9  r   z'MonogenicFiniteExtension.characteristicNc                 C      | j ||}t|| j | S r   r|   r   r   baser   r   r   r   r!   <     z MonogenicFiniteExtension.convertc                 C   r   r   r|   r   r   r   r   convert_from@  r   z%MonogenicFiniteExtension.convert_fromc                 C   s   | j |jS r   )r7   r   r   r   r   r   r   r   r   D  s   z!MonogenicFiniteExtension.to_sympyc                 C   s
   |  |S r   rh   r   r   r   r   
from_sympyG  r   z#MonogenicFiniteExtension.from_sympyc                 C   s   | j |}| |S r   )rr   
set_domainr   )r   Kr,   r   r   r   r   J  s   
z#MonogenicFiniteExtension.set_domainc                 G   s(   | j |v r	td| jj| }| |S )Nz+Can not drop generator from FiniteExtension)rv   r   r0   dropr   )r   ru   r   r   r   r   r   N  s   

zMonogenicFiniteExtension.dropc                 C   s   |  ||S r   )r8   )r   r   r#   r   r   r   quoT  r   zMonogenicFiniteExtension.quoc                 C   s"   | j |j|j}t|| j | S r   )r7   r8   r   r   r,   )r   r   r#   r   r   r   r   r8   W  s   zMonogenicFiniteExtension.exquoc                 C   s   dS r   r   r   ar   r   r   is_negative[  r   z$MonogenicFiniteExtension.is_negativec                 C   s(   | j rt|S |jr| j| S d S r   )r.   r   r/   r0   r1   rZ   r   r   r   r   r1   ^  s
   z MonogenicFiniteExtension.is_unitr   )r[   r\   r]   r^   is_FiniteExtensionr	   dtyper   r~   rO   rR   rU   rd   re   r   r   r!   r   r   r   r   r   r   r8   r   r1   r   r   r   r   rf      s.    (

rf   N)r^   sympy.polys.domains.domainr   !sympy.polys.domains.domainelementr   sympy.polys.polyerrorsr   r   r   sympy.polys.polytoolsr   sympy.printing.defaultsr   r	   r   rf   r   r   r   r   r   <module>   s     N 
