
    Ed#                         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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      ;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                 *    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(   sq    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__5   7    jjmm 	"153;...!!r   c                 x    |                      |          }|t          | j        |z
  | j                  S t          S r   r)   r+   s      r   __sub__zExtensionElement.__sub__>   r-   r   c                 x    |                      |          }|t          || j        z
  | j                  S t          S r   r)   r+   s      r   __rsub__zExtensionElement.__rsub__E   s7    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__L   s@    jjmm 	"AECK1594ae<<<!!r   c                     | st          d          | j        j        rdS | j        j        r1| j        j                            | j        j        d                   rdS d|  d| j         d}t          |          )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.)r   r   is_Fieldr   	is_grounddomainis_unitNotImplementedError)r   msgs     r   	_divcheckzExtensionElement._divcheckU   s     	+///U^ 	+4U_ 		+!5!5aeil!C!C 		+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   r6   r   invertr3   ringexquooner    )r   invrepRs      r   inversezExtensionElement.inversef   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   rD   r   ZeroDivisionError)r   r&   r   ginvs       r   __truediv__zExtensionElement.__truediv__z   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   rF   zeror+   s      r   __mod__zExtensionElement.__mod__   s    jjmm 	"!!C	2KKMMMM 	2 	2 	2#qLLQLL111	2 uzrI   c                 r    	 | j                             |          }n# t          $ r
 t          cY S w xY w|| z  S r   rK   r%   s     r   __rmod__zExtensionElement.__rmod__   rM   rN   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	TypeErrorrD   r:   
ValueErrorr   r   r3   rA   r    )r   nbmrs        r   __pow__zExtensionElement.__pow__   s    !S!! 	?=>>>q5 	DDyy{{QB1& D D D !BCCCD EEIEIM!e 	1u qSAI1	A!GA	 !e 	 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                 .    ddl m}  || j                  S )Nr   )sstr)sympy.printing.strrf   r   )r   rf   s     r   __str__zExtensionElement.__str__   s$    ++++++tAE{{r   c                     | j         j        S r   )r   r7   r   s    r   r7   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,   __radd__r/   r1   r4   __rmul__r<   rD   rH   __floordiv__rL   __rfloordiv__rQ   rS   r]   r_   ra   rd   rh   __repr__propertyr7   rm   r   r   r   r   r      s       	 	 I        & & &  " " " H" " "" " "" " " H+ + +"& & &(   L   !M    ! ! !(" " "  $ $ $   H  X    r   r   c                   z    e Zd ZdZdZeZd Zd Zd Z	d Z
d Ze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        p |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_univariaterW   monicdegreerankmodulusr   r3   r8   r?   old_poly_ringgensr$   rP   rA   symbolssymbol	generatortuplerangebasisr6   )r   r3   domr   s   `  @r   r   z!MonogenicFiniteExtension.__init__  s3   3%% 	A#*; 	A?@@@ iiUi##JJLL	7J&cGL@$5C$5sx$@	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   r?   r$   r    r3   )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   r_   zMonogenicFiniteExtension.__eq__%  s(    %11 	5|u},,r   c                 B    t          | j        j        | j        f          S r   )rc   	__class__rn   r   r   s    r   rd   z!MonogenicFiniteExtension.__hash__*  s    T^,dl;<<<r   c                 J    | j         d| j                                        dS )Nz/())r?   r   as_exprr   s    r   rh   z MonogenicFiniteExtension.__str__-  s'     IIIt|';';'='='='=>>r   Nc                 h    | j                             ||          }t          || j        z  |           S r   r   r   r   baser   s       r   r$   z MonogenicFiniteExtension.convert2  /    i4((sTX~t,,,r   c                 h    | j                             ||          }t          || j        z  |           S r   r   r   s       r   convert_fromz%MonogenicFiniteExtension.convert_from6  r   r   c                 @    | j                             |j                  S r   )r?   to_sympyr   r   r   s     r   r   z!MonogenicFiniteExtension.to_sympy:  s    y!!!%(((r   c                 ,    |                      |          S r   r~   r   s     r   
from_sympyz#MonogenicFiniteExtension.from_sympy=  s    ||Ar   c                 `    | j                             |          }|                     |          S r   )r   
set_domainr   )r   Kr3   s      r   r   z#MonogenicFiniteExtension.set_domain@  s)    l%%a((~~c"""r   c                 z    | j         |v rt          d           | j        j        | }|                     |          S )Nz+Can not drop generator from FiniteExtension)r   r   r8   dropr   )r   r   r   s      r   r   zMonogenicFiniteExtension.dropD  sD    ;'! 	Q!"OPPPDKg&q!!!r   c                 .    |                      ||          S r   )r@   )r   r   r&   s      r   quozMonogenicFiniteExtension.quoJ  s    zz!Qr   c                 |    | j                             |j        |j                  }t          || j        z  |           S r   )r?   r@   r   r    r3   )r   r   r&   r   s       r   r@   zMonogenicFiniteExtension.exquoM  s1    iooaeQU++sTX~t,,,r   c                     dS r   r   r   as     r   is_negativez$MonogenicFiniteExtension.is_negativeQ  s    ur   c                     | j         rt          |          S |j        r,| j                            |                                          S d S r   )r6   r   r7   r8   r9   rm   r   s     r   r9   z MonogenicFiniteExtension.is_unitT  sI    = 	677N[ 	6;&&q{{}}555	6 	6r   r   )rn   ro   rp   rq   is_FiniteExtensionr   dtyper   r   r_   rd   rh   rw   r$   r   r   r   r   r   r   r@   r   r9   r   r   r   rz   rz      s       ' 'P E- - -8- - -- - -
= = =? ? ? H- - - -- - -) ) )  # # #" " "     - - -  6 6 6 6 6r   rz   N)rq   sympy.polys.domains.domainr   !sympy.polys.domains.domainelementr   sympy.polys.polyerrorsr   r   r   sympy.polys.polytoolsr   sympy.printing.defaultsr	   r   r    rz   r   r   r   r   <module>r      s    ( ( - - - - - - ; ; ; ; ; ;          & & & & & & 3 3 3 3 3 3H H H H H}o H H HT @6 @6 @6 @6 @6v @6 @6 @6D +r   