
    sg$                         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ee      ZeZ G d	 d
e      ZeZy)z"Finite extensions of ring domains.    )Domain)DomainElement)CoercionFailedNotInvertibleGeneratorsError)Poly)DefaultPrintingc                       e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZeZd Zd Zd ZeZd Zd Zd ZeZd ZeZd Zd Zd Zd Zd Zd Zd ZeZe d        Z!d Z"y)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                      || _         || _        y Nr   )selfr   r   s      N/var/www/html/venv/lib/python3.12/site-packages/sympy/polys/agca/extensions.py__init__zExtensionElement.__init__   s        c                     | j                   S r   )r   fs    r   parentzExtensionElement.parent   s    uur   c                 8    | j                   j                  |       S r   )r   to_sympyr   s    r   as_exprzExtensionElement.as_expr   s    uu~~a  r   c                 ,    t        | j                        S r   )boolr   r   s    r   __bool__zExtensionElement.__bool__"   s    AEE{r   c                     | S r    r   s    r   __pos__zExtensionElement.__pos__%   s    r   c                 D    t        | j                   | j                        S r   )ExtElemr   r   r   s    r   __neg__zExtensionElement.__neg__(   s    vquu%%r   c                     t        |t              r&|j                  | j                  k(  r|j                  S y 	 | j                  j	                  |      }|j                  S # t
        $ r Y y w xY wr   )
isinstancer#   r   r   convertr   r   gs     r   _get_repzExtensionElement._get_rep+   sY    a!uu~uuEEMM!$uu! s   &A 	A+*A+c                 z    | j                  |      }|#t        | j                  |z   | j                        S t        S r   r*   r#   r   r   NotImplementedr   r)   r   s      r   __add__zExtensionElement.__add__8   3    jjm?1553;..!!r   c                 z    | j                  |      }|#t        | j                  |z
  | j                        S t        S r   r,   r.   s      r   __sub__zExtensionElement.__sub__A   r0   r   c                 z    | j                  |      }|#t        || j                  z
  | j                        S t        S r   r,   r.   s      r   __rsub__zExtensionElement.__rsub__H   s3    jjm?3;..!!r   c                     | j                  |      }|:t        | j                  |z  | j                  j                  z  | j                        S t
        S r   )r*   r#   r   r   modr-   r.   s      r   __mul__zExtensionElement.__mul__O   s@    jjm?AEECK155994aee<<!!r   c                 .   | st        d      | j                  j                  ry| j                  j                  r>| j                  j
                  j                  | j                  j                               ry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   msgs     r   	_divcheckzExtensionElement._divcheckX   sw    //UU^^UU__!5!5aeehhj!A %QCtAEE7 3L LC%c**r   c                 R   | j                          | j                  j                  r0| j                  j	                  | j                  j
                        }n<| j                  j                  }|j                  |j                  | j                        }t        || j                        S )zMultiplicative inverse.

        Raises
        ======

        NotInvertible
            If the element is a zero divisor.

        )
r@   r   r9   r   invertr6   ringexquooner#   )r   invrepRs      r   inversezExtensionElement.inversei   sh     	
55>>UU\\!%%)),F

AWWQUUAEE*Fvquu%%r   c                     | j                  |      }|t        S t        || j                        }	 |j	                         }| |z  S # t
        $ r t        |  d|       w xY w)Nz / )r*   r-   r#   r   rH   r   ZeroDivisionError)r   r)   r   ginvs       r   __truediv__zExtensionElement.__truediv__}   sk    jjm;!!C	299;D 4x  	2#qcQCL11	2s   A A c                 n    	 | j                   j                  |      }|| z  S # t        $ r	 t        cY S w xY wr   r   r'   r   r-   r(   s     r   __rtruediv__zExtensionElement.__rtruediv__   ;    	"a A 1u  	"!!	"   " 44c                     | j                  |      }|t        S t        || j                        }	 |j	                          | j                  j                  S # t
        $ r t        |  d|       w xY w)Nz % )r*   r-   r#   r   r@   r   rJ   zeror.   s      r   __mod__zExtensionElement.__mod__   sn    jjm;!!C	2KKM
 uuzz	  	2#qcQCL11	2s   A A1c                 n    	 | j                   j                  |      }|| z  S # t        $ r	 t        cY S w xY wr   rN   r(   s     r   __rmod__zExtensionElement.__rmod__   rP   rQ   c                    t        |t              st        d      |dk  r	 | j                         | }} | j                  }| j                  j                  }| j                  j                  j                  }|dkD  r |dz  r||z  |z  }||z  |z  }|dz  }|dkD  r t        || j                        S # t        $ r t        d      w xY w)Nzexponent of type 'int' expectedr   znegative powers are not defined   )r&   int	TypeErrorrH   r>   
ValueErrorr   r   r6   rE   r#   )r   nbmrs        r   __pow__zExtensionElement.__pow__   s    !S!=>>q5Dyy{QB1 EEEEIIEEIIMM!e1uqSAI1	A!GA	 !e q!%%   ' D !BCCDs   B2 2Cc                     t        |t              r4| j                  |j                  k(  xr | j                  |j                  k(  S t        S r   )r&   r#   r   r   r-   r(   s     r   __eq__zExtensionElement.__eq__   s5    a!55AEE>4aeequun4!!r   c                     | |k(   S r   r    r(   s     r   __ne__zExtensionElement.__ne__   s    6zr   c                 D    t        | j                  | j                  f      S r   )hashr   r   r   s    r   __hash__zExtensionElement.__hash__   s    QUUAEEN##r   c                 :    ddl m}  || j                               S )Nr   )sstr)sympy.printing.strri   r   )r   ri   s     r   __str__zExtensionElement.__str__   s    +AIIK  r   c                 .    | j                   j                  S r   )r   r:   r   s    r   r:   zExtensionElement.is_ground   s    uur   c                 >    | j                   j                         \  }|S r   )r   to_list)r   cs     r   	to_groundzExtensionElement.to_ground   s    eemmor   N)#__name__
__module____qualname____doc__	__slots__r   r   r   r   r!   r$   r*   r/   __radd__r2   r4   r7   __rmul__r@   rH   rL   __floordiv__rO   __rfloordiv__rT   rV   r`   rb   rd   rg   rk   __repr__propertyr:   rp   r    r   r   r   r      s    	 I!&" H""" H+"&( L !M!("$! H r   r   c                       e Zd ZdZdZeZd Zd Zd Z	d Z
d ZeZed        Zd	 ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zy
)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                     t        |t              r|j                  st        d      |j	                  d      }|j                          _        | _        |j                   _	        |j                  x _
        } |j                  |j                    _         j                   j                  j                         _         j                   j                  j                          _         j                  j                  d    j                  j"                  d    _         j                         _        t)         fdt+         j                        D               _         j                  j.                   _        y )Nz!modulus must be a univariate PolyF)autor   c              3   F   K   | ]  }j                  |z          y wr   r'   ).0igenr   s     r   	<genexpr>z4MonogenicFiniteExtension.__init__.<locals>.<genexpr>  s     JA4<<Q/Js   !)r&   r   is_univariaterZ   monicdegreerankmodulusr   r6   r;   old_poly_ringgensrC   r'   rS   rE   symbolssymbol	generatortuplerangebasisr9   )r   r6   domr   s   `  @r   r   z!MonogenicFiniteExtension.__init__  s   3%#*;*;?@@ iiUi#JJL	77JJ&c%C%%sxx0	LL0	<<		.iinnQii''*c*Jtyy9IJJ
 ,,r   c                 j    | j                   j                  |      }t        || j                  z  |       S r   rC   r'   r#   r6   )r   argr   s      r   newzMonogenicFiniteExtension.new$  s+    ii$sTXX~t,,r   c                 V    t        |t              sy| j                  |j                  k(  S NF)r&   FiniteExtensionr   )r   others     r   rb   zMonogenicFiniteExtension.__eq__(  s"    %1||u}},,r   c                 X    t        | j                  j                  | j                  f      S r   )rf   	__class__rq   r   r   s    r   rg   z!MonogenicFiniteExtension.__hash__-  s     T^^,,dll;<<r   c                 V    | j                   d| j                  j                         dS )Nz/())rC   r   r   r   s    r   rk   z MonogenicFiniteExtension.__str__0  s     IIt||';';'=>>r   c                 .    | j                   j                  S r   )r;   has_CharacteristicZeror   s    r   r   z/MonogenicFiniteExtension.has_CharacteristicZero5  s    {{111r   c                 6    | j                   j                         S r   )r;   characteristicr   s    r   r   z'MonogenicFiniteExtension.characteristic9  s    {{))++r   Nc                 l    | j                   j                  ||      }t        || j                  z  |       S r   r   r   r   baser   s       r   r'   z MonogenicFiniteExtension.convert<  -    ii4(sTXX~t,,r   c                 l    | j                   j                  ||      }t        || j                  z  |       S r   r   r   s       r   convert_fromz%MonogenicFiniteExtension.convert_from@  r   r   c                 L    | j                   j                  |j                        S r   )rC   r   r   r   r   s     r   r   z!MonogenicFiniteExtension.to_sympyD  s    yy!!!%%((r   c                 $    | j                  |      S r   r   r   s     r   
from_sympyz#MonogenicFiniteExtension.from_sympyG  s    ||Ar   c                 Z    | j                   j                  |      }| j                  |      S r   )r   
set_domainr   )r   Kr6   s      r   r   z#MonogenicFiniteExtension.set_domainJ  s%    ll%%a(~~c""r   c                     | j                   |v rt        d       | j                  j                  | }| j	                  |      S )Nz+Can not drop generator from FiniteExtension)r   r   r;   dropr   )r   r   r   s      r   r   zMonogenicFiniteExtension.dropN  s?    ;;'!!"OPPDKKg&q!!r   c                 &    | j                  ||      S r   )rD   )r   r   r)   s      r   quozMonogenicFiniteExtension.quoT  s    zz!Qr   c                     | j                   j                  |j                  |j                        }t        || j                  z  |       S r   )rC   rD   r   r#   r6   )r   r   r)   r   s       r   rD   zMonogenicFiniteExtension.exquoW  s3    iiooaeeQUU+sTXX~t,,r   c                      yr   r    r   as     r   is_negativez$MonogenicFiniteExtension.is_negative[  s    r   c                     | j                   rt        |      S |j                  r)| j                  j	                  |j                               S y r   )r9   r   r:   r;   r<   rp   r   s     r   r<   z MonogenicFiniteExtension.is_unit^  s9    ==7N[[;;&&q{{}55 r   r   )rq   rr   rs   rt   is_FiniteExtensionr   dtyper   r   rb   rg   rk   rz   r{   r   r   r'   r   r   r   r   r   r   rD   r   r<   r    r   r   r}   r}      s~    'P E-8--
=? H2 2,--)#" -6r   r}   N)rt   sympy.polys.domains.domainr   !sympy.polys.domains.domainelementr   sympy.polys.polyerrorsr   r   r   sympy.polys.polytoolsr   sympy.printing.defaultsr	   r   r#   r}   r   r    r   r   <module>r      sL    ( - ;  & 3K}o KZ G6v G6R +r   