ó
¡¼™\c           @  sx   d  Z  d d l m Z m Z d d l m Z d d l m Z d e f d „  ƒ  YZ	 e	 Z
 d e f d „  ƒ  YZ e Z d	 S(
   s"   Finite extensions of ring domains.iÿÿÿÿ(   t   print_functiont   division(   t   CoercionFailed(   t   Polyt   ExtensionElementc           B  s˜   e  Z d  Z d d g 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 d „  Z d „  Z e Z RS(   s#  
    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.

    t   rept   extc         C  s   | |  _  | |  _ d  S(   N(   R   R   (   t   selfR   R   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __init__   s    	c         C  s   t  |  j |  j ƒ S(   N(   t   ExtElemR   R   (   t   f(    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __neg__   s    c         C  se   t  | t ƒ r/ | j |  j k r( | j Sd  Sn2 y |  j j | ƒ } | j SWn t k
 r` d  SXd  S(   N(   t
   isinstanceR	   R   R   t   Nonet   convertR   (   R
   t   g(    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   _get_rep   s    c         C  s:   |  j  | ƒ } | d  k	 r2 t |  j | |  j ƒ St Sd  S(   N(   R   R   R	   R   R   t   NotImplemented(   R
   R   R   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __add__)   s    c         C  s:   |  j  | ƒ } | d  k	 r2 t |  j | |  j ƒ St Sd  S(   N(   R   R   R	   R   R   R   (   R
   R   R   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __sub__2   s    c         C  s:   |  j  | ƒ } | d  k	 r2 t | |  j |  j ƒ St Sd  S(   N(   R   R   R	   R   R   R   (   R
   R   R   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __rsub__9   s    c         C  sD   |  j  | ƒ } | d  k	 r< t |  j | |  j j |  j ƒ St Sd  S(   N(   R   R   R	   R   R   t   modR   (   R
   R   R   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __mul__@   s    !c         C  s³   t  | t ƒ s t d ƒ ‚ n  | d k  r9 t d ƒ ‚ n  |  j } |  j j } |  j j j } xC | d k r¢ | d r‡ | | | } n  | | | } | d } q` Wt | |  j ƒ S(   Ns   exponent of type 'int' expectedi    s   negative powers are not definedi   (	   R   t   intt	   TypeErrort
   ValueErrorR   R   R   t   oneR	   (   R
   t   nt   bt   mt   r(    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __pow__I   s    	
c         C  s9   t  | t ƒ r1 |  j | j k o0 |  j | j k St Sd  S(   N(   R   R	   R   R   R   (   R
   R   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __eq__Z   s    "c         C  s   |  | k S(   N(    (   R
   R   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __ne__`   s    c         C  s   t  |  j |  j f ƒ S(   N(   t   hashR   R   (   R
   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __hash__c   s    c         C  s   d d l  m } | |  j ƒ S(   Niÿÿÿÿ(   t   sstr(   t   sympy.printing.strR$   R   (   R
   R$   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   __str__f   s    (   t   __name__t
   __module__t   __doc__t	   __slots__R   R   R   R   t   __radd__R   R   R   t   __rmul__R   R    R!   R#   R&   t   __repr__(    (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyR      s"   
												t   MonogenicFiniteExtensionc           B  s5   e  Z d  Z d „  Z d „  Z e Z d „  Z e Z RS(   s£   
    Finite extension generated by an integral element.

    The generator is defined by a monic univariate
    polynomial derived from the argument ``mod``.

    c           s0  t  | t ƒ o | j s' t d ƒ ‚ n  | j | j ƒ  ƒ \ } } | j sZ t d ƒ ‚ n  | j ƒ  ˆ _	 | ˆ _
 | j ˆ _ | j ˆ _ } | j j p© | j | j Œ  ˆ _ ˆ j ˆ j j ƒ ˆ _ ˆ j ˆ j j ƒ ˆ _ ˆ j j d ‰  ˆ j ˆ  ƒ ˆ _ t ‡  ‡ f d †  t ˆ j	 ƒ Dƒ ƒ ˆ _ d  S(   Ns!   modulus must be a univariate Polys   modulus could not be made monici    c         3  s"   |  ] } ˆ j  ˆ  | ƒ Vq d  S(   N(   R   (   t   .0t   i(   t   genR   (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pys	   <genexpr>‹   s   (   R   R   t   is_univariateR   t   divt   LCt   is_zeroR   t   degreet   rankt   modulusR   R   t   domaint   ringt   old_poly_ringt   gensR   t   zeroR   t	   generatort   tuplet   ranget   basis(   R   R   t   remt   dom(    (   R1   R   s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyR   w   s     		!c         C  s&   |  j  j | ƒ } t | |  j |  ƒ S(   N(   R:   R   R	   R   (   R   R
   R   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyR   Ž   s    c         C  s   d |  j  |  j j ƒ  f S(   Ns   %s/(%s)(   R:   R8   t   as_expr(   R   (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyR&   ”   s    (   R'   R(   R)   R   R   t   __call__R&   R-   (    (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyR.   o   s   			N(   R)   t
   __future__R    R   t   sympy.polys.polyerrorsR   t   sympy.polys.polytoolsR   t   objectR   R	   R.   t   FiniteExtension(    (    (    s:   lib/python2.7/site-packages/sympy/polys/agca/extensions.pyt   <module>   s   d*