
    g$                         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dS )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"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                 "    || _         || _        d S Nr   )selfr   r   s      W/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/polys/agca/extensions.py__init__zExtensionElement.__init__   s        c                     | j         S r   )r   fs    r   parentzExtensionElement.parent   s	    ur   c                 6    | j                             |           S r   )r   to_sympyr   s    r   as_exprzExtensionElement.as_expr   s    u~~a   r   c                 *    t          | j                  S r   )boolr   r   s    r   __bool__zExtensionElement.__bool__"   s    AE{{r   c                     | S r    r   s    r   __pos__zExtensionElement.__pos__%   s    r   c                 8    t          | j         | j                  S r   )ExtElemr   r   r   s    r   __neg__zExtensionElement.__neg__(   s    vqu%%%r   c                     t          |t                    r|j        | j        k    r|j        S d S 	 | j                            |          }|j        S # t
          $ r Y d S w xY wr   )
isinstancer#   r   r   convertr   r   gs     r   _get_repzExtensionElement._get_rep+   sn    a!! 
	u~~utEMM!$$u!   tts    A 
AAc                 x    |                      |          }|t          | j        |z   | j                  S t          S r   r*   r#   r   r   NotImplementedr   r)   r   s      r   __add__zExtensionElement.__add__8   4    jjmm?153;...!!r   c                 x    |                      |          }|t          | j        |z
  | j                  S t          S r   r,   r.   s      r   __sub__zExtensionElement.__sub__A   r0   r   c                 x    |                      |          }|t          || j        z
  | j                  S t          S r   r,   r.   s      r   __rsub__zExtensionElement.__rsub__H   s4    jjmm?3;...!!r   c                     |                      |          }|*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mm?AECK1594ae<<<!!r   c                    | st          d          | j        j        rdS | j        j        r8| 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   msgs     r   	_divcheckzExtensionElement._divcheckX   s     	+///U^ 	+4U_ 		+!5!5aehhjj!A!A 		+4LQ L LAE L L LC%c***r   c                    |                                   | 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   r9   r   invertr6   ringexquooner#   )r   invrepRs      r   inversezExtensionElement.inversei   sh     	
5> 	+U\\!%),,FF
AWWQUAE**Fvqu%%%r   c                     |                      |          }|t          S t          || j                  }	 |                                }n"# t
          $ r t          |  d|           w xY w| |z  S )Nz / )r*   r-   r#   r   rH   r   ZeroDivisionError)r   r)   r   ginvs       r   __truediv__zExtensionElement.__truediv__}   s    jjmm;!!C	299;;DD 	2 	2 	2#qLLQLL111	2 4x   A
 
A)c                 r    	 | j                             |          }n# t          $ r
 t          cY S w xY w|| z  S r   r   r'   r   r-   r(   s     r   __rtruediv__zExtensionElement.__rtruediv__   L    	"a  AA 	" 	" 	"!!!!	"1u    11c                     |                      |          }|t          S t          || j                  }	 |                                 n"# t
          $ r t          |  d|           w xY w| j        j        S )Nz % )r*   r-   r#   r   r@   r   rJ   zeror.   s      r   __mod__zExtensionElement.__mod__   s    jjmm;!!C	2KKMMMM 	2 	2 	2#qLLQLL111	2 uzrM   c                 r    	 | j                             |          }n# t          $ r
 t          cY S w xY w|| z  S r   rO   r(   s     r   __rmod__zExtensionElement.__rmod__   rQ   rR   c                    t          |t                    st          d          |dk     r6	 |                                 | }} n# t          $ r t          d          w xY w| j        }| j        j        }| j        j	        j        }|dk    r |dz  r||z  |z  }||z  |z  }|dz  }|dk     t          || j                  S )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!! 	?=>>>q55Dyy{{QB1& D D D !BCCCD EEIEIM!ee1u qSAI1	A!GA	 !ee q!%   s   A Ac                 z    t          |t                    r | j        |j        k    o| j        |j        k    S t          S r   )r&   r#   r   r   r-   r(   s     r   __eq__zExtensionElement.__eq__   s5    a!! 	"5AE>4aequn4!!r   c                     | |k     S r   r    r(   s     r   __ne__zExtensionElement.__ne__   s    6zr   c                 8    t          | j        | j        f          S r   )hashr   r   r   s    r   __hash__zExtensionElement.__hash__   s    QUAEN###r   c                 H    ddl m}  ||                                           S )Nr   )sstr)sympy.printing.strrj   r   )r   rj   s     r   __str__zExtensionElement.__str__   s,    ++++++tAIIKK   r   c                     | j         j        S r   )r   r:   r   s    r   r:   zExtensionElement.is_ground   s    ur   c                 <    | j                                         \  }|S r   )r   to_list)r   cs     r   	to_groundzExtensionElement.to_ground   s    emmoor   N)#__name__
__module____qualname____doc__	__slots__r   r   r   r   r!   r$   r*   r/   __radd__r2   r4   r7   __rmul__r@   rH   rL   __floordiv__rP   __rfloordiv__rU   rW   ra   rc   re   rh   rl   __repr__propertyr:   rq   r    r   r   r   r      s       	 	 I    ! ! !    & & &  " " " H" " "" " "" " " H+ + +"& & &(   L   !M    ! ! !(" " "  $ $ $! ! ! H  X    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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                     t          |t                    r|j        st          d          |                    d          }|                                 _        | _        |j         _	        |j
        x _
        } |j        |j          _                              j        j                   _                              j        j                   _         j        j        d          j        j        d          _                                        _        t)           fdt+           j                  D                        _         j
        j         _        d S )Nz!modulus must be a univariate PolyF)autor   c              3   H   K   | ]}                     |z            V  d S r   r'   ).0igenr   s     r   	<genexpr>z4MonogenicFiniteExtension.__init__.<locals>.<genexpr>  s3      JJA4<<Q//JJJJJJr   )r&   r   is_univariater[   monicdegreerankmodulusr   r6   r;   old_poly_ringgensrC   r'   rT   rE   symbolssymbol	generatortuplerangebasisr9   )r   r6   domr   s   `  @r   r   z!MonogenicFiniteExtension.__init__  s)   3%% 	A#*; 	A?@@@ iiUi##JJLL	7J&c%C%sx0	LL00	<<	..inQi'*c**JJJJJty9I9IJJJJJ
 ,r   c                 f    | j                             |          }t          || j        z  |           S r   rC   r'   r#   r6   )r   argr   s      r   newzMonogenicFiniteExtension.new$  s-    i$$sTX~t,,,r   c                 P    t          |t                    sdS | j        |j        k    S NF)r&   FiniteExtensionr   )r   others     r   rc   zMonogenicFiniteExtension.__eq__(  s(    %11 	5|u},,r   c                 B    t          | j        j        | j        f          S r   )rg   	__class__rr   r   r   s    r   rh   z!MonogenicFiniteExtension.__hash__-  s    T^,dl;<<<r   c                 J    | j         d| j                                        dS )Nz/())rC   r   r   r   s    r   rl   z MonogenicFiniteExtension.__str__0  s'     IIIt|';';'='='='=>>r   c                     | j         j        S r   )r;   has_CharacteristicZeror   s    r   r   z/MonogenicFiniteExtension.has_CharacteristicZero5  s    {11r   c                 4    | j                                         S r   )r;   characteristicr   s    r   r   z'MonogenicFiniteExtension.characteristic9  s    {))+++r   Nc                 h    | j                             ||          }t          || j        z  |           S r   r   r   r   baser   s       r   r'   z MonogenicFiniteExtension.convert<  /    i4((sTX~t,,,r   c                 h    | j                             ||          }t          || j        z  |           S r   r   r   s       r   convert_fromz%MonogenicFiniteExtension.convert_from@  r   r   c                 @    | j                             |j                  S r   )rC   r   r   r   r   s     r   r   z!MonogenicFiniteExtension.to_sympyD  s    y!!!%(((r   c                 ,    |                      |          S r   r   r   s     r   
from_sympyz#MonogenicFiniteExtension.from_sympyG  s    ||Ar   c                 `    | j                             |          }|                     |          S r   )r   
set_domainr   )r   Kr6   s      r   r   z#MonogenicFiniteExtension.set_domainJ  s)    l%%a((~~c"""r   c                 z    | j         |v rt          d           | j        j        | }|                     |          S )Nz+Can not drop generator from FiniteExtension)r   r   r;   dropr   )r   r   r   s      r   r   zMonogenicFiniteExtension.dropN  sA    ;'!!!"OPPPDKg&q!!!r   c                 .    |                      ||          S r   )rD   )r   r   r)   s      r   quozMonogenicFiniteExtension.quoT  s    zz!Qr   c                 |    | j                             |j        |j                  }t          || j        z  |           S r   )rC   rD   r   r#   r6   )r   r   r)   r   s       r   rD   zMonogenicFiniteExtension.exquoW  s1    iooaeQU++sTX~t,,,r   c                     dS r   r    r   as     r   is_negativez$MonogenicFiniteExtension.is_negative[  s    ur   c                     | j         rt          |          S |j        r,| j                            |                                          S d S r   )r9   r   r:   r;   r<   rq   r   s     r   r<   z MonogenicFiniteExtension.is_unit^  sI    = 	677N[ 	6;&&q{{}}555	6 	6r   r   )rr   rs   rt   ru   is_FiniteExtensionr   dtyper   r   rc   rh   rl   r{   r|   r   r   r'   r   r   r   r   r   r   rD   r   r<   r    r   r   r~   r~      sA       ' 'P E- - -8- - -- - -
= = =? ? ? H2 2 X2, , ,- - - -- - -) ) )  # # #" " "     - - -  6 6 6 6 6r   r~   N)ru   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      s    ( ( - - - - - - ; ; ; ; ; ;          & & & & & & 3 3 3 3 3 3K K K K K}o K K KZ G6 G6 G6 G6 G6v G6 G6 G6R +r   