
    \h$                         S r SSKJr  SSKJr  SSKJrJrJr  SSK	J
r
  SSKJr   " S S\\5      r\r " S	 S
\5      r\rg)z"Finite extensions of ring domains.    )Domain)DomainElement)CoercionFailedNotInvertibleGeneratorsError)Poly)DefaultPrintingc                       \ rS rSrSrSrS rS rS rS r	S r
S	 rS
 rS r\rS rS rS r\rS rS rS r\rS r\rS rS rS rS rS rS rS r\r \!S 5       r"S r#Sr$g)ExtensionElement   a  
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                     Xl         X l        g Nr   )selfr   r   s      S/var/www/auris/envauris/lib/python3.13/site-packages/sympy/polys/agca/extensions.py__init__ExtensionElement.__init__   s        c                     U R                   $ r   )r   fs    r   parentExtensionElement.parent   s    uur   c                 8    U R                   R                  U 5      $ r   )r   to_sympyr   s    r   as_exprExtensionElement.as_expr   s    uu~~a  r   c                 ,    [        U R                  5      $ r   )boolr   r   s    r   __bool__ExtensionElement.__bool__"   s    AEE{r   c                     U $ r    r   s    r   __pos__ExtensionElement.__pos__%   s    r   c                 D    [        U R                  * U R                  5      $ r   )ExtElemr   r   r   s    r   __neg__ExtensionElement.__neg__(   s    vquu%%r   c                     [        U[        5      (       a'  UR                  U R                  :X  a  UR                  $ g  U R                  R	                  U5      nUR                  $ ! [
         a     g f = fr   )
isinstancer)   r   r   convertr   r   gs     r   _get_repExtensionElement._get_rep+   s\    a!!uu~uuEEMM!$uu! s   &A% %
A21A2c                 |    U R                  U5      nUb#  [        U R                  U-   U R                  5      $ [        $ r   r1   r)   r   r   NotImplementedr   r0   r   s      r   __add__ExtensionElement.__add__8   3    jjm?1553;..!!r   c                 |    U R                  U5      nUb#  [        U R                  U-
  U R                  5      $ [        $ r   r4   r6   s      r   __sub__ExtensionElement.__sub__A   r9   r   c                 z    U R                  U5      nUb"  [        X R                  -
  U R                  5      $ [        $ r   r4   r6   s      r   __rsub__ExtensionElement.__rsub__H   s1    jjm?3;..!!r   c                     U R                  U5      nUb:  [        U R                  U-  U R                  R                  -  U R                  5      $ [
        $ r   )r1   r)   r   r   modr5   r6   s      r   __mul__ExtensionElement.__mul__O   s@    jjm?AEECK155994aee<<!!r   c                 V   U (       d  [        S5      eU R                  R                  (       a  gU R                  R                  (       aC  U R                  R
                  R                  U R                  R                  5       5      (       a  gSU  SU R                   S3n[        U5      e)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   	_divcheckExtensionElement._divcheckX   sz    //UU^^UU__!5!5aeehhj!A!A %QCtAEE7 3L LC%c**r   c                 Z   U R                  5         U R                  R                  (       a0  U R                  R	                  U R                  R
                  5      nO<U R                  R                  nUR                  UR                  U R                  5      n[        XR                  5      $ )z]Multiplicative inverse.

Raises
======

NotInvertible
    If the element is a zero divisor.

)
rL   r   rE   r   invertrA   ringexquooner)   )r   invrepRs      r   inverseExtensionElement.inversei   sf     	
55>>UU\\!%%)),F

AWWQUUAEE*Fvuu%%r   c                     U R                  U5      nUc  [        $ [        X R                  5      n UR	                  5       nX-  $ ! [
         a    [        U  SU 35      ef = f)Nz / )r1   r5   r)   r   rU   r   ZeroDivisionError)r   r0   r   ginvs       r   __truediv__ExtensionElement.__truediv__}   sg    jjm;!!C	299;D x  	2#qcQCL11	2s   A A c                 n     U R                   R                  U5      nX-  $ ! [         a	    [        s $ f = fr   r   r.   r   r5   r/   s     r   __rtruediv__ExtensionElement.__rtruediv__   9    	"a A u  	"!!	"   ! 44c                     U R                  U5      nUc  [        $ [        X R                  5      n UR	                  5         U R                  R                  $ ! [
         a    [        U  SU 35      ef = f)Nz % )r1   r5   r)   r   rL   r   rX   zeror6   s      r   __mod__ExtensionElement.__mod__   sl    jjm;!!C	2KKM
 uuzz	  	2#qcQCL11	2s   A A2c                 n     U R                   R                  U5      nX-  $ ! [         a	    [        s $ f = fr   r]   r/   s     r   __rmod__ExtensionElement.__rmod__   r`   ra   c                    [        U[        5      (       d  [        S5      eUS:  a   U R                  5       U* pU R                  nU R                  R                  nU R                  R                  R                  nUS:  a%  US-  (       a  XB-  U-  nX"-  U-  nUS-  nUS:  a  M%  [        X@R                  5      $ ! [         a    [        S5      ef = f)Nzexponent of type 'int' expectedr   znegative powers are not defined   )r-   int	TypeErrorrU   rJ   
ValueErrorr   r   rA   rR   r)   )r   nbmrs        r   __pow__ExtensionElement.__pow__   s    !S!!=>>q5Dyy{QB1 EEEEIIEEIIMM!e1uSAI	A!GA	 !e q%%   ' D !BCCDs   B< <Cc                     [        U[        5      (       a9  U R                  UR                  :H  =(       a    U R                  UR                  :H  $ [        $ r   )r-   r)   r   r   r5   r/   s     r   __eq__ExtensionElement.__eq__   s8    a!!55AEE>4aeequun4!!r   c                     X:X  + $ r   r%   r/   s     r   __ne__ExtensionElement.__ne__   s
    zr   c                 D    [        U R                  U R                  45      $ r   )hashr   r   r   s    r   __hash__ExtensionElement.__hash__   s    QUUAEEN##r   c                 :    SSK Jn  U" U R                  5       5      $ )Nr   )sstr)sympy.printing.strr   r   )r   r   s     r   __str__ExtensionElement.__str__   s    +AIIK  r   c                 .    U R                   R                  $ r   )r   rF   r   s    r   rF   ExtensionElement.is_ground   s    uur   c                 >    U R                   R                  5       u  nU$ r   )r   to_list)r   cs     r   	to_groundExtensionElement.to_ground   s    eemmor   )r   r   N)%__name__
__module____qualname____firstlineno____doc__	__slots__r   r   r   r"   r&   r*   r1   r7   __radd__r;   r>   rB   __rmul__rL   rU   rZ   __floordiv__r^   __rfloordiv__rd   rg   rr   ru   rx   r|   r   __repr__propertyrF   r   __static_attributes__r%   r   r   r   r      s    	 I!&" H""" H+"&( L !M!("$! H r   r   c                       \ rS rSrSrSr\rS rS r	S r
S rS r\r\S	 5       rS
 rSS jrS rS rS rS rS rS rS rS rS rSrg)MonogenicFiniteExtension   al  
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                   ^ ^ [        U[        5      (       a  UR                  (       d  [        S5      eUR	                  SS9nUR                  5       T l        UT l        UR                  T l	        UR                  =T l
        nUR                  " UR                  6 T l        T R                  T R                  R                  5      T l        T R                  T R                  R                   5      T l        T R                  R                  S   mT R                  R"                  S   T l        T R                  T5      T l        [)        UU 4S j[+        T R                  5       5       5      T l        T R                  R.                  T l        g )Nz!modulus must be a univariate PolyF)autor   c              3   L   >#    U  H  nTR                  TU-  5      v   M     g 7fr   r.   ).0igenr   s     r   	<genexpr>4MonogenicFiniteExtension.__init__.<locals>.<genexpr>  s#     J9IA4<<Q//9Is   !$)r-   r   is_univariaterl   monicdegreerankmodulusr   rA   rG   old_poly_ringgensrP   r.   rc   rR   symbolssymbol	generatortuplerangebasisrE   )r   rA   domr   s   `  @r   r   !MonogenicFiniteExtension.__init__  s   3%%#*;*;?@@ iiUi#JJL	77JJ&c%%sxx0	LL0	<<		.iinnQii''*c*Jtyy9IJJ
 ,,r   c                 h    U R                   R                  U5      n[        X R                  -  U 5      $ r   rP   r.   r)   rA   )r   argr   s      r   newMonogenicFiniteExtension.new$  s)    ii$sXX~t,,r   c                 `    [        U[        5      (       d  gU R                  UR                  :H  $ NF)r-   FiniteExtensionr   )r   others     r   ru   MonogenicFiniteExtension.__eq__(  s%    %11||u}},,r   c                 X    [        U R                  R                  U R                  45      $ r   )r{   	__class__r   r   r   s    r   r|   !MonogenicFiniteExtension.__hash__-  s     T^^,,dll;<<r   c                 Z    U R                   < SU R                  R                  5       < S3$ )Nz/())rP   r   r   r   s    r   r    MonogenicFiniteExtension.__str__0  s     IIt||';';'=>>r   c                 .    U R                   R                  $ r   )rG   has_CharacteristicZeror   s    r   r   /MonogenicFiniteExtension.has_CharacteristicZero5  s    {{111r   c                 6    U R                   R                  5       $ r   )rG   characteristicr   s    r   r   'MonogenicFiniteExtension.characteristic9  s    {{))++r   Nc                 h    U R                   R                  X5      n[        X0R                  -  U 5      $ r   r   r   r   baser   s       r   r.    MonogenicFiniteExtension.convert<  )    ii(sXX~t,,r   c                 h    U R                   R                  X5      n[        X0R                  -  U 5      $ r   r   r   s       r   convert_from%MonogenicFiniteExtension.convert_from@  r   r   c                 L    U R                   R                  UR                  5      $ r   )rP   r   r   r   r   s     r   r   !MonogenicFiniteExtension.to_sympyD  s    yy!!!%%((r   c                 $    U R                  U5      $ r   r   r   s     r   
from_sympy#MonogenicFiniteExtension.from_sympyG  s    ||Ar   c                 Z    U R                   R                  U5      nU R                  U5      $ r   )r   
set_domainr   )r   KrA   s      r   r   #MonogenicFiniteExtension.set_domainJ  s%    ll%%a(~~c""r   c                     U R                   U;   a  [        S5      eU R                  R                  " U6 nU R	                  U5      $ )Nz+Can not drop generator from FiniteExtension)r   r   rG   dropr   )r   r   r   s      r   r   MonogenicFiniteExtension.dropN  s=    ;;'!!"OPPKKg&q!!r   c                 $    U R                  X5      $ r   )rQ   )r   r   r0   s      r   quoMonogenicFiniteExtension.quoT  s    zz!r   c                     U R                   R                  UR                  UR                  5      n[        X0R                  -  U 5      $ r   )rP   rQ   r   r)   rA   )r   r   r0   r   s       r   rQ   MonogenicFiniteExtension.exquoW  s1    iiooaeeQUU+sXX~t,,r   c                     gr   r%   r   as     r   is_negative$MonogenicFiniteExtension.is_negative[  s    r   c                     U R                   (       a  [        U5      $ UR                  (       a)  U R                  R	                  UR                  5       5      $ g r   )rE   r!   rF   rG   rH   r   r   s     r   rH    MonogenicFiniteExtension.is_unit^  s9    ==7N[[;;&&q{{}55 r   )r   rG   r   rE   rA   r   rR   r   rP   r   rc   r   )r   r   r   r   r   is_FiniteExtensionr   dtyper   r   ru   r|   r   r   r   r   r   r.   r   r   r   r   r   r   rQ   r   rH   r   r%   r   r   r   r      s~    'P E-8--
=? H2 2,--)#" -6r   r   N)r   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   