ó
¡¼™\c           @  s_   d  d l  m Z m Z d  d l m Z m Z m Z d  d l m Z d  d l	 m
 Z
 d „  Z d S(   iÿÿÿÿ(   t   print_functiont   division(   t   SingularityFunctiont
   DiracDeltat	   Heaviside(   t   sympify(   t	   integratec         C  sù   |  j  t ƒ s d S|  j t k r¸ t |  j d ƒ } t |  j d ƒ } t |  j d ƒ } | j sm | j r‰ t | | | d ƒ | d S| d k s¡ | d k r¸ t | | | d ƒ Sn  |  j sÊ |  j	 rõ |  j
 t ƒ } t | | ƒ } | j
 t ƒ Sd S(   s'  
    This function handles the indefinite integrations of Singularity functions.
    The ``integrate`` function calls this function internally whenever an
    instance of SingularityFunction is passed as argument.

    The idea for integration is the following:

    - If we are dealing with a SingularityFunction expression,
      i.e. ``SingularityFunction(x, a, n)``, we just return
      ``SingularityFunction(x, a, n + 1)/(n + 1)`` if ``n >= 0`` and
      ``SingularityFunction(x, a, n + 1)`` if ``n < 0``.

    - If the node is a multiplication or power node having a
      SingularityFunction term we rewrite the whole expression in terms of
      Heaviside and DiracDelta and then integrate the output. Lastly, we
      rewrite the output of integration back in terms of SingularityFunction.

    - If none of the above case arises, we return None.

    Examples
    ========
    >>> from sympy.integrals.singularityfunctions import singularityintegrate
    >>> from sympy import SingularityFunction, symbols, Function
    >>> x, a, n, y = symbols('x a n y')
    >>> f = Function('f')
    >>> singularityintegrate(SingularityFunction(x, a, 3), x)
    SingularityFunction(x, a, 4)/4
    >>> singularityintegrate(5*SingularityFunction(x, 5, -2), x)
    5*SingularityFunction(x, 5, -1)
    >>> singularityintegrate(6*SingularityFunction(x, 5, -1), x)
    6*SingularityFunction(x, 5, 0)
    >>> singularityintegrate(x*SingularityFunction(x, 0, -1), x)
    0
    >>> singularityintegrate(SingularityFunction(x, 1, -1) * f(x), x)
    f(1)*SingularityFunction(x, 1, 0)

    i    i   i   iÿÿÿÿiþÿÿÿN(   t   hasR   t   Nonet   funcR   t   argst   is_positivet   is_zerot   is_Mult   is_Powt   rewriteR   R   (   t   ft   xt   at   nt   expr(    (    sC   lib/python2.7/site-packages/sympy/integrals/singularityfunctions.pyt   singularityintegrate   s    'N(   t
   __future__R    R   t   sympy.functionsR   R   R   t
   sympy.coreR   t   sympy.integralsR   R   (    (    (    sC   lib/python2.7/site-packages/sympy/integrals/singularityfunctions.pyt   <module>   s   