U
    ZÊ¹j$Ê  ã                   @   sè  d Z ddlmZmZ ddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZmZmZmZ ddlm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mZ ddlm Z m!Z!m"Z" ddl#m$Z$m%Z% ddl&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZAmBZB ddlCmDZD ddlEmFZFmGZGmHZHmIZImJZJ ddlKmLZL ddlMmNZNmOZO ddlPmQZQ ddlRmSZS ddlTmUZU G d d!„ d!eVƒZWG d"d#„ d#eƒZXd$d%„ ZYd&d'„ ZZeZd(ƒZ[d)d*„ Z\e[e\d+fd,d-„ƒZ]G d.d/„ d/eXƒZ^d0d1„ Z_d2d3„ Z`G d4d5„ d5eaƒZbd6d7„ ZceZd+ƒdkd8d9„ƒZdd:aeG d;d<„ d<eXƒZfd=d>„ ZgeZd+ƒdld?d@„ƒZhG dAdB„ dBeXƒZiG dCdD„ dDeiƒZjdEdF„ ZkG dGdH„ dHeiƒZldIdJ„ ZmeZd+ƒdmdKdL„ƒZnG dMdN„ dNeXƒZoG dOdP„ dPeoƒZpdQdR„ ZqG dSdT„ dTeoƒZrdUdV„ ZsG dWdX„ dXeoƒZtdYdZ„ ZuG d[d\„ d\eoƒZvd]d^„ ZweZd+ƒdnd_d`„ƒZxG dadb„ dbeXƒZyG dcdd„ ddeyƒZzdedf„ Z{G dgdh„ dheyƒZ|didj„ Z}dd:l~m  m€Z� e�j‚Z‚e�jƒZƒe�j„Z„e�j…Z…e�j†Z†e�j‡Z‡d:S )oz Integral Transforms é    )ÚreduceÚwraps)Úrepeat)ÚSÚpi)ÚAdd)ÚAppliedUndefÚ	count_opsÚexpandÚ
expand_mulÚFunction)ÚMul)ÚigcdÚilcm)Údefault_sort_key)ÚDummy)Úpostorder_traversal)Ú	factorialÚrf)ÚreÚargÚAbs)ÚexpÚ	exp_polar)ÚcoshÚcothÚsinhÚtanh)Úceiling)ÚMaxÚMinÚsqrt)Úpiecewise_fold)ÚcosÚcotÚsinÚtan)Úbesselj)Ú	Heaviside)Úgamma)Úmeijerg)Ú	integrateÚIntegral)Ú_dummy)Úto_cnfÚ	conjunctsÚ	disjunctsÚOrÚAnd)Úroots)ÚfactorÚPoly)ÚCRootOf)Úiterable)Údebugc                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚIntegralTransformErroraš  
    Exception raised in relation to problems computing transforms.

    Explanation
    ===========

    This class is mostly used internally; if integrals cannot be computed
    objects representing unevaluated transforms are usually returned.

    The hint ``needeval=True`` can be used to disable returning transform
    objects, and instead raise this exception if an integral cannot be
    computed.
    c                    s   t ƒ  d||f ¡ || _d S )Nz'%s Transform could not be computed: %s.)ÚsuperÚ__init__Úfunction)ÚselfZ	transformr<   Úmsg©Ú	__class__© úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/integrals/transforms.pyr;   6   s    
ÿzIntegralTransformError.__init__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   Ú__classcell__rA   rA   r?   rB   r9   (   s   r9   c                   @   s|   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZedd	„ ƒZd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zedd„ ƒZdd„ ZdS )ÚIntegralTransforma}  
    Base class for integral transforms.

    Explanation
    ===========

    This class represents unevaluated transforms.

    To implement a concrete transform, derive from this class and implement
    the ``_compute_transform(f, x, s, **hints)`` and ``_as_integral(f, x, s)``
    functions. If the transform cannot be computed, raise :obj:`IntegralTransformError`.

    Also set ``cls._name``. For instance,

    >>> from sympy import LaplaceTransform
    >>> LaplaceTransform._name
    'Laplace'

    Implement ``self._collapse_extra`` if your function returns more than just a
    number and possibly a convergence condition.
    c                 C   s
   | j d S )z! The function to be transformed. r   ©Úargs©r=   rA   rA   rB   r<   S   s    zIntegralTransform.functionc                 C   s
   | j d S )z; The dependent variable of the function to be transformed. é   rI   rK   rA   rA   rB   Úfunction_variableX   s    z#IntegralTransform.function_variablec                 C   s
   | j d S )z% The independent transform variable. é   rI   rK   rA   rA   rB   Útransform_variable]   s    z$IntegralTransform.transform_variablec                 C   s   | j j | jh¡| jh S )zj
        This method returns the symbols that will exist when the transform
        is evaluated.
        )r<   Úfree_symbolsÚunionrO   rM   rK   rA   rA   rB   rP   b   s    ÿzIntegralTransform.free_symbolsc                 K   s   t ‚d S ©N©ÚNotImplementedError©r=   ÚfÚxÚsÚhintsrA   rA   rB   Ú_compute_transformk   s    z$IntegralTransform._compute_transformc                 C   s   t ‚d S rR   rS   ©r=   rV   rW   rX   rA   rA   rB   Ú_as_integraln   s    zIntegralTransform._as_integralc                 C   s$   t |Ž }|dkr t| jjd dƒ‚|S )NFÚ )r2   r9   r@   Úname)r=   ÚextraÚcondrA   rA   rB   Ú_collapse_extraq   s    z!IntegralTransform._collapse_extrac                    s‚   d }t ‡ fdd„ˆ j t¡D ƒƒ }|rfzˆ jˆ jˆ jˆ jf|Ž}W n  tk
rd   tdƒ d }Y nX ˆ j}|j	szt
|ƒ}||fS )Nc                 3   s   | ]}|  ˆ j¡V  qd S rR   )ÚhasrM   )Ú.0ÚfuncrK   rA   rB   Ú	<genexpr>y   s   ÿz2IntegralTransform._try_directly.<locals>.<genexpr>z6[IT _try ] Caught IntegralTransformError, returns None)Úanyr<   Úatomsr   rZ   rM   rO   r9   r8   Úis_Addr   )r=   rY   ÚTZtry_directlyÚfnrA   rK   rB   Ú_try_directlyw   s&    
ÿ
 ÿÿ
zIntegralTransform._try_directlyc                    sŠ  ˆ   dd¡}ˆ   dd¡}|ˆ d< ˆjf ˆ Ž\}}|dk	r<|S |j�r<|ˆ d< ‡ ‡fdd„|jD ƒ}g }g }|D ]\}	t|	tƒs‚|	g}	| |	d ¡ t|	ƒd	kr¬| |	d
 ¡ qnt|	ƒd	krn||	d
d… g7 }qn|dkrât|Ž  	¡ }nt|Ž }|sò|S z2ˆ 
|¡}t|ƒ�r|ft|ƒ W S ||fW S W n tk
�r:   Y nX |�rTtˆjjˆjdƒ‚| ˆj¡\}
}|
ˆjt|Ž gtˆjd
d… ƒ Ž  S )aÍ  
        Try to evaluate the transform in closed form.

        Explanation
        ===========

        This general function handles linearity, but apart from that leaves
        pretty much everything to _compute_transform.

        Standard hints are the following:

        - ``simplify``: whether or not to simplify the result
        - ``noconds``: if True, do not return convergence conditions
        - ``needeval``: if True, raise IntegralTransformError instead of
                        returning IntegralTransform objects

        The default values of these hints depend on the concrete transform,
        usually the default is
        ``(simplify, noconds, needeval) = (True, False, False)``.
        ÚneedevalFÚsimplifyTNc                    s2   g | ]*}ˆj |gtˆjd d… ƒ Ž jf ˆ Ž‘qS )rL   N)r@   ÚlistrJ   Údoit©rc   rW   ©rY   r=   rA   rB   Ú
<listcomp>¨   s   ÿz*IntegralTransform.doit.<locals>.<listcomp>r   rN   rL   )Úpoprk   rh   rJ   Ú
isinstanceÚtupleÚappendÚlenr   rm   ra   r7   r9   r@   Ú_namer<   Úas_coeff_mulrM   r   rn   )r=   rY   rl   rm   rj   ri   Úresr_   ÚressrW   ÚcoeffÚrestrA   rq   rB   ro   ˆ   sR    ÿ


  ÿzIntegralTransform.doitc                 C   s   |   | j| j| j¡S rR   )r\   r<   rM   rO   rK   rA   rA   rB   Úas_integralÏ   s    ÿzIntegralTransform.as_integralc                 O   s   | j S rR   )r~   )r=   rJ   ÚkwargsrA   rA   rB   Ú_eval_rewrite_as_IntegralÔ   s    z+IntegralTransform._eval_rewrite_as_IntegralN)rC   rD   rE   rF   Úpropertyr<   rM   rO   rP   rZ   r\   ra   rk   ro   r~   r€   rA   rA   rA   rB   rH   <   s"   



G
rH   c                 C   s4   |r0ddl m} ddlm} ||t| ƒdd�ƒS | S )Nr   )rm   )Ú	powdenestT)Zpolar)Úsympy.simplifyrm   Zsympy.simplify.powsimpr‚   r"   )Úexprro   rm   r‚   rA   rA   rB   Ú	_simplifyØ   s
    r…   c                    s   ‡ fdd„}|S )aV  
    This is a decorator generator for dropping convergence conditions.

    Explanation
    ===========

    Suppose you define a function ``transform(*args)`` which returns a tuple of
    the form ``(result, cond1, cond2, ...)``.

    Decorating it ``@_noconds_(default)`` will add a new keyword argument
    ``noconds`` to it. If ``noconds=True``, the return value will be altered to
    be only ``result``, whereas if ``noconds=False`` the return value will not
    be altered.

    The default value of the ``noconds`` keyword will be ``default`` (i.e. the
    argument of this function).
    c                    s   t ˆ ƒˆdœ‡ fdd„
ƒ}|S )N©Únocondsc                    s   ˆ ||Ž}| r|d S |S ©Nr   rA   )r‡   rJ   r   rz   ©rd   rA   rB   Úwrapperó   s    
z0_noconds_.<locals>.make_wrapper.<locals>.wrapper)r   )rd   rŠ   ©Údefaultr‰   rB   Úmake_wrapperò   s    z_noconds_.<locals>.make_wrapperrA   )rŒ   r�   rA   r‹   rB   Ú	_noconds_à   s    rŽ   Fc                 C   s   t | |tjtjfƒS rR   )r+   r   ÚZeroÚInfinity)rV   rW   rA   rA   rB   Ú_default_integrator  s    r‘   Tc                    sþ   t dd| ƒ‰||ˆd  |  |ƒ}| t¡sNt| ˆ|¡|ƒtjtjftjfS |j	s`t
d| dƒ‚|jd \}}| t¡r„t
d| dƒ‚‡fdd	„‰ ‡ fd
d„t|ƒD ƒ}dd„ |D ƒ}|jdd„ d� |sÔt
d| dƒ‚|d \}}	}
t| ˆ|¡|ƒ||	f|
fS )z0 Backend function to compute Mellin transforms. rX   zmellin-transformrL   ÚMellinúcould not compute integralr   úintegral in unexpected formc                    sR  ddl m} tj}tj}tj}tt| ƒƒ}tddd�}|D �]
}tj}tj}	g }
t	|ƒD ]š}| 
tdd„ ¡ tˆ ƒ|¡}|jrœ|jdksœ| ˆ ¡sœ| |¡s¨|
|g7 }
qX|||ƒ}|jrÂ|jdkrÎ|
|g7 }
qX|j|kræt|j|	ƒ}	qXt|j|ƒ}qX|tjk	�r||k�rt||ƒ}q:|	tjk	�r8|	|k�r8t|	|ƒ}q:t|t|
Ž ƒ}q:|||fS )	zN
        Turn ``cond`` into a strip (a, b), and auxiliary conditions.
        r   )Ú_solve_inequalityÚtT)Úrealc                 S   s   |   ¡ d S rˆ   )Úas_real_imag©rW   rA   rA   rB   Ú<lambda>)  ó    z:_mellin_transform.<locals>.process_conds.<locals>.<lambda>)z==z!=)Zsympy.solvers.inequalitiesr•   r   ÚNegativeInfinityr�   Útruer/   r.   r   r0   Úreplacer   ÚsubsZis_RelationalZrel_oprb   Zltsr   Zgtsr    r2   r1   )r`   r•   ÚaÚbÚauxÚcondsr–   ÚcÚa_Úb_Zaux_ÚdZd_Zsoln)rX   rA   rB   Úprocess_conds  sT    
 ÿ ÿÿþþ

ÿ

z(_mellin_transform.<locals>.process_condsc                    s   g | ]}ˆ |ƒ‘qS rA   rA   ©rc   r¤   )r¨   rA   rB   rr   @  s     z%_mellin_transform.<locals>.<listcomp>c                 S   s   g | ]}|d  dkr|‘qS )rN   FrA   rp   rA   rA   rB   rr   A  s      c                 S   s   | d | d  t | d ƒfS )Nr   rL   rN   )r	   r™   rA   rA   rB   rš   B  r›   z#_mellin_transform.<locals>.<lambda>©Úkeyzno convergence found)r-   rb   r,   r…   rŸ   r   rœ   r�   r�   Úis_Piecewiser9   rJ   r0   Úsort)rV   rW   Zs_Z
integratorrm   ÚFr`   r£   r    r¡   r¢   rA   )r¨   rX   rB   Ú_mellin_transform  s*    
"
  ÿ'r¯   c                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚMellinTransformzâ
    Class representing unevaluated Mellin transforms.

    For usage of this class, see the :class:`IntegralTransform` docstring.

    For how to compute Mellin transforms, see the :func:`mellin_transform`
    docstring.
    r’   c                 K   s   t |||f|ŽS rR   )r¯   rU   rA   rA   rB   rZ   W  s    z"MellinTransform._compute_transformc                 C   s    t |||d   |tjtjfƒS ©NrL   )r,   r   r�   r�   r[   rA   rA   rB   r\   Z  s    zMellinTransform._as_integralc           	      C   sŒ   g }g }g }|D ]*\\}}}||g7 }||g7 }||g7 }qt |Ž t|Ž ft|Ž f}|d d |d d kdks||d dkrˆtdd dƒ‚|S )Nr   rL   TFr’   zno combined convergence.)r   r    r2   r9   )	r=   r_   r    r¡   r`   ÚsaÚsbr¤   rz   rA   rA   rB   ra   ]  s    

(  ÿzMellinTransform._collapse_extraN)rC   rD   rE   rF   rx   rZ   r\   ra   rA   rA   rA   rB   r°   K  s
   	r°   c                 K   s   t | ||ƒjf |ŽS )a  
    Compute the Mellin transform `F(s)` of `f(x)`,

    .. math :: F(s) = \int_0^\infty x^{s-1} f(x) \mathrm{d}x.

    For all "sensible" functions, this converges absolutely in a strip
      `a < \operatorname{Re}(s) < b`.

    Explanation
    ===========

    The Mellin transform is related via change of variables to the Fourier
    transform, and also to the (bilateral) Laplace transform.

    This function returns ``(F, (a, b), cond)``
    where ``F`` is the Mellin transform of ``f``, ``(a, b)`` is the fundamental strip
    (as above), and ``cond`` are auxiliary convergence conditions.

    If the integral cannot be computed in closed form, this function returns
    an unevaluated :class:`MellinTransform` object.

    For a description of possible hints, refer to the docstring of
    :func:`sympy.integrals.transforms.IntegralTransform.doit`. If ``noconds=False``,
    then only `F` will be returned (i.e. not ``cond``, and also not the strip
    ``(a, b)``).

    Examples
    ========

    >>> from sympy import mellin_transform, exp
    >>> from sympy.abc import x, s
    >>> mellin_transform(exp(-x), x, s)
    (gamma(s), (0, oo), True)

    See Also
    ========

    inverse_mellin_transform, laplace_transform, fourier_transform
    hankel_transform, inverse_hankel_transform
    )r°   ro   )rV   rW   rX   rY   rA   rA   rB   Úmellin_transforml  s    )r´   c                 C   sp   | \}}t |t ƒ}t |t ƒ}t| | | ¡ d  ƒ}t|| | | ƒtd| | ||  ƒd| t fS )aˆ  
    Re-write the sine function ``sin(m*s + n)`` as gamma functions, compatible
    with the strip (a, b).

    Return ``(gamma1, gamma2, fac)`` so that ``f == fac/(gamma1 * gamma2)``.

    Examples
    ========

    >>> from sympy.integrals.transforms import _rewrite_sin
    >>> from sympy import pi, S
    >>> from sympy.abc import s
    >>> _rewrite_sin((pi, 0), s, 0, 1)
    (gamma(s), gamma(1 - s), pi)
    >>> _rewrite_sin((pi, 0), s, 1, 0)
    (gamma(s - 1), gamma(2 - s), -pi)
    >>> _rewrite_sin((pi, 0), s, -1, 0)
    (gamma(s + 1), gamma(-s), -pi)
    >>> _rewrite_sin((pi, pi/2), s, S(1)/2, S(3)/2)
    (gamma(s - 1/2), gamma(3/2 - s), -pi)
    >>> _rewrite_sin((pi, pi), s, 0, 1)
    (gamma(s), gamma(1 - s), -pi)
    >>> _rewrite_sin((2*pi, 0), s, 0, S(1)/2)
    (gamma(2*s), gamma(1 - 2*s), pi)
    >>> _rewrite_sin((2*pi, 0), s, S(1)/2, 1)
    (gamma(2*s - 1), gamma(2 - 2*s), -pi)
    r   rL   éÿÿÿÿ)r   r   r   r˜   r)   )Zm_nrX   r    r¡   ÚmÚnÚrrA   rA   rB   Ú_rewrite_sin˜  s
    %r¹   c                   @   s   e Zd ZdZdS )ÚMellinTransformStripErrorzF
    Exception raised by _rewrite_gamma. Mainly for internal use.
    N)rC   rD   rE   rF   rA   rA   rA   rB   rº   Å  s   rº   c           -         sØ  t ||gƒ\‰ ‰‡ ‡fdd„}g }ˆ t¡D ]F}| ˆ¡s<q,|jd }|jrZ| ˆ¡d }| ˆ¡\}}	||g7 }q,ˆ tt	t
t¡D ]J}| ˆ¡s”q„|jd }|jr²| ˆ¡d }| ˆ¡\}}	||t g7 }q„dd„ |D ƒ}t j‰|D ]}
|
jsè|
‰ qüqè‡fdd„|D ƒ}tdd	„ |D ƒƒ�r*ˆj�s6td
ddƒ‚ˆttdd„ |D ƒt jƒ }|ˆk�rˆt|ƒdk�rpˆ}nˆttdd„ |D ƒƒ }ˆ ˆˆ| ¡‰t j| }t j| }ˆ dk	�r¾ˆ |9 ‰ ˆdk	�rÐˆ|9 ‰ˆ ¡ \}}t |¡}t |¡}tt|tdƒƒƒtt|tdƒƒƒ }g }g }g }g }g }‡fdd„‰|�r"| ¡ \‰‰ˆ�r\|| }}|}n|| }}|}‡‡‡fdd„}ˆ ˆ¡�s”|ˆg7 }�q4ˆj�s¨tˆt ƒ�rTˆj�r¾ˆj!}ˆj }nt"dƒ}ˆj }|j#�rˆ}|dk �rè| }|||fgt$|ƒ 7 }�q4nL| ˆ¡�sH||ƒ\}}ˆ�s*d| }||| g7 }||| g7 }nˆˆƒ‚�q4ˆ %ˆ¡�rXt&ˆˆƒ}| '¡ dk�rÐ| (¡ d }t)|ˆƒ}t|ƒ| '¡ k�rªt* +|¡}||g7 }|‡‡fdd„|D ƒ7 }�q4| ,¡ \}}||g7 }||  }||ˆƒ�r&|t j| d fg7 }|t j| fg7 }n.|dg7 }|t j-|d fg7 }|t j-|fg7 }�q4tˆtƒ�rÖ|ˆjd ƒ\}}ˆ�rÄ|dk�rœ|| | ˆƒdk�s¼|dk �rÄ|| | ˆƒdk�rÄt.dƒ‚|||fg7 }�q4tˆtƒ�rTˆjd }ˆ�rt|t ƒtd|t  ƒt  } }!}"nt/||ƒˆˆ ˆƒ\} }!}"|| ˆ f|!ˆ fg7 }||"g7 }nÊtˆt
ƒ�ršˆjd }|t|dd�ˆfttd | dd�ˆ fg7 }n„tˆt	ƒ�rÐˆjd }|ttd | dd�ˆfg7 }nNtˆtƒ�rˆjd }|ttd | dd�ˆft|dd�ˆ fg7 }nˆˆƒ‚�q4|t|Ž t|Ž  9 }g g g g f\}#}$}%}&||#|%df||&|$dffD �]$\}'}(})‰|'�rb|' ¡ \}}|dk�r^|dk�r^t$t |ƒƒ}|| }*|| }+|j#�sÂt0dƒ‚t1|ƒD ]},|'|*|+|,|  fg7 }'�qÊˆ�r$|dt d| d  ||t j2   9 }||| g7 }n6|dt d| d  ||t j2    }|||  g7 }�qp|dk�rx|( 3d| ¡ n
|) 3|¡ �qp�qbt|Ž }|#j4t5d� |$j4t5d� |%j4t5d� |&j4t5d� |#|$f|%|&f|||fS )aØ  
    Try to rewrite the product f(s) as a product of gamma functions,
    so that the inverse Mellin transform of f can be expressed as a meijer
    G function.

    Explanation
    ===========

    Return (an, ap), (bm, bq), arg, exp, fac such that
    G((an, ap), (bm, bq), arg/z**exp)*fac is the inverse Mellin transform of f(s).

    Raises IntegralTransformError or MellinTransformStripError on failure.

    It is asserted that f has no poles in the fundamental strip designated by
    (a, b). One of a and b is allowed to be None. The fundamental strip is
    important, because it determines the inversion contour.

    This function can handle exponentials, linear factors, trigonometric
    functions.

    This is a helper function for inverse_mellin_transform that will not
    attempt any transformations on f.

    Examples
    ========

    >>> from sympy.integrals.transforms import _rewrite_gamma
    >>> from sympy.abc import s
    >>> from sympy import oo
    >>> _rewrite_gamma(s*(s+3)*(s-1), s, -oo, oo)
    (([], [-3, 0, 1]), ([-2, 1, 2], []), 1, 1, -1)
    >>> _rewrite_gamma((s-1)**2, s, -oo, oo)
    (([], [1, 1]), ([2, 2], []), 1, 1, 1)

    Importance of the fundamental strip:

    >>> _rewrite_gamma(1/s, s, 0, oo)
    (([1], []), ([], [0]), 1, 1, 1)
    >>> _rewrite_gamma(1/s, s, None, oo)
    (([1], []), ([], [0]), 1, 1, 1)
    >>> _rewrite_gamma(1/s, s, 0, None)
    (([1], []), ([], [0]), 1, 1, 1)
    >>> _rewrite_gamma(1/s, s, -oo, 0)
    (([], [1]), ([0], []), 1, 1, -1)
    >>> _rewrite_gamma(1/s, s, None, 0)
    (([], [1]), ([0], []), 1, 1, -1)
    >>> _rewrite_gamma(1/s, s, -oo, None)
    (([], [1]), ([0], []), 1, 1, -1)

    >>> _rewrite_gamma(2**(-s+3), s, -oo, oo)
    (([], []), ([], []), 1/2, 1, 8)
    c                    sŒ   t t| ƒƒ} ˆ dkr"ˆtjkr"dS ˆ dkr2| ˆk S ˆdkrB| ˆ kS | ˆkdkrRdS | ˆ kdkrbdS |rjdS ˆ js|ˆjs|| jr€dS tdƒ‚dS )zU
        Decide whether pole at c lies to the left of the fundamental strip.
        NTFzPole inside critical strip?)r
   r   r   r�   rP   rº   )r¤   Úis_numer)r¥   r¦   rA   rB   Úleft  s     z_rewrite_gamma.<locals>.leftr   rL   c                 S   s   g | ]}|j rt|ƒn|‘qS rA   )Úis_extended_realr   rp   rA   rA   rB   rr   8  s     z"_rewrite_gamma.<locals>.<listcomp>c                    s   g | ]}|ˆ  ‘qS rA   rA   rp   )Úcommon_coefficientrA   rB   rr   >  s     c                 s   s   | ]}|j V  qd S rR   )Úis_Rationalrp   rA   rA   rB   re   ?  s     z!_rewrite_gamma.<locals>.<genexpr>ÚGammaNzNonrational multiplierc                 S   s   g | ]}t |jƒ‘qS rA   )r   Úqrp   rA   rA   rB   rr   B  s   ÿc                 S   s   g | ]}t |jƒ‘qS rA   )r   Úprp   rA   rA   rB   rr   I  s     TFc                    s   t dˆ d|  ƒS )NúInverse MellinzUnrecognised form '%s'.)r9   )Úfact)rV   rA   rB   Ú	exceptiona  s    z!_rewrite_gamma.<locals>.exceptionc                    s8   |   ˆ¡sˆ ˆƒ‚t| ˆƒ}| ¡ dkr0ˆ ˆƒ‚| ¡ S )z7 Test if arg is of form a*s+b, raise exception if not. rL   )Úis_polynomialr5   ÚdegreeÚ
all_coeffs)r   rÂ   )rÅ   rÄ   rX   rA   rB   Ú
linear_argl  s    

z"_rewrite_gamma.<locals>.linear_argc                    s   g | ]}ˆ| ˆ f‘qS rA   rA   r©   )r»   rX   rA   rB   rr   š  s     rµ   z Gammas partially over the strip.)ÚevaluaterN   za is not an integerrª   )6r   rg   r)   rb   rJ   rh   Zas_independentry   r%   r#   r&   r$   r   ÚOner¿   Úallr½   r9   r   r   rw   r   rŸ   Zas_numer_denomr   Z	make_argsrn   Úzipr   rs   Zis_Powrt   r   Úbaser   Z
is_Integerr   rÆ   r5   rÇ   ÚLTr3   r6   Z	all_rootsrÈ   ZNegativeOnerT   r¹   Ú	TypeErrorÚrangeZHalfrv   r­   r   )-rV   rX   r    r¡   r¼   Zs_multipliersÚgr   r|   Ú_rW   Zs_multiplierÚfacÚexponentZnumerÚdenomrJ   ZfacsZdfacsZnumer_gammasZdenom_gammasZexponentialsZugammasZlgammasZufacsrÉ   rÎ   Zexp_r`   rÂ   Úrsr¤   Zgamma1Zgamma2Zfac_ZanÚapZbmÚbqZgammasÚplusÚminusZnewaZnewcÚkrA   )r¥   r¦   r¾   rÅ   rV   rÄ   r»   rX   rB   Ú_rewrite_gammaÌ  sR   ?



ÿÿÿ
ÿ





$










 ÿÿÿ
&
ÿ
 
ÿ

ÿ&&
rÝ   c              	      sb  t dd| dd�‰|  t¡} t| ƒt| ƒt| ƒfD �]}|jr¨‡ ‡‡‡fdd„|jD ƒ}dd„ |D ƒ}dd„ |D ƒ}t|Ž }ˆ s�t|| 	t
¡d	�}| ˆ|¡t|Ž f  S z$t|ˆˆd
 ˆd ƒ\}	}
}}}W n tk
rä   Y q0Y nX zt|	|
|ˆ|  ƒ}W n tk
�r   Y q0Y nX ˆ �r&|}n”zd
dlm} ||ƒ}W n" tk
�r`   td| dƒ‚Y nX |j�rºt|jƒdk�rºt
ˆt|ƒ ƒ|jd
 jd
  t
t|ƒˆ ƒ|jd jd
   }tt|jƒƒ|jt k g}|ttt|jƒt|jƒkd
t|jƒd kƒtt|jƒƒ|jt kƒg7 }t|Ž }|dk�r:td| dƒ‚||  ˆ|¡|f  S td| dƒ‚dS )zs A helper for the real inverse_mellin_transform function, this one here
        assumes x to be real and positive. r–   zinverse-mellin-transformT)Zpositivec              
      s    g | ]}t |ˆˆˆˆ d d�‘qS )Fr†   )Ú_inverse_mellin_transform)rc   ÚG©Ú
as_meijergrX   ÚstriprW   rA   rB   rr     s   þÿz-_inverse_mellin_transform.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS )rL   rA   ©rc   rÂ   rA   rA   rB   rr     s     c                 S   s   g | ]}|d  ‘qS )r   rA   rã   rA   rA   rB   rr     s     )Zgensr   rL   )ÚhyperexpandrÃ   zCould not calculate integralé   Fzdoes not converger]   N) r-   Zrewriter)   r4   r   r
   rh   rJ   r   rg   r(   rŸ   r2   rÝ   r9   r*   Ú
ValueErrorrƒ   rä   rT   r¬   rw   r   r   ÚargumentÚdeltar   r1   rØ   rÙ   r   Únu)r®   rX   Zx_râ   rá   rÒ   r{   r£   rz   r    r¡   ÚCÚerÔ   rß   Úhrä   r`   rA   rà   rB   rÞ   ÷  sb    
þ$

  ÿ
ÿ*ÿ
  ÿrÞ   Nc                   @   sH   e Zd ZdZdZedƒZedƒZdd„ Ze	dd„ ƒZ
d	d
„ Zdd„ ZdS )ÚInverseMellinTransformzú
    Class representing unevaluated inverse Mellin transforms.

    For usage of this class, see the :class:`IntegralTransform` docstring.

    For how to compute inverse Mellin transforms, see the
    :func:`inverse_mellin_transform` docstring.
    rÃ   ÚNoner¤   c                 K   s4   |d krt j}|d krt j}tj| |||||f|ŽS rR   )rí   Ú_none_sentinelrH   Ú__new__)Úclsr®   rX   rW   r    r¡   ÚoptsrA   rA   rB   rð   C  s
    zInverseMellinTransform.__new__c                 C   s:   | j d | j d  }}|tjkr$d }|tjkr2d }||fS )Nrå   é   )rJ   rí   rï   )r=   r    r¡   rA   rA   rB   Úfundamental_stripJ  s    

z(InverseMellinTransform.fundamental_stripc                 K   s€   |  dd¡ td kr0tttttttt	t
ttthat|ƒD ].}|jr8| |¡r8|jtkr8td|d| ƒ‚q8| j}t||||f|ŽS )Nrm   TrÃ   zComponent %s not recognised.)rs   Ú_allowedr   r)   r%   r#   r&   r$   r   r   r   r   r   r   r   Zis_Functionrb   rd   r9   rô   rÞ   )r=   r®   rX   rW   rY   rV   râ   rA   rA   rB   rZ   S  s,              þÿz)InverseMellinTransform._compute_transformc                 C   sJ   | j j}t|||   ||tjtj  |tjtj  fƒdtj tj  S ©NrN   )r@   Ú_cr,   r   ÚImaginaryUnitr�   ÚPi)r=   r®   rX   rW   r¤   rA   rA   rB   r\   c  s     
ÿÿz#InverseMellinTransform._as_integralN)rC   rD   rE   rF   rx   r   rï   r÷   rð   r�   rô   rZ   r\   rA   rA   rA   rB   rí   5  s   	
rí   c                 K   s    t | |||d |d ƒjf |ŽS )a"  
    Compute the inverse Mellin transform of `F(s)` over the fundamental
    strip given by ``strip=(a, b)``.

    Explanation
    ===========

    This can be defined as

    .. math:: f(x) = \frac{1}{2\pi i} \int_{c - i\infty}^{c + i\infty} x^{-s} F(s) \mathrm{d}s,

    for any `c` in the fundamental strip. Under certain regularity
    conditions on `F` and/or `f`,
    this recovers `f` from its Mellin transform `F`
    (and vice versa), for positive real `x`.

    One of `a` or `b` may be passed as ``None``; a suitable `c` will be
    inferred.

    If the integral cannot be computed in closed form, this function returns
    an unevaluated :class:`InverseMellinTransform` object.

    Note that this function will assume x to be positive and real, regardless
    of the SymPy assumptions!

    For a description of possible hints, refer to the docstring of
    :func:`sympy.integrals.transforms.IntegralTransform.doit`.

    Examples
    ========

    >>> from sympy import inverse_mellin_transform, oo, gamma
    >>> from sympy.abc import x, s
    >>> inverse_mellin_transform(gamma(s), s, x, (0, oo))
    exp(-x)

    The fundamental strip matters:

    >>> f = 1/(s**2 - 1)
    >>> inverse_mellin_transform(f, s, x, (-oo, -1))
    x*(1 - 1/x**2)*Heaviside(x - 1)/2
    >>> inverse_mellin_transform(f, s, x, (-1, 1))
    -x*Heaviside(1 - x)/2 - Heaviside(x - 1)/(2*x)
    >>> inverse_mellin_transform(f, s, x, (1, oo))
    (1/2 - x**2/2)*Heaviside(1 - x)/x

    See Also
    ========

    mellin_transform
    hankel_transform, inverse_hankel_transform
    r   rL   )rí   ro   )r®   rX   rW   râ   rY   rA   rA   rB   Úinverse_mellin_transformi  s    5rú   c           
      C   sÊ   t ||  t|tj | | ƒ |tjtjfƒ}| t¡sHt||ƒtj	fS t | |tjtjfƒ}|tjtjtj
fksz| t¡r†t|| dƒ‚|js˜t|| dƒ‚|jd \}}	| t¡r¼t|| dƒ‚t||ƒ|	fS )zñ
    Compute a general Fourier-type transform

    .. math::

        F(k) = a \int_{-\infty}^{\infty} e^{bixk} f(x)\, dx.

    For suitable choice of *a* and *b*, this reduces to the standard Fourier
    and inverse Fourier transforms.
    z$function not integrable on real axisr“   r   r”   )r+   r   r   rø   rœ   r�   rb   r,   r…   r�   ÚNaNr9   r¬   rJ   )
rV   rW   rÜ   r    r¡   r^   rm   r®   Z
integral_fr`   rA   rA   rB   Ú_fourier_transform¥  s    .

rü   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚFourierTypeTransformz# Base class for Fourier transforms.c                 C   s   t d| j ƒ‚d S ©Nz,Class %s must implement a(self) but does not©rT   r@   rK   rA   rA   rB   r    Ç  s    ÿzFourierTypeTransform.ac                 C   s   t d| j ƒ‚d S ©Nz,Class %s must implement b(self) but does notrÿ   rK   rA   rA   rB   r¡   Ë  s    ÿzFourierTypeTransform.bc                 K   s"   t ||||  ¡ |  ¡ | jjf|ŽS rR   )rü   r    r¡   r@   rx   ©r=   rV   rW   rÜ   rY   rA   rA   rB   rZ   Ï  s     þþz'FourierTypeTransform._compute_transformc                 C   s>   |   ¡ }|  ¡ }t|| t|tj | | ƒ |tjtjfƒS rR   )r    r¡   r,   r   r   rø   rœ   r�   )r=   rV   rW   rÜ   r    r¡   rA   rA   rB   r\   Ô  s    z!FourierTypeTransform._as_integralN©rC   rD   rE   rF   r    r¡   rZ   r\   rA   rA   rA   rB   rý   Ä  s
   rý   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚFourierTransformzå
    Class representing unevaluated Fourier transforms.

    For usage of this class, see the :class:`IntegralTransform` docstring.

    For how to compute Fourier transforms, see the :func:`fourier_transform`
    docstring.
    ZFourierc                 C   s   dS r±   rA   rK   rA   rA   rB   r    æ  s    zFourierTransform.ac                 C   s
   dt j S )Néþÿÿÿ©r   rù   rK   rA   rA   rB   r¡   é  s    zFourierTransform.bN©rC   rD   rE   rF   rx   r    r¡   rA   rA   rA   rB   r  Ú  s   	r  c                 K   s   t | ||ƒjf |ŽS )a’  
    Compute the unitary, ordinary-frequency Fourier transform of ``f``, defined
    as

    .. math:: F(k) = \int_{-\infty}^\infty f(x) e^{-2\pi i x k} \mathrm{d} x.

    Explanation
    ===========

    If the transform cannot be computed in closed form, this
    function returns an unevaluated :class:`FourierTransform` object.

    For other Fourier transform conventions, see the function
    :func:`sympy.integrals.transforms._fourier_transform`.

    For a description of possible hints, refer to the docstring of
    :func:`sympy.integrals.transforms.IntegralTransform.doit`.
    Note that for this transform, by default ``noconds=True``.

    Examples
    ========

    >>> from sympy import fourier_transform, exp
    >>> from sympy.abc import x, k
    >>> fourier_transform(exp(-x**2), x, k)
    sqrt(pi)*exp(-pi**2*k**2)
    >>> fourier_transform(exp(-x**2), x, k, noconds=False)
    (sqrt(pi)*exp(-pi**2*k**2), True)

    See Also
    ========

    inverse_fourier_transform
    sine_transform, inverse_sine_transform
    cosine_transform, inverse_cosine_transform
    hankel_transform, inverse_hankel_transform
    mellin_transform, laplace_transform
    )r  ro   ©rV   rW   rÜ   rY   rA   rA   rB   Úfourier_transformí  s    'r  c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚInverseFourierTransformzý
    Class representing unevaluated inverse Fourier transforms.

    For usage of this class, see the :class:`IntegralTransform` docstring.

    For how to compute inverse Fourier transforms, see the
    :func:`inverse_fourier_transform` docstring.
    zInverse Fourierc                 C   s   dS r±   rA   rK   rA   rA   rB   r    #  s    zInverseFourierTransform.ac                 C   s
   dt j S rö   r  rK   rA   rA   rB   r¡   &  s    zInverseFourierTransform.bNr  rA   rA   rA   rB   r	    s   	r	  c                 K   s   t | ||ƒjf |ŽS )a¶  
    Compute the unitary, ordinary-frequency inverse Fourier transform of `F`,
    defined as

    .. math:: f(x) = \int_{-\infty}^\infty F(k) e^{2\pi i x k} \mathrm{d} k.

    Explanation
    ===========

    If the transform cannot be computed in closed form, this
    function returns an unevaluated :class:`InverseFourierTransform` object.

    For other Fourier transform conventions, see the function
    :func:`sympy.integrals.transforms._fourier_transform`.

    For a description of possible hints, refer to the docstring of
    :func:`sympy.integrals.transforms.IntegralTransform.doit`.
    Note that for this transform, by default ``noconds=True``.

    Examples
    ========

    >>> from sympy import inverse_fourier_transform, exp, sqrt, pi
    >>> from sympy.abc import x, k
    >>> inverse_fourier_transform(sqrt(pi)*exp(-(pi*k)**2), k, x)
    exp(-x**2)
    >>> inverse_fourier_transform(sqrt(pi)*exp(-(pi*k)**2), k, x, noconds=False)
    (exp(-x**2), True)

    See Also
    ========

    fourier_transform
    sine_transform, inverse_sine_transform
    cosine_transform, inverse_cosine_transform
    hankel_transform, inverse_hankel_transform
    mellin_transform, laplace_transform
    )r	  ro   ©r®   rÜ   rW   rY   rA   rA   rB   Úinverse_fourier_transform*  s    'r  c           
      C   s†   t ||  ||| | ƒ |tjtjfƒ}| t¡sBt||ƒtjfS |jsTt	|| dƒ‚|j
d \}}	| t¡rxt	|| dƒ‚t||ƒ|	fS )a  
    Compute a general sine or cosine-type transform
        F(k) = a int_0^oo b*sin(x*k) f(x) dx.
        F(k) = a int_0^oo b*cos(x*k) f(x) dx.

    For suitable choice of a and b, this reduces to the standard sine/cosine
    and inverse sine/cosine transforms.
    r“   r   r”   )r+   r   r�   r�   rb   r,   r…   r�   r¬   r9   rJ   )
rV   rW   rÜ   r    r¡   ÚKr^   rm   r®   r`   rA   rA   rB   Ú_sine_cosine_transformX  s    
(

r  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚSineCosineTypeTransformzK
    Base class for sine and cosine transforms.
    Specify cls._kern.
    c                 C   s   t d| j ƒ‚d S rþ   rÿ   rK   rA   rA   rB   r    w  s    ÿzSineCosineTypeTransform.ac                 C   s   t d| j ƒ‚d S r   rÿ   rK   rA   rA   rB   r¡   {  s    ÿzSineCosineTypeTransform.bc                 K   s(   t ||||  ¡ |  ¡ | jj| jjf|ŽS rR   )r  r    r¡   r@   Ú_kernrx   r  rA   rA   rB   rZ   €  s     ýýz*SineCosineTypeTransform._compute_transformc                 C   s@   |   ¡ }|  ¡ }| jj}t|| ||| | ƒ |tjtjfƒS rR   )r    r¡   r@   r  r,   r   r�   r�   )r=   rV   rW   rÜ   r    r¡   r  rA   rA   rB   r\   †  s    z$SineCosineTypeTransform._as_integralNr  rA   rA   rA   rB   r  q  s
   r  c                   @   s(   e Zd ZdZdZeZdd„ Zdd„ ZdS )ÚSineTransformzÜ
    Class representing unevaluated sine transforms.

    For usage of this class, see the :class:`IntegralTransform` docstring.

    For how to compute sine transforms, see the :func:`sine_transform`
    docstring.
    ZSinec                 C   s   t dƒt tƒ S rö   ©r!   r   rK   rA   rA   rB   r    š  s    zSineTransform.ac                 C   s   t jS rR   ©r   rË   rK   rA   rA   rB   r¡   �  s    zSineTransform.bN©	rC   rD   rE   rF   rx   r%   r  r    r¡   rA   rA   rA   rB   r  �  s
   	r  c                 K   s   t | ||ƒjf |ŽS )a1  
    Compute the unitary, ordinary-frequency sine transform of `f`, defined
    as

    .. math:: F(k) = \sqrt{\frac{2}{\pi}} \int_{0}^\infty f(x) \sin(2\pi x k) \mathrm{d} x.

    Explanation
    ===========

    If the transform cannot be computed in closed form, this
    function returns an unevaluated :class:`SineTransform` object.

    For a description of possible hints, refer to the docstring of
    :func:`sympy.integrals.transforms.IntegralTransform.doit`.
    Note that for this transform, by default ``noconds=True``.

    Examples
    ========

    >>> from sympy import sine_transform, exp
    >>> from sympy.abc import x, k, a
    >>> sine_transform(x*exp(-a*x**2), x, k)
    sqrt(2)*k*exp(-k**2/(4*a))/(4*a**(3/2))
    >>> sine_transform(x**(-a), x, k)
    2**(1/2 - a)*k**(a - 1)*gamma(1 - a/2)/gamma(a/2 + 1/2)

    See Also
    ========

    fourier_transform, inverse_fourier_transform
    inverse_sine_transform
    cosine_transform, inverse_cosine_transform
    hankel_transform, inverse_hankel_transform
    mellin_transform, laplace_transform
    )r  ro   r  rA   rA   rB   Úsine_transform¡  s    $r  c                   @   s(   e Zd ZdZdZeZdd„ Zdd„ ZdS )ÚInverseSineTransformzô
    Class representing unevaluated inverse sine transforms.

    For usage of this class, see the :class:`IntegralTransform` docstring.

    For how to compute inverse sine transforms, see the
    :func:`inverse_sine_transform` docstring.
    zInverse Sinec                 C   s   t dƒt tƒ S rö   r  rK   rA   rA   rB   r    Õ  s    zInverseSineTransform.ac                 C   s   t jS rR   r  rK   rA   rA   rB   r¡   Ø  s    zInverseSineTransform.bNr  rA   rA   rA   rB   r  È  s
   	r  c                 K   s   t | ||ƒjf |ŽS )am  
    Compute the unitary, ordinary-frequency inverse sine transform of `F`,
    defined as

    .. math:: f(x) = \sqrt{\frac{2}{\pi}} \int_{0}^\infty F(k) \sin(2\pi x k) \mathrm{d} k.

    Explanation
    ===========

    If the transform cannot be computed in closed form, this
    function returns an unevaluated :class:`InverseSineTransform` object.

    For a description of possible hints, refer to the docstring of
    :func:`sympy.integrals.transforms.IntegralTransform.doit`.
    Note that for this transform, by default ``noconds=True``.

    Examples
    ========

    >>> from sympy import inverse_sine_transform, exp, sqrt, gamma
    >>> from sympy.abc import x, k, a
    >>> inverse_sine_transform(2**((1-2*a)/2)*k**(a - 1)*
    ...     gamma(-a/2 + 1)/gamma((a+1)/2), k, x)
    x**(-a)
    >>> inverse_sine_transform(sqrt(2)*k*exp(-k**2/(4*a))/(4*sqrt(a)**3), k, x)
    x*exp(-a*x**2)

    See Also
    ========

    fourier_transform, inverse_fourier_transform
    sine_transform
    cosine_transform, inverse_cosine_transform
    hankel_transform, inverse_hankel_transform
    mellin_transform, laplace_transform
    )r  ro   r
  rA   rA   rB   Úinverse_sine_transformÜ  s    %r  c                   @   s(   e Zd ZdZdZeZdd„ Zdd„ ZdS )ÚCosineTransformzâ
    Class representing unevaluated cosine transforms.

    For usage of this class, see the :class:`IntegralTransform` docstring.

    For how to compute cosine transforms, see the :func:`cosine_transform`
    docstring.
    ZCosinec                 C   s   t dƒt tƒ S rö   r  rK   rA   rA   rB   r      s    zCosineTransform.ac                 C   s   t jS rR   r  rK   rA   rA   rB   r¡     s    zCosineTransform.bN©	rC   rD   rE   rF   rx   r#   r  r    r¡   rA   rA   rA   rB   r    s
   	r  c                 K   s   t | ||ƒjf |ŽS )a:  
    Compute the unitary, ordinary-frequency cosine transform of `f`, defined
    as

    .. math:: F(k) = \sqrt{\frac{2}{\pi}} \int_{0}^\infty f(x) \cos(2\pi x k) \mathrm{d} x.

    Explanation
    ===========

    If the transform cannot be computed in closed form, this
    function returns an unevaluated :class:`CosineTransform` object.

    For a description of possible hints, refer to the docstring of
    :func:`sympy.integrals.transforms.IntegralTransform.doit`.
    Note that for this transform, by default ``noconds=True``.

    Examples
    ========

    >>> from sympy import cosine_transform, exp, sqrt, cos
    >>> from sympy.abc import x, k, a
    >>> cosine_transform(exp(-a*x), x, k)
    sqrt(2)*a/(sqrt(pi)*(a**2 + k**2))
    >>> cosine_transform(exp(-a*sqrt(x))*cos(a*sqrt(x)), x, k)
    a*exp(-a**2/(2*k))/(2*k**(3/2))

    See Also
    ========

    fourier_transform, inverse_fourier_transform,
    sine_transform, inverse_sine_transform
    inverse_cosine_transform
    hankel_transform, inverse_hankel_transform
    mellin_transform, laplace_transform
    )r  ro   r  rA   rA   rB   Úcosine_transform  s    $r  c                   @   s(   e Zd ZdZdZeZdd„ Zdd„ ZdS )ÚInverseCosineTransformzú
    Class representing unevaluated inverse cosine transforms.

    For usage of this class, see the :class:`IntegralTransform` docstring.

    For how to compute inverse cosine transforms, see the
    :func:`inverse_cosine_transform` docstring.
    zInverse Cosinec                 C   s   t dƒt tƒ S rö   r  rK   rA   rA   rB   r    L  s    zInverseCosineTransform.ac                 C   s   t jS rR   r  rK   rA   rA   rB   r¡   O  s    zInverseCosineTransform.bNr  rA   rA   rA   rB   r  ?  s
   	r  c                 K   s   t | ||ƒjf |ŽS )a(  
    Compute the unitary, ordinary-frequency inverse cosine transform of `F`,
    defined as

    .. math:: f(x) = \sqrt{\frac{2}{\pi}} \int_{0}^\infty F(k) \cos(2\pi x k) \mathrm{d} k.

    Explanation
    ===========

    If the transform cannot be computed in closed form, this
    function returns an unevaluated :class:`InverseCosineTransform` object.

    For a description of possible hints, refer to the docstring of
    :func:`sympy.integrals.transforms.IntegralTransform.doit`.
    Note that for this transform, by default ``noconds=True``.

    Examples
    ========

    >>> from sympy import inverse_cosine_transform, sqrt, pi
    >>> from sympy.abc import x, k, a
    >>> inverse_cosine_transform(sqrt(2)*a/(sqrt(pi)*(a**2 + k**2)), k, x)
    exp(-a*x)
    >>> inverse_cosine_transform(1/sqrt(k), k, x)
    1/sqrt(x)

    See Also
    ========

    fourier_transform, inverse_fourier_transform,
    sine_transform, inverse_sine_transform
    cosine_transform
    hankel_transform, inverse_hankel_transform
    mellin_transform, laplace_transform
    )r  ro   r
  rA   rA   rB   Úinverse_cosine_transformS  s    $r  c                 C   s„   t | t||| ƒ | |tjtjfƒ}| t¡s@t||ƒtjfS |j	sRt
|| dƒ‚|jd \}}| t¡rvt
|| dƒ‚t||ƒ|fS )zv
    Compute a general Hankel transform

    .. math:: F_\nu(k) = \int_{0}^\infty f(r) J_\nu(k r) r \mathrm{d} r.
    r“   r   r”   )r+   r'   r   r�   r�   rb   r,   r…   r�   r¬   r9   rJ   )rV   r¸   rÜ   ré   r^   rm   r®   r`   rA   rA   rB   Ú_hankel_transform~  s    &

r  c                   @   s4   e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZd
S )ÚHankelTypeTransformz+
    Base class for Hankel transforms.
    c                 K   s    | j | j| j| j| jd f|ŽS ©Nrå   )rZ   r<   rM   rO   rJ   )r=   rY   rA   rA   rB   ro   ™  s    ýüzHankelTypeTransform.doitc                 K   s   t ||||| jf|ŽS rR   )r  rx   )r=   rV   r¸   rÜ   ré   rY   rA   rA   rB   rZ      s    z&HankelTypeTransform._compute_transformc                 C   s&   t |t||| ƒ | |tjtjfƒS rR   )r,   r'   r   r�   r�   )r=   rV   r¸   rÜ   ré   rA   rA   rB   r\   £  s    z HankelTypeTransform._as_integralc                 C   s   |   | j| j| j| jd ¡S r  )r\   r<   rM   rO   rJ   rK   rA   rA   rB   r~   ¦  s
    ýzHankelTypeTransform.as_integralN)	rC   rD   rE   rF   ro   rZ   r\   r�   r~   rA   rA   rA   rB   r  ”  s   r  c                   @   s   e Zd ZdZdZdS )ÚHankelTransformzâ
    Class representing unevaluated Hankel transforms.

    For usage of this class, see the :class:`IntegralTransform` docstring.

    For how to compute Hankel transforms, see the :func:`hankel_transform`
    docstring.
    ZHankelN©rC   rD   rE   rF   rx   rA   rA   rA   rB   r  ®  s   	r  c                 K   s   t | |||ƒjf |ŽS )aÙ  
    Compute the Hankel transform of `f`, defined as

    .. math:: F_\nu(k) = \int_{0}^\infty f(r) J_\nu(k r) r \mathrm{d} r.

    Explanation
    ===========

    If the transform cannot be computed in closed form, this
    function returns an unevaluated :class:`HankelTransform` object.

    For a description of possible hints, refer to the docstring of
    :func:`sympy.integrals.transforms.IntegralTransform.doit`.
    Note that for this transform, by default ``noconds=True``.

    Examples
    ========

    >>> from sympy import hankel_transform, inverse_hankel_transform
    >>> from sympy import exp
    >>> from sympy.abc import r, k, m, nu, a

    >>> ht = hankel_transform(1/r**m, r, k, nu)
    >>> ht
    2*k**(m - 2)*gamma(-m/2 + nu/2 + 1)/(2**m*gamma(m/2 + nu/2))

    >>> inverse_hankel_transform(ht, k, r, nu)
    r**(-m)

    >>> ht = hankel_transform(exp(-a*r), r, k, 0)
    >>> ht
    a/(k**3*(a**2/k**2 + 1)**(3/2))

    >>> inverse_hankel_transform(ht, k, r, 0)
    exp(-a*r)

    See Also
    ========

    fourier_transform, inverse_fourier_transform
    sine_transform, inverse_sine_transform
    cosine_transform, inverse_cosine_transform
    inverse_hankel_transform
    mellin_transform, laplace_transform
    )r  ro   )rV   r¸   rÜ   ré   rY   rA   rA   rB   Úhankel_transform»  s    .r!  c                   @   s   e Zd ZdZdZdS )ÚInverseHankelTransformzú
    Class representing unevaluated inverse Hankel transforms.

    For usage of this class, see the :class:`IntegralTransform` docstring.

    For how to compute inverse Hankel transforms, see the
    :func:`inverse_hankel_transform` docstring.
    zInverse HankelNr   rA   rA   rA   rB   r"  ì  s   	r"  c                 K   s   t | |||ƒjf |ŽS )aß  
    Compute the inverse Hankel transform of `F` defined as

    .. math:: f(r) = \int_{0}^\infty F_\nu(k) J_\nu(k r) k \mathrm{d} k.

    Explanation
    ===========

    If the transform cannot be computed in closed form, this
    function returns an unevaluated :class:`InverseHankelTransform` object.

    For a description of possible hints, refer to the docstring of
    :func:`sympy.integrals.transforms.IntegralTransform.doit`.
    Note that for this transform, by default ``noconds=True``.

    Examples
    ========

    >>> from sympy import hankel_transform, inverse_hankel_transform
    >>> from sympy import exp
    >>> from sympy.abc import r, k, m, nu, a

    >>> ht = hankel_transform(1/r**m, r, k, nu)
    >>> ht
    2*k**(m - 2)*gamma(-m/2 + nu/2 + 1)/(2**m*gamma(m/2 + nu/2))

    >>> inverse_hankel_transform(ht, k, r, nu)
    r**(-m)

    >>> ht = hankel_transform(exp(-a*r), r, k, 0)
    >>> ht
    a/(k**3*(a**2/k**2 + 1)**(3/2))

    >>> inverse_hankel_transform(ht, k, r, 0)
    exp(-a*r)

    See Also
    ========

    fourier_transform, inverse_fourier_transform
    sine_transform, inverse_sine_transform
    cosine_transform, inverse_cosine_transform
    hankel_transform
    mellin_transform, laplace_transform
    )r"  ro   )r®   rÜ   r¸   ré   rY   rA   rA   rB   Úinverse_hankel_transformù  s    .r#  )F)T)T)T)ˆrF   Ú	functoolsr   r   Ú	itertoolsr   Z
sympy.corer   r   Zsympy.core.addr   Zsympy.core.functionr   r	   r
   r   r   Zsympy.core.mulr   Zsympy.core.intfuncr   r   Zsympy.core.sortingr   Zsympy.core.symbolr   Zsympy.core.traversalr   Z(sympy.functions.combinatorial.factorialsr   r   Z$sympy.functions.elementary.complexesr   r   r   Z&sympy.functions.elementary.exponentialr   r   Z%sympy.functions.elementary.hyperbolicr   r   r   r   Z#sympy.functions.elementary.integersr   Z(sympy.functions.elementary.miscellaneousr   r    r!   Z$sympy.functions.elementary.piecewiser"   Z(sympy.functions.elementary.trigonometricr#   r$   r%   r&   Zsympy.functions.special.besselr'   Z'sympy.functions.special.delta_functionsr(   Z'sympy.functions.special.gamma_functionsr)   Zsympy.functions.special.hyperr*   Zsympy.integralsr+   r,   Zsympy.integrals.meijerintr-   Zsympy.logic.boolalgr.   r/   r0   r1   r2   Zsympy.polys.polyrootsr3   Zsympy.polys.polytoolsr4   r5   Zsympy.polys.rootoftoolsr6   Zsympy.utilities.iterablesr7   Zsympy.utilities.miscr8   rT   r9   rH   r…   rŽ   Z_nocondsr‘   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#  Zsympy.integrals.laplaceZ	integralsZlaplaceZ_laplaceZLaplaceTransformZlaplace_transformZlaplace_correspondenceZlaplace_initial_condsZInverseLaplaceTransformZinverse_laplace_transformrA   rA   rA   rB   Ú<module>   s¦    D!,-  -:4<*.'('+16