o
    *ήcF                     @   s6  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 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mZmZ d d
lmZ d dlmZ d dlmZm Z  d dl!m"Z" G dd deZ#G dd de#Z$e"e$edd Z%G dd de#Z&e"e&edd Z%G dd deZ'e"e'edd Z%dS )    )Tuple)Basic)Expr)AddS)get_integer_partPrecisionExhausted)Function)fuzzy_or)Integer)GtLtGeLe
Relationalis_eq)Symbol)_sympify)imre)dispatchc                   @   sN   e Zd ZU dZee ed< edd Zedd Z	dd Z
d	d
 Zdd ZdS )RoundFunctionz+Abstract base class for rounding functions.argsc           
   	   C   s  |  |}|d ur|S |js|jdu r|S |jstj| jr5t|}|tjs/| |tj S | |ddS tj	 } }}t
|}|D ] }|jsP|jrUt|jrU||7 }qC|tr_||7 }qC||7 }qC|sj|sj|S |r|r|jrz|jstj| js|jr|jrzt|| ji dd\}	}|t|	t|tj  7 }tj	}W n ttfy   Y nw ||7 }|s|S |jstj| jr|| t|ddtj  S t|ttfr|| S || |dd S )NFevaluateT)return_ints)_eval_number
is_integer	is_finiteis_imaginaryr   ImaginaryUnitis_realr   hasZeror   	make_argsr   r   _dirr   r   NotImplementedError
isinstancefloorceiling)
clsargviipartnpartsparttermstr r4   J/tmp/pip-target-vg8gfxp4/lib/python/sympy/functions/elementary/integers.pyeval   sd   









zRoundFunction.evalc                 C   s   t  N)r&   r*   r+   r4   r4   r5   r   Q   s   zRoundFunction._eval_numberc                 C      | j d jS Nr   )r   r   selfr4   r4   r5   _eval_is_finiteU      zRoundFunction._eval_is_finitec                 C   r9   r:   r   r!   r;   r4   r4   r5   _eval_is_realX   r>   zRoundFunction._eval_is_realc                 C   r9   r:   r?   r;   r4   r4   r5   _eval_is_integer[   r>   zRoundFunction._eval_is_integerN)__name__
__module____qualname____doc__tTupler   __annotations__classmethodr6   r   r=   r@   rA   r4   r4   r4   r5   r      s   
 
5
r   c                   @   t   e Zd ZdZdZedd ZdddZdd	d
Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )r(   a  
    Floor is a univariate function which returns the largest integer
    value not greater than its argument. This implementation
    generalizes floor to complex numbers by taking the floor of the
    real and imaginary parts separately.

    Examples
    ========

    >>> from sympy import floor, E, I, S, Float, Rational
    >>> floor(17)
    17
    >>> floor(Rational(23, 10))
    2
    >>> floor(2*E)
    5
    >>> floor(-Float(0.567))
    -1
    >>> floor(-I/2)
    -I
    >>> floor(S(5)/2 + 5*I/2)
    2 + 2*I

    See Also
    ========

    sympy.functions.elementary.integers.ceiling

    References
    ==========

    .. [1] "Concrete mathematics" by Graham, pp. 87
    .. [2] http://mathworld.wolfram.com/FloorFunction.html

    c                 C   B   |j r| S tdd || fD r|S |jr|td S d S )Nc                 s   (    | ]}t tfD ]}t||V  qqd S r7   r(   r)   r'   .0r-   jr4   r4   r5   	<genexpr>       z%floor._eval_number.<locals>.<genexpr>r   )	is_Numberr(   anyis_NumberSymbolapproximation_intervalr   r8   r4   r4   r5   r         zfloor._eval_numberNr   c           	      C   s   | j d }||d}| |d}|tju r)|j|dt|jr!dndd}t|}|jr_||kr]|dkrM|j	|dd}|j	|dd}||krLt
d|  n|j	||d}|jr[|d S |S |S |j|||d	S 
Nr   -+dirrJ   cdir   z,Two sided limit of %s around 0does not exist)logxr^   )r   subsr   NaNlimitr   is_negativer(   r   r\   
ValueErroras_leading_term	r<   xr`   r^   r+   arg0r3   ndirlndirr4   r4   r5   _eval_as_leading_term   (   

zfloor._eval_as_leading_termc                 C   s   | j d }||d}| |d}|tju r)|j|dt|jr!dndd}t|}|jrTddl	m
} ddlm}	 |||||}
|dkrK|	d|dfn|dd}|
| S ||krn|j||dkra|ndd	}|jrl|d S |S |S )
Nr   rY   rZ   r[   AccumBoundsOrderr_   rJ   r]   )r   ra   r   rb   rc   r   rd   r(   is_infinite!sympy.calculus.accumulationboundsro   sympy.series.orderrq   _eval_nseriesr\   r<   rh   nr`   r^   r+   ri   r3   ro   rq   sork   r4   r4   r5   ru          

 zfloor._eval_nseriesc                 C   r9   r:   )r   rd   r;   r4   r4   r5   _eval_is_negative   r>   zfloor._eval_is_negativec                 C   r9   r:   )r   is_nonnegativer;   r4   r4   r5   _eval_is_nonnegative   r>   zfloor._eval_is_nonnegativec                 K      t |  S r7   r)   r<   r+   kwargsr4   r4   r5   _eval_rewrite_as_ceiling   r>   zfloor._eval_rewrite_as_ceilingc                 K      |t | S r7   fracr   r4   r4   r5   _eval_rewrite_as_frac   r>   zfloor._eval_rewrite_as_fracc                 C   s   t |}| jd jr%|jr| jd |d k S |jr%|jr%| jd t|k S | jd |kr2|jr2t jS |t ju r=| jr=t jS t	| |ddS Nr   r_   Fr   )
r   r   r!   r   	is_numberr)   trueInfinityr   r   r<   otherr4   r4   r5   __le__      zfloor.__le__c                 C   s   t |}| jd jr#|jr| jd |kS |jr#|jr#| jd t|kS | jd |kr0|jr0t jS |t ju r;| jr;t j	S t
| |ddS Nr   Fr   )r   r   r!   r   r   r)   falseNegativeInfinityr   r   r   r   r4   r4   r5   __ge__      zfloor.__ge__c                 C   s   t |}| jd jr%|jr| jd |d kS |jr%|jr%| jd t|kS | jd |kr2|jr2t jS |t ju r=| jr=t j	S t
| |ddS r   )r   r   r!   r   r   r)   r   r   r   r   r   r   r4   r4   r5   __gt__   r   zfloor.__gt__c                 C   s   t |}| jd jr#|jr| jd |k S |jr#|jr#| jd t|k S | jd |kr0|jr0t jS |t ju r;| jr;t j	S t
| |ddS r   )r   r   r!   r   r   r)   r   r   r   r   r   r   r4   r4   r5   __lt__   r   zfloor.__lt__r:   r   )rB   rC   rD   rE   r%   rH   r   rl   ru   r{   r}   r   r   r   r   r   r   r4   r4   r4   r5   r(   _       #

	
r(   c                 C       t | t|pt | t|S r7   )r   rewriter)   r   lhsrhsr4   r4   r5   _eval_is_eq   s   r   c                   @   rI   )r)   a  
    Ceiling is a univariate function which returns the smallest integer
    value not less than its argument. This implementation
    generalizes ceiling to complex numbers by taking the ceiling of the
    real and imaginary parts separately.

    Examples
    ========

    >>> from sympy import ceiling, E, I, S, Float, Rational
    >>> ceiling(17)
    17
    >>> ceiling(Rational(23, 10))
    3
    >>> ceiling(2*E)
    6
    >>> ceiling(-Float(0.567))
    0
    >>> ceiling(I/2)
    I
    >>> ceiling(S(5)/2 + 5*I/2)
    3 + 3*I

    See Also
    ========

    sympy.functions.elementary.integers.floor

    References
    ==========

    .. [1] "Concrete mathematics" by Graham, pp. 87
    .. [2] http://mathworld.wolfram.com/CeilingFunction.html

    r_   c                 C   rK   )Nc                 s   rL   r7   rM   rN   r4   r4   r5   rQ   -  rR   z'ceiling._eval_number.<locals>.<genexpr>r_   )rS   r)   rT   rU   rV   r   r8   r4   r4   r5   r   )  rW   zceiling._eval_numberNr   c           	      C   s   | j d }||d}| |d}|tju r)|j|dt|jr!dndd}t|}|jr_||kr]|dkrM|j	|dd}|j	|dd}||krLt
d|  n|j	||d}|jrY|S |d S |S |j|||d	S rX   )r   ra   r   rb   rc   r   rd   r)   r   r\   re   rf   rg   r4   r4   r5   rl   3  rm   zceiling._eval_as_leading_termc                 C   s   | j d }||d}| |d}|tju r)|j|dt|jr!dndd}t|}|jrTddl	m
} ddlm}	 |||||}
|dkrK|	d|dfn|dd}|
| S ||krn|j||dkra|ndd}|jrj|S |d S |S )	Nr   rY   rZ   r[   rn   rp   r_   r]   )r   ra   r   rb   rc   r   rd   r)   rr   rs   ro   rt   rq   ru   r\   rv   r4   r4   r5   ru   I  rz   zceiling._eval_nseriesc                 K   r~   r7   r(   r   r4   r4   r5   _eval_rewrite_as_floor\  r>   zceiling._eval_rewrite_as_floorc                 K      |t |  S r7   r   r   r4   r4   r5   r   _     zceiling._eval_rewrite_as_fracc                 C   r9   r:   )r   is_positiver;   r4   r4   r5   _eval_is_positiveb  r>   zceiling._eval_is_positivec                 C   r9   r:   )r   is_nonpositiver;   r4   r4   r5   _eval_is_nonpositivee  r>   zceiling._eval_is_nonpositivec                 C   s   t |}| jd jr%|jr| jd |d kS |jr%|jr%| jd t|kS | jd |kr2|jr2t jS |t ju r=| jr=t j	S t
| |ddS r   )r   r   r!   r   r   r(   r   r   r   r   r   r   r4   r4   r5   r   h  r   zceiling.__lt__c                 C   s   t |}| jd jr#|jr| jd |kS |jr#|jr#| jd t|kS | jd |kr0|jr0t jS |t ju r;| jr;t j	S t
| |ddS r   )r   r   r!   r   r   r(   r   r   r   r   r   r   r4   r4   r5   r   v  r   zceiling.__gt__c                 C   s   t |}| jd jr%|jr| jd |d kS |jr%|jr%| jd t|kS | jd |kr2|jr2t jS |t ju r=| jr=t jS t	| |ddS r   )
r   r   r!   r   r   r(   r   r   r   r   r   r4   r4   r5   r     r   zceiling.__ge__c                 C   s   t |}| jd jr#|jr| jd |kS |jr#|jr#| jd t|kS | jd |kr0|jr0t jS |t ju r;| jr;t j	S t
| |ddS r   )r   r   r!   r   r   r(   r   r   r   r   r   r   r4   r4   r5   r     r   zceiling.__le__r:   r   )rB   rC   rD   rE   r%   rH   r   rl   ru   r   r   r   r   r   r   r   r   r4   r4   r4   r5   r)     r   r)   c                 C   r   r7   )r   r   r(   r   r   r4   r4   r5   r     s    c                   @   s   e Zd ZdZedd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )r   a  Represents the fractional part of x

    For real numbers it is defined [1]_ as

    .. math::
        x - \left\lfloor{x}\right\rfloor

    Examples
    ========

    >>> from sympy import Symbol, frac, Rational, floor, I
    >>> frac(Rational(4, 3))
    1/3
    >>> frac(-Rational(4, 3))
    2/3

    returns zero for integer arguments

    >>> n = Symbol('n', integer=True)
    >>> frac(n)
    0

    rewrite as floor

    >>> x = Symbol('x')
    >>> frac(x).rewrite(floor)
    x - floor(x)

    for complex arguments

    >>> r = Symbol('r', real=True)
    >>> t = Symbol('t', real=True)
    >>> frac(t + I*r)
    I*frac(r) + frac(t)

    See Also
    ========

    sympy.functions.elementary.integers.floor
    sympy.functions.elementary.integers.ceiling

    References
    ===========

    .. [1] https://en.wikipedia.org/wiki/Fractional_part
    .. [2] http://mathworld.wolfram.com/FractionalPart.html

    c                    s   ddl m   fdd}t|}tjtj}}|D ]#}|js&tj| jr:t	|}|
tjs5||7 }q||7 }q||7 }q||}||}|tj|  S )Nr   rn   c                    sd   | t jt jfv r ddS | jrt jS | jr,| t ju rt jS | t ju r&t jS | t|  S | ddS r   )	r   r   r   r   r#   r   rb   ComplexInfinityr(   )r+   ro   r*   r4   r5   _eval  s   


zfrac.eval.<locals>._eval)rs   ro   r   r$   r   r#   r   r    r!   r   r"   )r*   r+   r   r1   realimagr2   r-   r4   r   r5   r6     s   



z	frac.evalc                 K   r   r7   r   r   r4   r4   r5   r     r>   zfrac._eval_rewrite_as_floorc                 K   r   r7   r   r   r4   r4   r5   r     r   zfrac._eval_rewrite_as_ceilingc                 C      dS )NTr4   r;   r4   r4   r5   r=        zfrac._eval_is_finitec                 C   r9   r:   )r   is_extended_realr;   r4   r4   r5   r@     r>   zfrac._eval_is_realc                 C   r9   r:   )r   r   r;   r4   r4   r5   _eval_is_imaginary  r>   zfrac._eval_is_imaginaryc                 C   r9   r:   )r   r   r;   r4   r4   r5   rA   
  r>   zfrac._eval_is_integerc                 C   s   t | jd j| jd jgS r:   )r
   r   is_zeror   r;   r4   r4   r5   _eval_is_zero  s   zfrac._eval_is_zeroc                 C   r   )NFr4   r;   r4   r4   r5   r{     r   zfrac._eval_is_negativec                 C   s@   | j rt|}|jrtjS | |}|d ur| S t| |ddS NFr   )r   r   is_extended_nonpositiver   r   _value_one_or_morer   r<   r   resr4   r4   r5   r     s   
zfrac.__ge__c                 C   s@   | j rt|}| |}|d ur| S |jrtjS t| |ddS r   )r   r   r   is_extended_negativer   r   r   r   r4   r4   r5   r     s   
zfrac.__gt__c                 C   >   | j rt|}|jrtjS | |}|d ur|S t| |ddS r   )r   r   r   r   r   r   r   r   r4   r4   r5   r   +     
zfrac.__le__c                 C   r   r   )r   r   r   r   r   r   r   r   r4   r4   r5   r   7  r   zfrac.__lt__c                 C   sF   |j r|jr|dk}|rt|tstjS |jr|jr!tjS d S d S d S )Nr_   )r   r   r'   r   r   r   r   r   r   r4   r4   r5   r   C  s   zfrac._value_one_or_moreN)rB   rC   rD   rE   rH   r6   r   r   r=   r@   r   rA   r   r{   r   r   r   r   r   r4   r4   r4   r5   r     s"    0
#r   c                 C   sD   |  t|ks|  t|krdS |jrdS | |}|d ur dS d S )NTF)r   r(   r)   r   r   )r   r   r   r4   r4   r5   r   M  s   
N)(typingr   rF   sympy.core.basicr   sympy.core.exprr   
sympy.corer   r   sympy.core.evalfr   r   sympy.core.functionr	   sympy.core.logicr
   sympy.core.numbersr   sympy.core.relationalr   r   r   r   r   r   sympy.core.symbolr   sympy.core.sympifyr   $sympy.functions.elementary.complexesr   r   sympy.multipledispatchr   r   r(   r   r)   r   r4   r4   r4   r5   <module>   s4     I 
 
 (