
    MZd#                         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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      =/usr/lib/python3/dist-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                 ,    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__5   3    jjm?1553;..!!r   c                 z    | j                  |      }|#t        | j                  |z
  | j                        S t        S r   r)   r+   s      r   __sub__zExtensionElement.__sub__>   r-   r   c                 z    | j                  |      }|#t        || j                  z
  | j                        S t        S r   r)   r+   s      r   __rsub__zExtensionElement.__rsub__E   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__L   s@    jjm?AEECK155994aee<<!!r   c                 ,   | st        d      | j                  j                  ry| j                  j                  r=| j                  j
                  j                  | j                  j                  d         ry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   sy    //UU^^UU__!5!5aeeiil!C %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   r6   r   invertr3   ringexquooner    )r   invrepRs      r   inversezExtensionElement.inversef   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   rD   r   ZeroDivisionError)r   r&   r   ginvs       r   __truediv__zExtensionElement.__truediv__z   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   rF   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   rJ   r%   s     r   __rmod__zExtensionElement.__rmod__   rL   rM   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	TypeErrorrD   r:   
ValueErrorr   r   r3   rA   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                 2    ddl m}  || j                        S )Nr   )sstr)sympy.printing.strre   r   )r   re   s     r   __str__zExtensionElement.__str__   s    +AEE{r   c                 .    | j                   j                  S r   )r   r7   r   s    r   r7   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,   __radd__r/   r1   r4   __rmul__r<   rD   rH   __floordiv__rK   __rfloordiv__rP   rR   r\   r^   r`   rc   rg   __repr__propertyr7   rl   r   r   r   r   r      s    	 I&" H""" H+"&( L !M!("$ H r   r   c                   x    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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                 8    t        |t              r|j                  st        d      |j	                  d      }|j                          _        | _        |j                   _	        |j                  x _
        }|j                  j                  xs  |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_univariaterV   monicdegreerankmodulusr   r3   r8   r?   old_poly_ringgensr$   rO   rA   symbolssymbol	generatortuplerangebasisr6   )r   r3   domr   s   `  @r   r   z!MonogenicFiniteExtension.__init__  s   3%#*;*;?@@ iiUi#JJL	77JJ&cGGLL@$5C$5$5sxx$@	LL0	<<		.iinnQii''*c*Jtyy9IJJ
 ,,r   c                 j    | j                   j                  |      }t        || j                  z  |       S r   r?   r$   r    r3   )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   r^   zMonogenicFiniteExtension.__eq__%  s"    %1||u}},,r   c                 X    t        | j                  j                  | j                  f      S r   )rb   	__class__rm   r   r   s    r   rc   z!MonogenicFiniteExtension.__hash__*  s     T^^,,dll;<<r   c                 V    | j                   d| j                  j                         dS )Nz/())r?   r   as_exprr   s    r   rg   z MonogenicFiniteExtension.__str__-  s     IIt||';';'=>>r   Nc                 l    | j                   j                  ||      }t        || j                  z  |       S r   r   r   r   baser   s       r   r$   z MonogenicFiniteExtension.convert2  -    ii4(sTXX~t,,r   c                 l    | j                   j                  ||      }t        || j                  z  |       S r   r   r   s       r   convert_fromz%MonogenicFiniteExtension.convert_from6  r   r   c                 L    | j                   j                  |j                        S r   )r?   to_sympyr   r   r   s     r   r   z!MonogenicFiniteExtension.to_sympy:  s    yy!!!%%((r   c                 $    | j                  |      S r   r}   r   s     r   
from_sympyz#MonogenicFiniteExtension.from_sympy=  s    ||Ar   c                 Z    | j                   j                  |      }| j                  |      S r   )r   
set_domainr   )r   Kr3   s      r   r   z#MonogenicFiniteExtension.set_domain@  s%    ll%%a(~~c""r   c                     | j                   |v rt        d       | j                  j                  | }| j	                  |      S )Nz+Can not drop generator from FiniteExtension)r   r   r8   dropr   )r   r   r   s      r   r   zMonogenicFiniteExtension.dropD  s?    ;;'!!"OPPDKKg&q!!r   c                 &    | j                  ||      S r   )r@   )r   r   r&   s      r   quozMonogenicFiniteExtension.quoJ  s    zz!Qr   c                     | j                   j                  |j                  |j                        }t        || j                  z  |       S r   )r?   r@   r   r    r3   )r   r   r&   r   s       r   r@   zMonogenicFiniteExtension.exquoM  s3    iiooaeeQUU+sTXX~t,,r   c                      yr   r   r   as     r   is_negativez$MonogenicFiniteExtension.is_negativeQ  s    r   c                     | j                   rt        |      S |j                  r)| j                  j	                  |j                               S y r   )r6   r   r7   r8   r9   rl   r   s     r   r9   z MonogenicFiniteExtension.is_unitT  s9    ==7N[[;;&&q{{}55 r   r   )rm   rn   ro   rp   is_FiniteExtensionr   dtyper   r   r^   rc   rg   rv   r$   r   r   r   r   r   r   r@   r   r9   r   r   r   ry   ry      sg    'P E-8--
=? H--)#" -6r   ry   N)rp   sympy.polys.domains.domainr   !sympy.polys.domains.domainelementr   sympy.polys.polyerrorsr   r   r   sympy.polys.polytoolsr   sympy.printing.defaultsr	   r   r    ry   r   r   r   r   <module>r      sL    ( - ;  & 3H}o HT @6v @6D +r   