B
    [                 @   s   d dl mZmZ d dlmZmZmZmZmZ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 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  d dl!m"Z" dddZ#dd Z$G dd deZ%dS )    )print_functiondivision)SSymbolAddsympifyExpr	PoleErrorMul)string_types)Dummy)	factorial)GoldenRatio)	fibonacci)gamma)Order   )gruntz)factor_terms)ratsimp)PolynomialErrorfactor)together+c             C   sp   |dkrVt | ||ddjdd}t | ||ddjdd}||krD|S td||f nt | |||jddS dS )	a~  
    Compute the limit of ``e(z)`` at the point ``z0``.

    ``z0`` can be any expression, including ``oo`` and ``-oo``.

    For ``dir="+-"`` it calculates the bi-directional limit; for
    ``dir="+"`` (default) it calculates the limit from the right
    (z->z0+) and for dir="-" the limit from the left (z->z0-).
    For infinite ``z0`` (``oo`` or ``-oo``), the ``dir`` argument is
    determined from the direction of the infinity (i.e.,
    ``dir="-"`` for ``oo``).

    Examples
    ========

    >>> from sympy import limit, sin, Symbol, oo
    >>> from sympy.abc import x
    >>> limit(sin(x)/x, x, 0)
    1
    >>> limit(1/x, x, 0) # default dir='+'
    oo
    >>> limit(1/x, x, 0, dir="-")
    -oo
    >>> limit(1/x, x, 0, dir='+-')
    Traceback (most recent call last):
        ...
    ValueError: The limit does not exist since left hand limit = -oo and right hand limit = oo

    >>> limit(1/x, x, oo)
    0

    Notes
    =====

    First we try some heuristics for easy and frequent cases like "x", "1/x",
    "x**2" and similar, so that it's fast. For all other cases, we use the
    Gruntz algorithm (see the gruntz() function).
    z+--)dirF)deepr   zMThe limit does not exist since left hand limit = %s and right hand limit = %sN)Limitdoit
ValueError)ezz0r   ZllimZrlim r#   2lib/python3.7/site-packages/sympy/series/limits.pylimit   s    (r%   c       
      C   s  d }t |tjkrNt| |d| |tj|tjkr6dnd}t|trJd S n:| jsh| j	sh| j
sh| jrg }x| jD ]}t||||}|tjr|jd krt| trt| }t|tst|}t|tst| }t|trt||||S d S d S t|trd S |tjkrd S || qtW |r| j| }|tjkryt| }	W n tk
r^   d S X |	tjksv|	| krzd S t|	|||S |S )Nr   r   r   )absr   Infinityr%   subsZero
isinstancer   is_MulZis_AddZis_PowZis_FunctionargshasZ	is_finiter   r   r
   r   r   
heuristicsNaNappendfuncr   r   )
r    r!   r"   r   rvralmZrat_er#   r#   r$   r.   G   sH    *





r.   c               @   s.   e Zd ZdZd
ddZedd Zdd Zd	S )r   a  Represents an unevaluated limit.

    Examples
    ========

    >>> from sympy import Limit, sin, Symbol
    >>> from sympy.abc import x
    >>> Limit(sin(x)/x, x, 0)
    Limit(sin(x)/x, x, 0)
    >>> Limit(1/x, x, 0, dir="-")
    Limit(1/x, x, 0, dir='-')

    r   c             C   s   t |}t |}t |}|tjkr(d}n|tjkr6d}t|trJt|}nt|tsdtdt| t	|dkr|t
d| t| }||||f|_|S )Nr   r   z6direction must be of type basestring or Symbol, not %s)r   r   z+-z1direction must be one of '+', '-' or '+-', not %s)r   r   r'   NegativeInfinityr*   r   r   	TypeErrortypestrr   r   __new__Z_args)clsr    r!   r"   r   objr#   r#   r$   r;   ~   s$    





zLimit.__new__c             C   s8   | j d }|j}|| j d j || j d j |S )Nr   r      )r,   free_symbolsdifference_updateupdate)selfr    Zisymsr#   r#   r$   r?      s
    
zLimit.free_symbolsc          	      s6  ddl m} ddlm} | j\}}}|tjkr8td|ddrh|j	f |}j	f ||j	f |}|krt|S |
s|S |jr|t|gt}|jrNt|tjkrNt|}|tt}fdd t fd	d
| D rNtdd}|tjkr|d| }n|d| }t|||tjd}	t|	trJ| S |	S |jrxt t|j!|f|jdd  S y$t"|||}	|	tj#krt$ W n t$t%fk
r   t&|||}	|	dkr| S Y n` tk
r0   |ddr&|tjkr&|dd}
|||
}	|	dkr,t nt Y nX |	S )zEvaluates limitr   )	limit_seq)RisingFactorialz.Limits at complex infinity are not implementedr   Tc                s&    | j ko$t fddt| D S )Nc             3   s4   | ],}|  p*t fd dt|D V  qdS )c             3   s"   | ]} |j ko| V  qd S )N)r?   is_polynomial).0r6   )r!   r#   r$   	<genexpr>   s   z9Limit.doit.<locals>.<lambda>.<locals>.<genexpr>.<genexpr>N)rE   anyr
   	make_args)rF   r4   )r!   r#   r$   rG      s   z/Limit.doit.<locals>.<lambda>.<locals>.<genexpr>)r?   rH   r   rI   )w)r!   r#   r$   <lambda>   s   
zLimit.doit.<locals>.<lambda>c             3   s   | ]} |V  qd S )Nr#   )rF   rJ   )okr#   r$   rG      s    zLimit.doit.<locals>.<genexpr>)Zpositiver   r   NZsequencetrials   )'Zsympy.series.limitseqrC   Zsympy.functionsrD   r,   r   ZComplexInfinityNotImplementedErrorgetr   r-   Zis_positiveZrewriter   r   r+   r&   r'   r   r   r   allZas_numer_denomr   r7   r(   r%   Zas_leading_termr)   r*   r   Zis_Orderr   exprr   r/   r	   r   r.   )rB   ZhintsrC   rD   r    r"   r   uZinver3   rN   r#   )rL   r!   r$   r      s^    


"


z
Limit.doitN)r   )__name__
__module____qualname____doc__r;   propertyr?   r   r#   r#   r#   r$   r   o   s   
	r   N)r   )&Z
__future__r   r   Z
sympy.corer   r   r   r   r   r	   r
   Zsympy.core.compatibilityr   Zsympy.core.symbolr   Z(sympy.functions.combinatorial.factorialsr   Zsympy.core.numbersr   Z%sympy.functions.combinatorial.numbersr   Z'sympy.functions.special.gamma_functionsr   Zsympy.series.orderr   r   Zsympy.core.exprtoolsr   Zsympy.simplify.ratsimpr   Zsympy.polysr   r   Zsympy.simplify.simplifyr   r%   r.   r   r#   r#   r#   r$   <module>   s    $
6(