ó
¡¼™\c           @  sŸ   d  Z  d d l m Z m Z d d l m Z d d l m Z d d l m	 Z	 d d l
 m Z d d l m Z d d l m Z e d	 e e f d
 „  ƒ  Yƒ Z d S(   s.   Implementation of :class:`FiniteField` class. iÿÿÿÿ(   t   print_functiont   division(   t   Field(   t   SymPyInteger(   t   ModularIntegerFactory(   t   SimpleDomain(   t   CoercionFailed(   t   publict   FiniteFieldc           B  sÛ   e  Z d  Z d Z e Z Z e Z e Z	 e Z
 d Z d Z d e d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d	 „  Z d d
 „ Z d d „ Z d d „ Z d d „ Z d d „ Z d d „ Z d „  Z RS(   s!   General class for finite fields. t   FFc         C  s–   | d k r t  d | ƒ ‚ n  | d  k rD d d l m } | } n  t | | | |  ƒ |  _ |  j d ƒ |  _ |  j d ƒ |  _ | |  _ | |  _	 d  S(   Ni    s*   modulus must be a positive integer, got %siÿÿÿÿ(   t   ZZi   (
   t
   ValueErrort   Nonet   sympy.polys.domainsR
   R   t   dtypet   zerot   onet   domt   mod(   t   selfR   R   t	   symmetricR
   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   __init__   s    		c         C  s   d |  j  S(   Ns   GF(%s)(   R   (   R   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   __str__(   s    c         C  s%   t  |  j j |  j |  j |  j f ƒ S(   N(   t   hasht	   __class__t   __name__R   R   R   (   R   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   __hash__+   s    c         C  s1   t  | t ƒ o0 |  j | j k o0 |  j | j k S(   s0   Returns ``True`` if two domains are equivalent. (   t
   isinstanceR   R   R   (   R   t   other(    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   __eq__.   s    c         C  s   |  j  S(   s*   Return the characteristic of this domain. (   R   (   R   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   characteristic3   s    c         C  s   |  S(   s*   Returns a field associated with ``self``. (    (   R   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt	   get_field7   s    c         C  s   t  t | ƒ ƒ S(   s!   Convert ``a`` to a SymPy object. (   R   t   int(   R   t   a(    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   to_sympy;   s    c         C  sv   | j  r( |  j |  j j t | ƒ ƒ ƒ S| j rb t | ƒ | k rb |  j |  j j t | ƒ ƒ ƒ St d | ƒ ‚ d S(   s0   Convert SymPy's Integer to SymPy's ``Integer``. s   expected an integer, got %sN(   t
   is_IntegerR   R   R    t   is_FloatR   (   R   R!   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt
   from_sympy?   s
    	c         C  s"   |  j  |  j j | j | j ƒ ƒ S(   s.   Convert ``ModularInteger(int)`` to ``dtype``. (   R   R   t   from_ZZ_pythont   val(   t   K1R!   t   K0(    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   from_FF_pythonH   s    c         C  s   |  j  |  j j | | ƒ ƒ S(   s'   Convert Python's ``int`` to ``dtype``. (   R   R   R&   (   R(   R!   R)   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyR&   L   s    c         C  s#   | j  d k r |  j | j ƒ Sd S(   s,   Convert Python's ``Fraction`` to ``dtype``. i   N(   t   denominatorR&   t	   numerator(   R(   R!   R)   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   from_QQ_pythonP   s    c         C  s"   |  j  |  j j | j | j ƒ ƒ S(   s.   Convert ``ModularInteger(mpz)`` to ``dtype``. (   R   R   t   from_ZZ_gmpyR'   (   R(   R!   R)   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   from_FF_gmpyU   s    c         C  s   |  j  |  j j | | ƒ ƒ S(   s%   Convert GMPY's ``mpz`` to ``dtype``. (   R   R   R.   (   R(   R!   R)   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyR.   Y   s    c         C  s#   | j  d k r |  j | j ƒ Sd S(   s%   Convert GMPY's ``mpq`` to ``dtype``. i   N(   R+   R.   R,   (   R(   R!   R)   (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   from_QQ_gmpy]   s    c         C  s>   | j  | ƒ \ } } | d k r: |  j t j j | ƒ ƒ Sd S(   s'   Convert mpmath's ``mpf`` to ``dtype``. i   N(   t   to_rationalR   R   R   (   R(   R!   R)   t   pt   q(    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   from_RealFieldb   s    N(   R   t
   __module__t   __doc__t   rept   Truet   is_FiniteFieldt   is_FFt   is_Numericalt   Falset   has_assoc_Ringt   has_assoc_FieldR   R   R   R   R   R   R   R   R   R"   R%   R*   R&   R-   R/   R.   R0   R4   (    (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyR      s.   
								N(   R6   t
   __future__R    R   t   sympy.polys.domains.fieldR   t   sympy.polys.domains.groundtypesR   t"   sympy.polys.domains.modularintegerR   t    sympy.polys.domains.simpledomainR   t   sympy.polys.polyerrorsR   t   sympy.utilitiesR   R   (    (    (    s>   lib/python2.7/site-packages/sympy/polys/domains/finitefield.pyt   <module>   s   