ó
~9­\c           @  sf   d  d l  m Z m Z d  d l m Z m Z d  d l m Z d d l m	 Z	 d e	 f d „  ƒ  YZ
 d S(	   iÿÿÿÿ(   t   print_functiont   division(   t   nant   Integer(   t   integer_typesi   (   t   Functiont   Modc           B  s8   e  Z d  Z e d „  ƒ Z d „  Z d „  Z d „  Z RS(   sd  Represents a modulo operation on symbolic expressions.

    Receives two arguments, dividend p and divisor q.

    The convention used is the same as Python's: the remainder always has the
    same sign as the divisor.

    Examples
    ========

    >>> from sympy.abc import x, y
    >>> x**2 % y
    Mod(x**2, y)
    >>> _.subs({x: 5, y: 6})
    1

    c   !        s_  d d l  m } d d l m } d d l m ‰  d d l m } d d l m	 } ‡  f d †  } | | ˆ ƒ } | d  k	 r~ | St | |  ƒ rÖ | j d }	 |	 ˆ d	 k r¾ |  | j d	 ˆ ƒ S|	 ˆ |	 j r¯| SnÙt | |  ƒ r2| j d }	 |	 ˆ d	 k r|  | j d	 ˆ ƒ S|	 ˆ |	 j r¯| Sn}t | | ƒ rçg  g  f }
 \ } } x+ | j D]  } |
 t | |  ƒ j | ƒ qaW| r¯t ‡ f d
 †  | Dƒ ƒ r¯| | Œ  | g  | D] } | j d	 ^ qºŒ  } |  | ˆ ƒ SnÈt | | ƒ r¯g  g  f }
 \ } } x+ | j D]  } |
 t | |  ƒ j | ƒ qW| r't ‡ f d †  | Dƒ ƒ r'g  | D] } |  | ˆ ƒ ^ qc} g  } g  } xA | D]9 } t | |  ƒ r½| j | j d	 ƒ q‘| j | ƒ q‘W| | Œ  } | | Œ  } | g  | D] } | j d	 ^ qðŒ  } | | } | |  | ˆ ƒ Sˆ j rœˆ ˆ  j k	 rœg  } xK | D]C } | j r‚| ˆ ˆ  j k	 r‚| j | ˆ ƒ qL| j | ƒ qLW| } n  | | | Œ  } n  | | ˆ ƒ } | d k rg  | ˆ f D]" } | | | d t d t ƒ^ q×\ } ‰ n  | ˆ } } | j r©g  } x[ | j D]P } |  | ˆ ƒ } | j |  ƒ | j |  ƒ k rq| j | ƒ q.| j | ƒ q.W| t | j ƒ k rD| | Œ  } qDn› | j ƒ  \ } } ˆ j ƒ  \ } ‰ t } | j sç| j r'| | }  |  d	 k r'| | 9} | t | | ƒ 9} t } q'n  | sD| | } | ˆ ‰ n  | j ƒ  r‹ˆ j ƒ  r‹g  | | ˆ f D] } | ^ ql\ } } ‰ n  | | ˆ ƒ } | d  k	 r®| | S| j rà| d k rà| | 9} |  | ˆ d t ƒS| j r6| j d	 j r6| j d	 d k r6| j d	 | } | j | j d ƒ } n  | |  | ˆ d | ˆ f | | f k ƒS(   Niÿÿÿÿ(   t   Add(   t   Mul(   t   S(   t	   gcd_terms(   t   gcdc           s  | ˆ  j  k r t d ƒ ‚ n  |  j sH | j sH |  t k sH | t k rL t S|  ˆ  j  k s‰ |  | k s‰ |  | k s‰ |  j r | d k r ˆ  j  S| j rÜ |  j rª |  | S| d k rÜ |  j rÆ ˆ  j  S|  j rÙ ˆ  j SqÜ n  t	 |  d ƒ rt
 |  d ƒ | ƒ } | d k	 r| Sn  |  | } y t | ƒ } Wn t k
 r@nE Xt | t ƒ r…|  | | } | | d k  t k r| | 7} n  | St |  ƒ } x‡ t d ƒ D]y } | t | ƒ 8} | j rž| j rè|  j r×| | S|  j r| Sn+ | j r|  j rþ| S|  j r| | Sn  PqžqžWd S(   sm   Try to return p % q if both are numbers or +/-p is known
            to be less than or equal q.
            s   Modulo by zeroi   i   t	   _eval_Modi    N(   t   Zerot   ZeroDivisionErrort   is_infiniteR   t
   is_integert	   is_Numbert   is_event   is_oddt   Onet   hasattrt   getattrt   Nonet   intt	   TypeErrort
   isinstanceR   t   Truet   abst   ranget   is_negativet   is_positive(   t   pt   qt   rvt   rt   dt   _(   R	   (    s-   lib/python2.7/site-packages/sympy/core/mod.pyt   doit#   sV    *=				
							i   i    c         3  s"   |  ] } | j  d  ˆ  k Vq d S(   i   N(   t   args(   t   .0t   inner(   R!   (    s-   lib/python2.7/site-packages/sympy/core/mod.pys	   <genexpr>u   s    c         3  s"   |  ] } | j  d  ˆ  k Vq d S(   i   N(   R'   (   R(   R)   (   R!   (    s-   lib/python2.7/site-packages/sympy/core/mod.pys	   <genexpr>   s    t   cleart   fractiont   evaluate(    t   sympy.core.addR   t   sympy.core.mulR   t   sympy.core.singletonR	   t   sympy.core.exprtoolsR
   t   sympy.polys.polytoolsR   R   R   R'   t   is_nonnegativet   is_nonpositivet   appendt   allt
   is_IntegerR   R   t   Falset   is_Addt   countt   listt   as_coeff_Mult   is_RationalR   R   t   could_extract_minus_signt   is_Floatt   is_Mult
   _from_args(!   t   clsR    R!   R   R   R
   R   R&   R"   t   qinnert   both_lt	   non_mod_lt   mod_lt   argt   it   nett   xt   modt   non_modt   jt   prod_modt   prod_non_modt	   prod_mod1R%   t   Gt   pwast   qwasR'   t   at   cpt   cqt   okR#   (    (   R	   R!   s-   lib/python2.7/site-packages/sympy/core/mod.pyt   eval   s´    9"0""&
	>	


/
,c         C  sQ   d d l  m } m } |  j \ } } | | j | j | | j ƒ g ƒ rM t Sd  S(   Niÿÿÿÿ(   t	   fuzzy_andt	   fuzzy_not(   t   sympy.core.logicRX   RY   R'   R   t   is_zeroR   (   t   selfRX   RY   R    R!   (    (    s-   lib/python2.7/site-packages/sympy/core/mod.pyt   _eval_is_integerÓ   s    $c         C  s   |  j  d j r t Sd  S(   Ni   (   R'   R   R   (   R\   (    (    s-   lib/python2.7/site-packages/sympy/core/mod.pyt   _eval_is_nonnegativeÙ   s    c         C  s   |  j  d j r t Sd  S(   Ni   (   R'   R   R   (   R\   (    (    s-   lib/python2.7/site-packages/sympy/core/mod.pyt   _eval_is_nonpositiveÝ   s    (   t   __name__t
   __module__t   __doc__t   classmethodRW   R]   R^   R_   (    (    (    s-   lib/python2.7/site-packages/sympy/core/mod.pyR      s
   ¸		N(   t
   __future__R    R   t   sympy.core.numbersR   R   t   sympy.core.compatibilityR   t   functionR   R   (    (    (    s-   lib/python2.7/site-packages/sympy/core/mod.pyt   <module>   s   