
\c           @  sN
  d  Z  d d l m Z m Z d d l m Z m Z d d l 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 m Z m Z m Z d d l m Z m Z d d l m Z d d l m  Z  e j! j" Z# d d  Z$ e$ d d  Z% e$ d d  Z& e$ d d  Z' e$ d d  Z( e$ d d  Z) e$ d d  Z* e$ d d  Z+ e$ d d   Z, e$ d! d  Z- e$ d" d#  Z. e$ d$  Z/ e$ d% d#  Z0 e$ d& d'  Z1 e$ d(  Z2 e$ d)  Z3 e$ d* d+  Z4 e$ d, d-  Z5 e$ d. d/  Z6 e$ d0 d1  Z7 e$ d2 d3  Z8 e$ d4 d3  Z9 e$ d5 d3  Z: e$ d6 d7  Z; e$ d8 d9  Z< e$ d: d;  Z= e$ d< d;  Z> e$ d= d;  Z? e$ d> d;  Z@ e$ d? d;  ZA e$ d@ d9  ZB e$ dA dB  ZC e$ dC dB  ZD e$ dD dB  ZE e$ dE dB  ZF e$ dF dB  ZG e$ dG d3  ZH e$ dH d3  ZI e$ dI d3  ZJ e$ dJ dB  ZK e$ dK dB  ZL e$ dL dM  ZM e$ dN dO  ZN e$ dP dO  ZO e dQ dR  ZP i  ZQ dS   ZR dT   ZS dU   ZT dV   ZU dW   ZV dX   ZW dY   ZX dZ   ZY d[   ZZ d\   Z[ d]   Z\ d^   Z] d_   Z^ d`   Z_ da   Z` db   Za dc   Zb dd   Zc de   Zd df   Ze dg   Zf dh   Zg di   Zh e ji dj    Zj e ji dk    Zk e ji dl    Zl e ji dm    Zm e ji dn    Zn do   Zo dp   Zp eo dq    Zq ep dr    Zr eo ds    Zs ep dt    Zt eo du    Zu ep dv    Zv eo dw    Zw ep dx    Zx eo dy    Zy ep dz    Zz eo d{    Z{ ep d|    Z| eo d}    Z} ep d~    Z~ eo d    Z ep d    Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z eW d   d    Z eW d   d    Z eW d   d    Z eW d   d    Z d   Z d   Z d   Z i  Z e e  Z e j d  Z d   Z eR e%  d    Z eR e&  d    Z eR e'  d    Z eR e-  d    Z eR e(  d    Z eR e)  d    Z eR e*  d    Z eR e+  d    Z eR e,  d    Z eR e8  d    Z eR e9  d    Z eR e:  d    Z eR e.  d    Z eR e/  d    Z eR e0  d    Z eR e1  d    Z eR e4  d    Z eR e5  d    Z eR e7  d    Z eR e3  d    Z eR e6  d    Z eR e;  d    Z eR e<  d    Z eR e=  d    Z eR e>  d    Z eR e?  d    Z eR e@  d    Z eR eA  d    Z eR eB  d    Z eR eC  d    Z eR eD  d    Z eR eE  d    Z eR eF  d    Z eR eG  d    Z eR eH  d    Z eR eI  d    Z eR eJ  d    Z eR eK  d    Z eR eL  d    Z eR eM  d    Z eR eN  d    Z eR eO  d    Z eR e2  d    Z d   Z d   Z d S(   s  Integration method that emulates by-hand techniques.

This module also provides functionality to get the steps used to evaluate a
particular integral, in the ``integral_steps`` function. This will return
nested namedtuples representing the integration rules used. The
``manualintegrate`` function computes the integral using those steps given
an integrand; given the steps, ``_manualintegrate`` will evaluate them.

The integrator can be extended with new heuristics and evaluation
techniques. To do so, write a function that accepts an ``IntegralInfo``
object and returns either a namedtuple representing a rule or
``None``. Then, write another function that accepts the namedtuple's fields
and returns the antiderivative, and decorate it with
``@evaluates(namedtuple_type)``.  If the new technique requires a new
match, add the key and call to the antiderivative function to integral_steps.
To enable simple substitutions, add the match to find_substitutions.

i(   t   print_functiont   division(   t
   namedtuplet   defaultdictN(   t   reducet   Mapping(   t   Dict(   t	   fuzzy_not(   t   TrigonometricFunction(   t   OrthogonalPolynomial(   t	   Piecewise(   t   switcht   do_onet	   null_safet	   condition(   t   Eqt   Ne(   t   degree(   t   divisorst    c           sA   d       f d   } t  |  | d  }   | _ | | _ | S(   Nc         S  s"   |  j  | j  k o! t j |  |  S(   N(   t	   __class__t   tuplet   __eq__(   t   selft   other(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   (   s    c           s     |  |  S(   N(    (   R   R   (   R   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   <lambda>*   R   s    context symbol(   R   R   t   __ne__(   t   namet   propst   __neq__t   cls(    (   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   Rule&   s    			t   ConstantRulet   constantt   ConstantTimesRules   constant other substept	   PowerRules   base expt   AddRulet   substepst   URules   u_var u_func constant substept	   PartsRules   u dv v_step second_stept   CyclicPartsRules   parts_rules coefficientt   TrigRules   func argt   ExpRulet   ReciprocalRulet   funct
   ArcsinRulet   InverseHyperbolicRulet   AlternativeRulet   alternativest   DontKnowRulet   DerivativeRulet   RewriteRules   rewritten substept   PiecewiseRulet   subfunctionst   HeavisideRules   harg ibnd substept   TrigSubstitutionRules(   theta func rewritten substep restrictiont
   ArctanRules   a b ct   ArccothRulet   ArctanhRulet
   JacobiRules   n a bt   GegenbauerRules   n at   ChebyshevTRulet   nt   ChebyshevURulet   LegendreRulet   HermiteRulet   LaguerreRulet   AssocLaguerreRulet   CiRules   a bt   ChiRulet   EiRulet   SiRulet   ShiRulet   ErfRulet   FresnelCRulet   FresnelSRulet   LiRulet   PolylogRulet   UpperGammaRules   a et   EllipticFRules   a dt   EllipticERulet   IntegralInfos   integrand symbolc           s     f d   } | S(   Nc           s     |  _  |  t   <|  S(   N(   t   rulet
   evaluators(   R,   (   RR   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt
   _evaluatesa   s    	
(    (   RR   RT   (    (   RR   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt	   evaluates`   s    c         C  sv   t  |  t  r t Sx\ |  D]T } t  | t  rB t |  rn t Sq t  | t  r t d   | D  rn t Sq q Wt S(   Nc         s  s   |  ] } t  |  Vq d  S(   N(   t   contains_dont_know(   t   .0t   i(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pys	   <genexpr>p   s    (   t
   isinstanceR1   t   TrueR   RV   t   listt   anyt   False(   RR   t   val(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyRV   g   s    c         C  s  |  j  r|  j  d } t |  t j  rF | j |  t j |  d St |  t j  rw | j |  t j |  d St |  t j  r | j |  t j |  t j |  St |  t j  r | j |  t j |  t j |  St |  t j  r%t	 g  |  j  D] } t
 | |  ^ q	 St |  t j  rt |  j   d k rt |  j  d t j  r|  j  d t
 |  j  d |  Sqn  |  j |  S(   s  Derivative of f in form expected by find_substitutions

    SymPy's derivatives for some trig functions (like cot) aren't in a form
    that works well with finding substitutions; this replaces the
    derivatives for those particular forms with something that works better.

    i    i   i   (   t   argsRY   t   sympyt   tant   difft   sect   cott   csct   Addt   sumt   manual_difft   Mult   lent   Number(   t   ft   symbolt   arg(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyRh   t   s     	'().%c         G  s;  t  |  d k r^ | d } t | t t f  r@ | j   } q t |  s t d   q n* t  |  d k r| | g } n t d   g  } x | D] \ } } t | t j  r t j	 d  } |  j
 | j d d | t j d | |  d t }  | j | j d t j |  f  q q W|  j t |  |  S(   sn   
    A wrapper for `expr.subs(*args)` with additional logic for substitution
    of invertible functions.
    i   i    s(   Expected an iterable of (old, new) pairsi   s$   subs accepts either 1 or 2 argumentst   at   exact(   Rj   RY   R   R   t   itemst   iterablet
   ValueErrorR`   t   logt   Wildt   replaceR_   t   expRZ   t   appendt   subsR[   (   t   exprR_   t   sequencet   new_subst   oldt   newRo   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   manual_subs   s"    
 *c   
        s   g  }     f d   }   f d    x     D] } |  k rR q: n  t  |   } | | |  } | t k	 r: | \ } } |   j    k r q: n  | | | f }	 |	 | k r | j |	  q q: q: W| S(   Nc   
        s    | }  | j  k r t St | |    j   }  | j  k r   j   r | j   r t g    j   D] } t |   ^ qr  } t g  | j   D] } t |   ^ q  } | | k r t Sn  | j  d t St	 |  t
 j  rd |  j j rt
 j |  j  d k  rt
 j d d  g } t
 j d d  g } |  j j |  |  } | rg  | | f D] }	 | j |	 t  ^ q{\ } } | d k r| d k r| j   d |  j | |  } | j  d t Sqn  t S(   Nt   as_Addi   Ro   t   excludet   bi    (   t   free_symbolsR]   R   t   cancelt   is_rational_functiont   maxt   as_numer_denomR   t   as_independentRY   R`   t   PowRw   t
   is_Integert   AbsRu   t   baset   matcht   gett   ZERORy   (
   t   ut   u_difft   substitutedt   tt
   deg_beforet	   deg_afterRo   R   R   RX   (   t	   integrandRm   t   u_var(    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   test_subterm   s.    
.."1	c      	     s  t  |  t t j t j t j t j t j t j f  rD |  j	 d g St  |  t j
 t j t j t j t j f  r |  j	 d g St  |  t j t j f  r |  j	 d g St  |  t j  r |  j	 d g St  |  t j  rg  } x1 |  j	 D]& } | j |  | j   |   q W| St  |  t j  rKg  } |  j	 d j   r]| j |  j	 d  n- |  j	 d j   r| j |  j	 d  n  |  j	 d j rG| j g  t |  j	 d  D]@ } d | k  ot |  j	 d  k  n r|  j	 d | ^ q |  j	 d j rG| j g    |  j	 d  D] } | j r%| ^ q% qGn  | St  |  t j  rg  } x1 |  j	 D]& } | j |  | j   |   qmW| Sg  S(   Ni    i   i   i   (   RY   R   R`   t   asint   acost   atanRw   Rt   t	   HeavisideR_   t
   chebyshevtt
   chebyshevut   legendret   hermitet   laguerret
   gegenbauert   assoc_laguerret   jacobiRi   Rx   t   extendR   t   is_constantR   R   t   abst   is_Addt   is_PowRf   (   t   termt   rR   t   dR   Rn   (   t   possible_subtermsRm   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR      sJ    	 A (   Rh   R]   Ry   Rx   (
   R   Rm   R   t   resultsR   R   R   t   new_integrandR!   t   substitution(    (   R   R   Rm   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   find_substitutions   s      'c           s      f d   } | S(   s$   Strategy that rewrites an integrand.c           sr   |  \ } }   |    rn  |    } | | k rn t  | |  } t | t  rk | rk t | | | |  Sqn n  d  S(   N(   t   integral_stepsRY   R1   R3   (   t   integralR   Rm   t	   rewrittent   substep(   R   t   rewrite(    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt	   _rewriter	  s    (    (   R   R   R   (    (   R   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   rewriter  s    c           s      f d   } | S(   sA   Strategy that rewrites an integrand based on some other criteria.c           so   |  \ }  } | \ } } |  t  |  }   |   rk  |   } | | k rk t | t | |  | |  Sn  d  S(   N(   R[   R3   R   (   t   criteriaR   R   Rm   R_   R   (   R   R   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   _proxy_rewriter  s    (    (   R   R   R   (    (   R   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   proxy_rewriter  s    c           s     f d   } | S(   s4   Apply the rule that matches the condition, else Nonec           s7   x0   j    D]" \ } } | |   r | |   Sq Wd  S(   N(   Rq   (   Rz   t   keyRR   (   t
   conditions(    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   multiplexer_rl'  s    (    (   R   R   (    (   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   multiplexer%  s    c            s     f d   } | S(   sH   Strategy that makes an AlternativeRule out of multiple possible results.c           s   g  } xX   D]P } | |   } | r t  | t  r | |  k r | | k r | j |  q q Wt |  d k r{ | d S| r g  | D] } t |  s | ^ q } | r t | |   St | |   Sn  d  S(   Ni   i    (   RY   R1   Rx   Rj   RV   R/   (   R   t   altsRR   t   resultt   doable(   t   rules(    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   _alternatives/  s    %(    (   R   R   (    (   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR0   -  s    c         C  s   |  \ } } t  |  j |   S(   N(   R    R   (   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   constant_rule@  s    c         C  s6  |  \ } } | j    \ } } | | j k r{ t | t j  r{ t j | d  d k rh t | | |  St | | | |  S| | j k r2t | t j  r2t | | | |  } t	 t j
 |  j  r | St j
 |  j r t d d |  St | t j t j
 |  d  f t d d |  t f g | |  Sd  S(   Ni   i    (   t   as_base_expR   RY   R`   t   Symbolt   simplifyR+   R#   R*   R   Rt   t   is_zeroR    R4   R   RZ   (   R   R   Rm   R   Rw   RR   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt
   power_ruleD  s     !!c         C  sF   |  \ } } t  | j d t j  rB t t j | j d | |  Sd  S(   Ni    (   RY   R_   R`   R   R*   t   E(   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   exp_ruleY  s    c           s  i t  t j 6t t j 6t t j 6t t j 6t	 t j
 6t t j 6t t j 6t t j 6} i d t j 6d t j 6d t j 6} |  \ }   x | D] } t | |  r | j | d  } | j |   k rt   f d   | j |  D  r| j |  |   f } | | |   Sq q Wd  S(   Ni   i   i   c         3  s   |  ] } | j     Vq d  S(   N(   t   has(   RW   t   v(   Rm   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pys	   <genexpr>t  s    (   R;   R`   R   R<   R   R=   R   R?   R   R@   R   RA   R   RB   R   RC   R   RY   R   R_   R\   (   R   t   orthogonal_poly_classest   orthogonal_poly_var_indexR   t   klasst	   var_indexR_   (    (   Rm   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   orthogonal_poly_rule_  s*    








$c           s  |  \ } } t  j d d | g d d   g } t  j d d | g } t  j d d | g } t  j d d | g d d   g } t  j d	 d | g d d
   g } | | | | | f } t  j t  j | | |  | d  t f t  j t  j | | |  | d  t f t  j t  j | | |  | d  t	 f t  j t  j
 | | |  | d  t f t  j t  j | | |  | d  t f t  j d t  j | | |  d  t f t  j t  j | | d | | |  d  t f t  j
 t  j
 | | d | | |  d  t f t  j t  j | | d | | |  d  t f t  j | | t  j | |  d  t f t  j t  j | | |  | d  t f t  j d t  j | | t  j
 |  d  d   t f t  j t  j | | t  j
 |  d  d   t f f }	 x |	 D] }
 t | |
 d  r| j |
 d      rt   f d   | D  } |
 d d  k sf|
 d |   r| | | f } |
 d |   SqqqWd  S(   NRo   R   t
   propertiesc         S  s   |  j  S(   N(   R   (   t   x(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   {  R   R   t   cR   c         S  s   |  j  S(   N(   R   (   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   ~  R   t   ec         S  s   |  j  o |  j S(   N(   t   is_nonnegativet
   is_integer(   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR     R   i   i   c         S  s
   |  | k S(   N(    (   Ro   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR     R   c         S  s
   |  | k S(   N(    (   Ro   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR     R   i    c         3  s3   |  ]) }   j  |  d  k	 r   j  |  Vq d  S(   N(   R   t   None(   RW   t   w(   R   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pys	   <genexpr>  s    i   (   R`   Ru   Ri   Rw   R   RF   t   cosRD   t   coshRE   t   sinRG   t   sinhRH   R   Rt   RL   RI   RK   RJ   RN   t   polylogRM   t   sqrtRO   RP   RY   R   R   (   R   R   Rm   Ro   R   R   R   R   t   wildst   patternst   pt	   wild_valsR_   (    (   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   special_function_ruley  s>    $$''''''///'&+' c           s|  |  \    j    \   } t j d d  g } t j d d  g }   j | |  d  } | ss d  Sd   } d   } d   }     f d   } g  | | f D] }	 | j |	 t  ^ q \ } } g  }
 t j d | d	  d
 k r|
 j t | | d	 | d t j	 | d
 k | d
 k   f  |
 j | | | d	 | d	 t j	 | d
 k | d
 k  f  |
 j | | | d | d	 t j	 | d
 k  | d
 k  f  n  g  |
 D] } | d t j
 k	 r| ^ q}
 | j r;| j r;g  |
 D] } | d t j k r| ^ q} t |  d	 k rx| | d
 d    Sn= |
 rxt g  |
 D]  } | | d    | d f ^ qK   Sd  S(   NRo   R   R   i   c         S  s   |  j  p |  j   S(   N(   t   is_negativet   could_extract_minus_sign(   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   negative  s    c         S  s   t  t j |  |  S(   N(   R.   R`   t   asinh(   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   ArcsinhRule  s    c         S  s   t  t j |  |  S(   N(   R.   R`   t   acosh(   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   ArccoshRule  s    c           sx  t  j d  }   }  } d  }	 }
 } }  } | d k rp | | }	 | | | | | d } | | } n  | | d k r t  j | |   }
 t  j | |  } | } | | | d } n  |  | | |  } |
 d  k	 rA| d k r#| d  k	 r#t | | | | | | |   } n  t | |
 | | |   } n  |	 d  k	 rt| d  k	 rtt |	 | |    } n  | S(   NR   i   i   (   R`   t   DummyR   R   R"   R&   (   t	   RuleClasst   base_expRo   t   sign_aR   t   sign_bR   t   current_baset   current_symbolR!   t   u_funct
   u_constantR   t   factored(   R   R   Rm   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   make_inverse_trig  s0    
i   i    i(   R   R`   Ru   R   R   R   R   Rx   R-   t   Andt   falset	   is_numbert   trueRj   R4   (   R   Rw   Ro   R   R   R   R   R   R   RX   t   possibilitiesR   t   possibility(    (   R   R   Rm   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   inverse_trig_rule  s4    			1;:>,,*c         C  sT   |  \ } } g  | j    D] } t | |  ^ q } d  | k rD d  St | | |  S(   N(   t   as_ordered_termsR   R   R$   (   R   R   Rm   t   gR   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   add_rule  s    %c         C  sk   |  \ } } | j  } | j |  \ } } t | |  } | d k rg | d  k	 rg t | | | | |  Sd  S(   Ni   (   R_   R   R   R   R"   (   R   R   Rm   R_   t   coeffRl   t	   next_step(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   mul_rule  s    	c           s    f d   } d   } | t  j  | t  j t  j t  j  | | t  j t  j  | t  j  g } t  j d  } t	 |  t  j t  j t  j t  j f  r | |  }  n  xUt
 |  D]G\ } } | |   } | r | \ }	 }
   |	 j k r |	 j |  r d  S|	 j | d  }	 |
 j | d  }
 | | k rD|	 j    rDd  St	 |	 t  j  rd |
 } | j    rt |    d k rd  Sn  | | k rt	 |
 t  rt |
    } t |  rd  S|	 j    } t |  } |	 |
 | | | f Sn  t } | d k  rt } n | | k rH|
 j rHt d   |
 j D  rHt } nT xQ | | d D]A } | |   } | rW| d j | d  j |
  rWt } PqWqWW| r|	 j    } t t  j |
     } t |  st |  } |	 |
 | | | f Sqq q Wd  S(   Nc           s   |  j    j   }  t |  t j  r* g  n( g  |  j D] } | j    r4 | ^ q4 } | r t j |   } |  | j    } | | f Sd  S(   N(   R   t   togetherRY   R`   R
   R_   t   is_algebraic_exprRi   (   R   Rn   t	   algebraicR   t   dv(   Rm   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   pull_out_algebraic  s    +c            s     f d   } | S(   Nc           s   t  g   D] } |  j |  ^ q
  r g  |  j D](   t    f d    D  r2   ^ q2 } | r t d   |  } |  | } | | f Sn  d  S(   Nc         3  s   |  ] } t    |  Vq d  S(   N(   RY   (   RW   R   (   Rn   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pys	   <genexpr>  s    c         S  s   |  | S(   N(    (   Ro   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   	  R   (   R\   R   R_   R   (   R   Rl   R_   R   R	  (   t	   functions(   Rn   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   pull_out_u_rl  s    ((
(    (   R  R  (    (   R  s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt
   pull_out_u  s    	t	   temporaryi   i   c         s  s0   |  ]& } t  | t j t j t j f  Vq d  S(   N(   RY   R`   R   R   Rw   (   RW   Ro   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pys	   <genexpr>?  s   i    (   R`   Rt   R   R   R   R   R   Rw   R   RY   t	   enumerateR   R   Ry   t   is_polynomialR   R	   R   RV   Rb   t   _manualintegrateR]   RZ   R_   t   allt   equalsR   (   R   Rm   R
  R  t   liate_rulest   dummyt   indexRR   R   R   R	  t   rec_dvt   v_stept   duR   t   acceptR   (    (   Rm   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   _parts_rule  s`    
	$'
			%c           s  |  \ }  | j    \ } } t |   } g  } | r+| \ } } } } }	 | j |  t | t j  rq d  St | t j t j t j t j	 t j
 f  r | j i t  6 }
 t |
 d k r d  St |
 c d 7<n  xMt d  D]<} | | | j   } | d k rPn   | j k rt g  | D]0 \ } } } } }	 t | | |	 d  d  d   ^ q+d t |  | |   } | d k r| rt | | | | |   } n  | S| | j    \ } } t |   } | r#| \ } } } } }	 | | 9} | | 9} | j | | | | |	 f  q Pq Wn     f d     | r| d \ } } } } }	 t | | |	   | d | |  |   } | d k r| rt | | | | |   } n  | Sd  S(   Ni   i   i   ic           ss   |  rI |  d \ } } } } } t  | | |   |  d | |  |   St |   }  |  rb |  St |   Sd  S(   Ni    i   (   R'   R   R1   (   t   stepsR   R   R	  R   R  R  (   t   make_second_stepRm   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR    s    
i    (   t   as_coeff_MulR  Rx   RY   R`   t   IntegralR   R   Rw   R   R   t   xreplacet   _cache_dummyt   _parts_u_cachet   rangeR   R   R(   R'   R   Rj   R"   (   R   R   R!   R   R  R   R	  R   R  R  t   cachekeyt   _t   coefficientRR   t   next_constantt   next_integrand(    (   R  Rm   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt
   parts_ruleQ  s\    -7

c         C  s?  |  \ } } t  | t j  s0 t  | t j  r | j d } t  | t j  sS d  St  | t j  rn d } n d } t | | | |  S| t j |  d k r t d | | |  S| t j |  d k r t d | | |  St  | t j	  rt j | j   t j | j   } nt  | t j
  rMt j | j   t j | j   } n t  | t j  r| j d } t j |  d t j	 |  t j |  t j |  t j	 |  } nm t  | t j  r| j d } t j |  d t j
 |  t j |  t j |  t j
 |  } n d  St | t | |  | |  S(   Ni    R   R   i   s   sec**2s   csc**2(   RY   R`   R   R   R_   R   R)   Rc   Re   Ra   Rd   R3   R   (   R   R   Rm   Rn   R,   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt	   trig_rule  s<    $	%%* * c         C  s  |  \ } } t  j |  t  j |  } | | } | | j k r t d | | |  } | d k r | r t | | | | |  } n  | St  j |  t  j |  } | | } | | j k rt d | | |  } | d k r | r t | | | | |  } n  | Sd  S(   Ns   sec*tani   s   csc*cot(   R`   Rc   Ra   R   R)   R"   Re   Rd   (   R   R   Rm   t   sectant   qRR   t   csccot(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   trig_product_rule  s    

c      	   C  sp  |  \ } } t  j d d | g } t  j d d | g } t  j d d | g } | j | | | d |  } | s} d  S| | | | | | } } } t t | | | | |  t  j | | d  f t | | | | |  t  j t  j | d | |  t  j | | d   f t	 | | | | |  t  j t  j | d | |  t  j | | d   f g | |  S(   NRo   R   R   R   i   i    (
   R`   Ru   R   R4   R8   t   GtR9   R   t   LtR:   (   R   R   Rm   Ro   R   R   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   quadratic_denom_rule  s     .LOc         C  s  |  \ } } t  j d d | g } t  j d d | g } t  j d  } | j t  j | | |  |  } | sy d  S| | | | | | } } } t  j d d | g } t  j d d | g } t  j d  }	 | j t  j | | |  |	  }
 |
 rd  St  j d  } t  j | | |  } | j | |  } | j | | d	 | |  } | d	 | | } t | |  } | rt | | d  | | |  Sd  S(
   NRo   R   R   R   R   R   Rl   R   i   (	   R`   Ru   R   R   R   Ry   R   R&   R   (   R   R   Rm   Ro   R   R   R   R   R   Rl   t   recursion_testR   R   R  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   root_mul_rule  s,    $ $c         C  s   t  j d d |  g } t  j d d |  g } t  j d d |  g d d   g } t  j d d |  g d d   g } | | | | f S(	   NRo   R   R   t   mR   c         S  s   t  |  t j  S(   N(   RY   R`   t   Integer(   R>   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   
  R   R>   c         S  s   t  |  t j  S(   N(   RY   R`   R5  (   R>   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR     R   (   R`   Ru   (   Rm   Ro   R   R4  R>   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt
   make_wilds  s
    $$c         C  sW   t  |   \ } } } } t j | |   | t j | |   | } | | | | | f S(   N(   R6  R`   R   R   (   Rm   Ro   R   R4  R>   t   pattern(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   sincos_pattern  s    ,c         C  sW   t  |   \ } } } } t j | |   | t j | |   | } | | | | | f S(   N(   R6  R`   Ra   Rc   (   Rm   Ro   R   R4  R>   R7  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   tansec_pattern  s    ,c         C  sW   t  |   \ } } } } t j | |   | t j | |   | } | | | | | f S(   N(   R6  R`   Rd   Re   (   Rm   Ro   R   R4  R>   R7  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   cotcsc_pattern  s    ,c         C  sj   t  j d d |  g } t  j d d |  g } t  j d  } t  j | |  |  | } | | | | f S(   NR4  R   R   R  (   R`   Ru   R   (   Rm   R4  R   R  R7  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   heaviside_pattern$  s
    c           s     f d   } | S(   Nc           s
     |    S(   N(    (   R_   (   R,   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt
   uncurry_rl.  s    (    (   R,   R<  (    (   R,   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   uncurry-  s    c           s     f d   } | S(   Nc           s_   |  \ } } } } } }   | | | | | |  } | | k r[ t  | t | |  | |  Sd  S(   N(   R3   R   (   R_   Ro   R   R4  R>   R   Rm   R   (   R   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   trig_rewriter_rl3  s    (    (   R   R>  (    (   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   trig_rewriter2  s    c         C  s"   | j  o! | j  o! | j o! | j S(   N(   t   is_evenR   (   Ro   R   R4  R>   RX   t   s(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   >  s   c         C  sJ   d t  j d |  |  d | d d t  j d | |  d | d S(   Ni   i   (   R`   R   (   Ro   R   R4  R>   RX   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   B  s   $c         C  s   | j  o | d k S(   Ni   (   t   is_odd(   Ro   R   R4  R>   RX   RA  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   E  R   c         C  sK   d t  j |  |  d | d d t  j |  |  t  j | |  | S(   Ni   i   (   R`   R   R   (   Ro   R   R4  R>   RX   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   H  s    5c         C  s   | j  o | d k S(   Ni   (   RB  (   Ro   R   R4  R>   RX   RA  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   L  R   c         C  sK   d t  j | |  d | d d t  j | |  t  j |  |  | S(   Ni   i   (   R`   R   R   (   Ro   R   R4  R>   RX   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   O  s    5c         C  s   | j  o | d k S(   Ni   (   R@  (   Ro   R   R4  R>   RX   RA  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   S  R   c         C  sO   d t  j | |  d | d d t  j | |  d t  j |  |  | S(   Ni   i   (   R`   Ra   Rc   (   Ro   R   R4  R>   RX   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   U  s    9c         C  s   | j  S(   N(   RB  (   Ro   R   R4  R>   RX   RA  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   Y  R   c         C  sK   t  j |  |  d d | d d t  j |  |  t  j | |  | S(   Ni   i   (   R`   Rc   Ra   (   Ro   R   R4  R>   RX   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   [  s    5c         C  s   | d k o | d k S(   Ni   i    (    (   Ro   R   R4  R>   RX   RA  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   _  R   c         C  s   t  j |  |  d d S(   Ni   i   (   R`   Rc   (   Ro   R   R4  R>   RX   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   a  R   c         C  s   | j  o | d k S(   Ni   (   R@  (   Ro   R   R4  R>   RX   RA  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   c  R   c         C  sO   d t  j | |  d | d d t  j | |  d t  j |  |  | S(   Ni   i   (   R`   Rd   Re   (   Ro   R   R4  R>   RX   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   e  s    9c         C  s   | j  S(   N(   RB  (   Ro   R   R4  R>   RX   RA  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   i  R   c         C  sK   t  j |  |  d d | d d t  j |  |  t  j | |  | S(   Ni   i   (   R`   Re   Rd   (   Ro   R   R4  R>   RX   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   k  s    5c   	        s   |  \   } t    f d   t j t j f D  r t |  \ } } } } }   j |  } | sh d  St i t t 6t	 t
 6t t 6 t g  | | | | f D] } | j | t  ^ q   | g   Sd  S(   Nc         3  s   |  ] }   j  |  Vq d  S(   N(   R   (   RW   Rl   (   R   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pys	   <genexpr>r  s    (   R\   R`   R   R   R8  R   R   t   sincos_bothevent   sincos_botheven_conditiont   sincos_sinoddt   sincos_sinodd_conditiont   sincos_cosoddt   sincos_cosodd_conditionR   R   R   (	   R   Rm   R7  Ro   R   R4  R>   R   RX   (    (   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   trig_sincos_ruleo  s    (
.c   	        s   |  \   }   j  i t j |  d t j |  6   t   f d   t j t j f D  r t |  \ } } } } }   j |  } | s d  St i t	 t
 6t t 6t t 6 t g  | | | | f D] } | j | t  ^ q   | g   Sd  S(   Ni   c         3  s   |  ] }   j  |  Vq d  S(   N(   R   (   RW   Rl   (   R   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pys	   <genexpr>  s    (   Ry   R`   Rc   R   R\   Ra   R9  R   R   t   tansec_tanoddt   tansec_tanodd_conditiont   tansec_secevent   tansec_seceven_conditiont   tan_tansquaredt   tan_tansquared_conditionR   R   R   (	   R   Rm   R7  Ro   R   R4  R>   R   RX   (    (   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   trig_tansec_rule  s    	#(
.c   	        s4  |  \   }   j  i t j |  d t j |  6t j |  d t j |  6t j |  t j |  t j |  6   t   f d   t j t j f D  r0t |  \ } } } } }   j	 |  } | s d  St
 i t t 6t t 6 t g  | | | | f D] } | j | t  ^ q  | g   Sd  S(   Ni   c         3  s   |  ] }   j  |  Vq d  S(   N(   R   (   RW   Rl   (   R   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pys	   <genexpr>  s    (   Ry   R`   Re   R   Rd   Ra   R   R\   R:  R   R   t   cotcsc_cotoddt   cotcsc_cotodd_conditiont   cotcsc_cscevent   cotcsc_csceven_conditionR   R   R   (	   R   Rm   R7  Ro   R   R4  R>   R   RX   (    (   R   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   trig_cotcsc_rule  s     	,(
.c         C  s   |  \ } } t  j d d t  j d |  g } | j t  j d |  |  } | r d t  j |  t  j |  t  j d |  } t | | |  Sd  S(   NRo   R   i   (   R`   Ru   R   R   R   R   (   R   R   Rm   Ro   R   t
   sin_double(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   trig_sindouble_rule  s    % 1c         C  s1   t  t t  t t  t t  t t   |   S(   N(   R   R   RI  RP  RU  RW  (   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   trig_powers_products_rule  s    		c      	   C  s  |  \ } } t  j d d d | g } t  j d d d | g } t  j d  } | | | d } | j |  } x'| D]} | j |  }	 |	 j | t  }
 |	 j | t  } |
 j r |
 d k p |
 j } | j r | d k p | j } |
 j r|
 d k  p	|
 j	 } | j r!| d k  p'| j	 } d  } | rn| rnt  j |
  t  j |  t  j |  } t } n | r| rt  j |
  t  j |  } | t  j |  } t  j | | k | | k   } n^ | r*| r*t  j |
  t  j |  } | t  j |  } t  j | | k | | k   } n  | ry i  } x| t  j t  j t  j t  j t  j t  j g D]P } | |  | t  j | |  d  <d | |  | t  j | |  d  <qaW| j | |  j   } t | |  } | j |  s| t | |  9} | j   } | j d t  j |   } | r[| j i t  j |  d t  j |  6 } n  t | |  } t |  st | | | | | | |  Sqqy qy Wd  S(	   NRo   R   i    R   t   thetai   i   i(   R`   Ru   R   t   findR   R   R   R   t   is_positiveR   R   R   Ra   RZ   R   R   Rc   R   Re   Rd   Ry   t   trigsimpR   R   Rh   R   R   RV   R7   (   R   R   Rm   t   At   BRY  t   target_patternt   matchesRz   R   Ro   R   t
   a_positivet
   b_positivet
   a_negativet
   b_negativet   x_funct   restrictionR!   t   substitutionsRl   t   replacedt   secantsR   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   trig_substitution_rule  s\    )	""#+	&c   
      C  s   |  \ } } t  |  \ } } } } | j |  } | r d | | k r t | | |  } t |  }	 | | | | } } t | | | | | |	 | |  Sd  S(   Ni    (   R;  R   R   R  R6   (
   R   R   Rm   R7  R4  R   R  R   R  R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   heaviside_rule  s    c      	   C  sj  |  \ } } t  j d  } t | | |  } | rg  } xw| D]o\ } } } t | |  }	 t |	  rp q@ n  t  j | d  d k r| j   \ }
 } |	 r t | | |	 | |  }	 n  | j rg  } g  } t	 | t  j
  r | j } n | j |  xc | D][ } t | j  st t | | d  |  } | r^| j | t  j | d  f  q^qqW| j |	 t f  t | | |  }	 qn  | j t | | | |	 | |   q@ Wt |  d k rt | | |  S| rf| d Sn | j t  j  rft  j |  } d } | | j |  } | j | |  } | | j k rft | | | t | |  | |  Sn  d  S(   NR   i   i    (   R`   R   R   R   RV   R   R   R"   R   RY   Ri   R_   Rx   R   R   R   R   RZ   R4   R&   Rj   R/   R   Rw   Rb   Ry   (   R   R   Rm   R   Rg  t   waysR   R   R   t   subruleR%  t   denomt	   piecewiset   could_be_zeroRz   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   substitution_rule   sX    	 c         C  s
   |  j    S(   N(   R   (   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   ;  R   c         C  s   |  j  |  S(   N(   t   apart(   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   <  R   c         C  s   t  S(   N(   RZ   (   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   A  R   c         C  s
   |  j    S(   N(   R   (   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   B  R   c           sA   t    f d   |  j D  p@ t |  t j  p@ t |  t j  S(   Nc         3  s'   |  ] } | j  p | j    Vq d  S(   N(   R   R  (   RW   Rn   (   Rm   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pys	   <genexpr>F  s    (   R  R_   RY   R`   R   Ri   (   R   Rm   (    (   Rm   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   E  s    c         C  s
   |  j    S(   N(   t   expand(   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   I  R   c         C  s)   t  t d   |  j t  D   d k S(   Nc         s  s   |  ] } | j  d  Vq d S(   i    N(   R_   (   RW   Ro   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pys	   <genexpr>N  s    i   (   Rj   t   sett   atomsR   (   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   M  s    c         C  s   |  j  d t  S(   Nt   trig(   Rs  RZ   (   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   O  R   c         C  st   |  d } | j  } | j } | j } |  j | k r` |  j | k rM t |    St | |  j  Sn t |  j |   Sd  S(   Ni    (   t	   variablesRz   R   Rm   R2   R1   R    R   (   R   R   t   diff_variablest   undifferentiated_functiont   integrand_variables(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   derivative_ruleQ  s    
			
c         C  sp   |  \ } } | j  d t j |   rl | j d t j |  t j |   } t | t | |  | |  Sd  S(   Ni   (   R   R`   R   Ry   Rc   R3   R   (   R   R   Rm   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   rewrites_rule_  s    (c         C  s
   t  |    S(   N(   R1   (   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   fallback_rulef  s    t   zc           s%  |  j  i t  6 } | t k r\ t | d k r? t |    St | j  t    f Sn
 d t | <t |    }  f d       f d   } t t t  t t	   i
 t t t
  t t  t t   t j 6t
 t j 6t t j 6t t j 6t t t  t t  t t  t t  t t   t j 6t t j 6t t 6t t j 6t t 6t  t j! 6  t t t  t t" t# t$ t% | t j t j  t&  t% | t j t j  t'  t% | t j t j( t j) t j* t j+  t,  t% | t j t j  t-  t. t/   t t0   t1  |  } t | =| S(   s  Returns the steps needed to compute an integral.

    This function attempts to mirror what a student would do by hand as
    closely as possible.

    SymPy Gamma uses this to provide a step-by-step explanation of an
    integral. The code it uses to format the results of this function can be
    found at
    https://github.com/sympy/sympy_gamma/blob/master/app/logic/intsteps.py.

    Examples
    ========

    >>> from sympy import exp, sin, cos
    >>> from sympy.integrals.manualintegrate import integral_steps
    >>> from sympy.abc import x
    >>> print(repr(integral_steps(exp(x) / (1 + exp(2 * x)), x)))     # doctest: +NORMALIZE_WHITESPACE
    URule(u_var=_u, u_func=exp(x), constant=1,
    substep=PiecewiseRule(subfunctions=[(ArctanRule(a=1, b=1, c=1, context=1/(_u**2 + 1), symbol=_u), True),
        (ArccothRule(a=1, b=1, c=1, context=1/(_u**2 + 1), symbol=_u), False),
        (ArctanhRule(a=1, b=1, c=1, context=1/(_u**2 + 1), symbol=_u), False)],
    context=1/(_u**2 + 1), symbol=_u), context=exp(x)/(exp(2*x) + 1), symbol=x)
    >>> print(repr(integral_steps(sin(x), x)))     # doctest: +NORMALIZE_WHITESPACE
    TrigRule(func='sin', arg=x, context=sin(x), symbol=x)
    >>> print(repr(integral_steps((x**2 + 3)**2 , x)))     # doctest: +NORMALIZE_WHITESPACE
    RewriteRule(rewritten=x**4 + 6*x**2 + 9,
    substep=AddRule(substeps=[PowerRule(base=x, exp=4, context=x**4, symbol=x),
        ConstantTimesRule(constant=6, other=x**2,
            substep=PowerRule(base=x, exp=2, context=x**2, symbol=x),
                context=6*x**2, symbol=x),
        ConstantRule(constant=9, context=9, symbol=x)],
    context=x**4 + 6*x**2 + 9, symbol=x), context=(x**2 + 3)**2, symbol=x)


    Returns
    =======
    rule : namedtuple
        The first step; most rules have substeps that must also be
        considered. These substeps can be evaluated using ``manualintegrate``
        to obtain a result.

    c           s   |  j  } t | t  r t St | t j  r5 t j S  | j k rK t j Sx` t j t j t j	 t j
 t j t j t j t j t j t j t f D] } t | |  r | Sq Wd  S(   N(   R   RY   R   R`   t
   DerivativeR   Rk   R   R   Rw   Rt   Rf   Ri   R   R   R   R   R	   (   R   R   R   (   Rm   (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR     s    	c            s      f d   } | S(   Nc           s     |   } | o t  |   S(   N(   t
   issubclass(   R   t   k(   R   t   klasses(    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   _integral_is_subclass  s    (    (   R  R  (   R   (   R  s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   integral_is_subclass  s    N(2   R   R!  t   _integral_cacheR   R1   RQ   R   R   R   R   R   R   R1  R`   R   R   R   Rw   R  Rf   R  R.  Rk  R3  Ri   R{  R  R*  R   R   R   R	   R   Rk   R0   R|  Rq  R   t   partial_fractions_rulet   cancel_ruleRt   R   R   R   R)  t   distribute_expand_ruleRX  t   trig_expand_ruleRj  R}  (   R   Rm   t   optionsR$  R   R  R   (    (   R   Rm   s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR   p  sb    .

	




	$	c         C  s   |  | S(   N(    (   R!   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_constant  s    c         C  s   |  t  |  S(   N(   R  (   R!   R   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_constanttimes  s    c         C  sA   t  j |  | d | d t  j | d  f t  j |   t f  S(   Ni   i(   R`   R
   R   Rt   RZ   (   R   Rw   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt
   eval_power  s    %c         C  s   | t  j |   S(   N(   R`   t   ln(   R   Rw   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_exp  s    c         C  s   t  t t |    S(   N(   Rg   t   mapR  (   R%   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_add  s    c         C  s_   t  |  } | j rO | j d k rO | j t j |   t j | j   } n  | j |  |  S(   Ni(   R  R   Rw   Ry   R`   Rt   R   (   R   R   R!   R   R   Rm   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_u  s    +c         C  s   t  |  } |  | t  |  S(   N(   R  (   R   R	  R  t   second_stepR   Rm   R   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt
   eval_parts  s    c         C  sc   d | } g  } d } x9 |  D]1 } | j  | | j t | j   | d 9} q Wt j |   | S(   Ni   i(   Rx   R   R  R  R`   Rf   (   t   parts_rulesR&  R   Rm   R   t   signRR   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_cyclicparts  s    
!c         C  s   |  d k r t  j |  S|  d k r3 t  j |  S|  d k rL t  j |  S|  d k re t  j |  S|  d k r~ t  j |  S|  d k r t  j |  Sd  S(   NR   R   s   sec*tans   csc*cots   sec**2s   csc**2(   R`   R   R   Rc   Re   Ra   Rd   (   R,   Rn   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt	   eval_trig   s    c         C  s;   |  | d t  j | |  t  j | t  j | |   S(   Ni   (   R`   R   R   (   Ro   R   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_arctan/  s    c         C  s>   |  | d t  j | |  t  j | t  j | |   S(   Ni   (   R`   R   t   acoth(   Ro   R   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_arccoth3  s    c         C  s>   |  | d t  j | |  t  j | t  j | |   S(   Ni   (   R`   R   t   atanh(   Ro   R   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_arctanh7  s    c         C  s   t  j |   S(   N(   R`   R  (   R,   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_reciprocal;  s    c         C  s   t  j |  S(   N(   R`   R   (   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_arcsin?  s    c         C  s
   |  |  S(   N(    (   R,   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_inversehyperbolicC  s    c         C  s   t  |  d  S(   Ni    (   R  (   R0   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_alternativeG  s    c         C  s
   t  |  S(   N(   R  (   R   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_rewriteK  s    c         C  s2   t  j g  |  D] \ } } t |  | f ^ q   S(   N(   R`   R
   R  (   R%   R   Rm   R   t   cond(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_piecewiseO  s    	c         C  s  | j  t j |   d t j |    } t | j t   } t |  d k sU t  | d } t j	 | | |  } t |  d k s t  t j
 | d  \ }	 }
 t | t j  r |	 } |
 } t j |
 d |	 d  } t j | d  } n t | t j  rD|	 } |
 } t j |
 d |	 d  } t j | d  } nO t | t j  r|	 } |
 } t j |
 d |	 d  } t j | d  } n  t j |   | | f t j |   | | f t j |   | | f |  | f g } t j t |  j  |  j   | f  S(   Ni   i    i   (   Ry   R`   Rc   R   R[   RZ  R   Rj   t   AssertionErrort   solvet   fractionRY   R   R   R   R   Ra   R   R
   R  R\  (   RY  R,   R   R   Rf  R   Rm   t   trig_functiont   relationt   numerRn  t   oppositet
   hypotenuset   adjacentt   inverseR   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_trigsubstitutionT  s8    (
c         C  si   t  |  j  } xD t |  D]6 \ } \ } } | | k r | | d f | | <Pq q Wt j |  j |  S(   Ni   (   R[   t   variable_countR  R`   R  Rz   (   R   Rm   R  RX   t   vart   count(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_derivativeruley  s    c         C  s!   t  j |   | | j | |  S(   N(   R`   R   Ry   (   t   hargt   ibndR   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_heaviside  s    c         C  s   t  d t j |  d | d | d |  |  | | t |  | | d  f | t |  d  f | | d | d d | | | d t |  d  f  S(   Ni   i   i    i   (   R
   R`   R   R   R   (   R>   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_jacobi  s    Hc         C  su   t  t j |  d | d |  d | d t | d  f t j |  d |  |  d t |  d  f t j j t f  S(   Ni   i   i(   R
   R`   R   R   R   t   St   ZeroRZ   (   R>   Ro   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_gegenbauer  s    5*c         C  sk   t  t j |  d |  |  d t j |  d |  |  d d t t j |   d  f | d d t f  S(   Ni   i   (   R
   R`   R   R   R   RZ   (   R>   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_chebyshevt  s    8c         C  s@   t  t j |  d |  |  d t |  d  f t j j t f  S(   Ni   i(   R
   R`   R   R   R  R  RZ   (   R>   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_chebyshevu  s    *c         C  s4   t  j |  d |  t  j |  d |  d |  d S(   Ni   i   (   R`   R   (   R>   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_legendre  s    c         C  s    t  j |  d |  d |  d S(   Ni   i   (   R`   R   (   R>   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_hermite  s    c         C  s$   t  j |  |  t  j |  d |  S(   Ni   (   R`   R   (   R>   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_laguerre  s    c         C  s   t  j |  d | d |  S(   Ni   (   R`   R   (   R>   Ro   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_assoclaguerre  s    c         C  s<   t  j |  t  j |  |  t  j |  t  j |  |  S(   N(   R`   R   t   CiR   t   Si(   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_ci  s    c         C  s<   t  j |  t  j |  |  t  j |  t  j |  |  S(   N(   R`   R   t   ChiR   t   Shi(   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_chi  s    c         C  s   t  j |  t  j |  |  S(   N(   R`   Rw   t   Ei(   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_ei  s    c         C  s<   t  j |  t  j |  |  t  j |  t  j |  |  S(   N(   R`   R   R  R   R  (   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_si  s    c         C  s<   t  j |  t  j |  |  t  j |  t  j |  |  S(   N(   R`   R   R  R   R  (   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_shi  s    c         C  s   t  t j t j |   d t j | | d d |   t j d |  | | d t j |    |  d k  f t j t j |   d t j | | d d |   t j d |  | | d t j |    t f  S(   Ni   i   ii    (   R
   R`   R   t   piRw   t   erft   erfiRZ   (   Ro   R   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_erf  s
    574c         C  s   t  j t  j d |   t  j | d d |  |  t  j d |  | | t  j d |  t  j   t  j | d d |  |  t  j d |  | | t  j d |  t  j   S(   Ni   i   (   R`   R   R  R   t   fresnelcR   t   fresnels(   Ro   R   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_fresnelc  s    Mc         C  s   t  j t  j d |   t  j | d d |  |  t  j d |  | | t  j d |  t  j   t  j | d d |  |  t  j d |  | | t  j d |  t  j   S(   Ni   i   (   R`   R   R  R   R  R   R  (   Ro   R   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_fresnels  s    Mc         C  s   t  j |  | |  |  S(   N(   R`   t   li(   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_li  s    c         C  s   t  j | d |  |  S(   Ni   (   R`   R   (   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_polylog  s    c         C  s3   | | |  | | t  j | d |  |  |  S(   Ni   (   R`   t
   uppergamma(   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_uppergamma  s    c         C  s!   t  j | | |   t  j |   S(   N(   R`   t
   elliptic_fR   (   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_elliptic_f  s    c         C  s!   t  j | | |   t  j |   S(   N(   R`   t
   elliptic_eR   (   Ro   R   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_elliptic_e  s    c         C  s   t  j |  |  S(   N(   R`   R  (   R   Rm   (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   eval_dontknowrule  s    c         C  s;   t  j |  j  } | s1 t d t |     n  | |    S(   Ns   Cannot evaluate rule %s(   RS   R   R   Rs   t   repr(   RR   t	   evaluator(    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyR    s    c         C  s   t  t |  |   } t j   t | t  r t | j  d k r | j d d } t | t  r | j d d t	 k r | j
 | j d d t j | j   f | j d d t	 f  } q n  | S(   s  manualintegrate(f, var)

    Compute indefinite integral of a single variable using an algorithm that
    resembles what a student would do by hand.

    Unlike ``integrate``, var can only be a single symbol.

    Examples
    ========

    >>> from sympy import sin, cos, tan, exp, log, integrate
    >>> from sympy.integrals.manualintegrate import manualintegrate
    >>> from sympy.abc import x
    >>> manualintegrate(1 / x, x)
    log(x)
    >>> integrate(1/x)
    log(x)
    >>> manualintegrate(log(x), x)
    x*log(x) - x
    >>> integrate(log(x))
    x*log(x) - x
    >>> manualintegrate(exp(x) / (1 + exp(2 * x)), x)
    atan(exp(x))
    >>> integrate(exp(x) / (1 + exp(2 * x)))
    RootSum(4*_z**2 + 1, Lambda(_i, _i*log(2*_i + exp(x))))
    >>> manualintegrate(cos(x)**4 * sin(x), x)
    -cos(x)**5/5
    >>> integrate(cos(x)**4 * sin(x), x)
    -cos(x)**5/5
    >>> manualintegrate(cos(x)**4 * sin(x)**3, x)
    cos(x)**7/7 - cos(x)**5/5
    >>> integrate(cos(x)**4 * sin(x)**3, x)
    cos(x)**7/7 - cos(x)**5/5
    >>> manualintegrate(tan(x), x)
    -log(cos(x))
    >>> integrate(tan(x), x)
    -log(cos(x))

    See Also
    ========

    sympy.integrals.integrals.integrate
    sympy.integrals.integrals.Integral.doit
    sympy.integrals.integrals.Integral
    i   i    i   (   R  R   R"  t   clearRY   R
   Rj   R_   R   RZ   R,   R`   R   (   Rl   R  R   R  (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   manualintegrate  s    .
$&  (   t   __doc__t
   __future__R    R   t   collectionsR   R   R`   t   sympy.core.compatibilityR   R   t   sympy.core.containersR   t   sympy.core.logicR   t(   sympy.functions.elementary.trigonometricR   t#   sympy.functions.special.polynomialsR	   t$   sympy.functions.elementary.piecewiseR
   t   sympy.strategies.coreR   R   R   R   t   sympy.core.relationalR   R   t   sympy.polys.polytoolsR   t   sympy.ntheory.factor_R   R  R  R   R   R    R"   R#   R$   R&   R'   R(   R)   R*   R+   R-   R.   R/   R1   R2   R3   R4   R6   R7   R8   R9   R:   R;   R<   R=   R?   R@   RA   RB   RC   RD   RE   RF   RG   RH   RI   RJ   RK   RL   RM   RN   RO   RP   RQ   RS   RU   RV   Rh   R   R   R   R   R   R0   R   R   R   R   R   R   R  R  R  R)  R*  R.  R1  R3  t   cacheitR6  R8  R9  R:  R;  R=  R?  RD  RC  RF  RE  RH  RG  RM  RL  RK  RJ  RO  RN  RT  RS  RR  RQ  RI  RP  RU  RW  RX  Rj  Rk  Rq  R  R  R  R  R{  R|  R}  R  t   intR"  R   R!  R   R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  (    (    (    s>   lib/python2.7/site-packages/sympy/integrals/manualintegrate.pyt   <module>   sx  "
					!	Y									(	A			[	J	)													=		:				%
	