a
    khzW                     @  s:  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mZ d dlmZmZ d d	lmZmZmZ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# 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 )    )annotations)Basic)Expr)AddS)get_integer_partPrecisionExhausted)DefinedFunction)fuzzy_or	fuzzy_and)Integer
int_valued)GtLtGeLe
Relationalis_eqis_leis_lt)_sympify)imre)dispatchc                   @  sJ   e Zd ZU dZd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.ztuple[Expr]argsc           
   	   C  s  |  | }d ur|S | | }d ur,|S |js<|jdu r@|S |jsRtj| jrt|}|	tjst| |tj S | |ddS tj
 } }}dd }t|D ]`}|jr|t| }d ur||tj 7 }q|| }d ur||7 }q|jr||7 }q||7 }q|s|s|S |r|rL|jr<|jsLtj| jsL|jr|jrz:t|| ji dd\}	}|t|	t|tj  7 }tj
}W n ttfy   Y n0 ||7 }|s|S |jstj| jr|| t|ddtj  S t|ttfr|| S || |dd S d S )NFevaluatec                 S  s   t | rt| S | jr| S d S N)r   int
is_integer)x r"   Q/var/www/auris/lib/python3.9/site-packages/sympy/functions/elementary/integers.py<lambda>-   s   z$RoundFunction.eval.<locals>.<lambda>T)Zreturn_ints)_eval_number_eval_const_numberr    	is_finiteis_imaginaryr   ImaginaryUnitis_realr   hasZeror   	make_args	is_numberr   _dirr   r   NotImplementedError
isinstancefloorceiling)
clsargviZipartZnpartspartZintoftrr"   r"   r#   eval   sh    






zRoundFunction.evalc                 C  s
   t  d S r   )r0   r4   r5   r"   r"   r#   r%   S   s    zRoundFunction._eval_numberc                 C  s   | j d jS Nr   )r   r'   selfr"   r"   r#   _eval_is_finiteW   s    zRoundFunction._eval_is_finitec                 C  s   | j d jS r=   r   r*   r>   r"   r"   r#   _eval_is_realZ   s    zRoundFunction._eval_is_realc                 C  s   | j d jS r=   rA   r>   r"   r"   r#   _eval_is_integer]   s    zRoundFunction._eval_is_integerN)__name__
__module____qualname____doc____annotations__classmethodr;   r%   r@   rB   rC   r"   r"   r"   r#   r      s   

8
r   c                   @  s~   e Zd ZdZdZedd Zedd Z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 )r2   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] https://mathworld.wolfram.com/FloorFunction.html

    c                 C  sB   |j r| S tdd || fD r*|S |jr>|td S d S )Nc                 s  s&   | ]}t tfD ]}t||V  qqd S r   r2   r3   r1   .0r7   jr"   r"   r#   	<genexpr>   s   z%floor._eval_number.<locals>.<genexpr>r   )	is_Numberr2   anyis_NumberSymbolapproximation_intervalr   r<   r"   r"   r#   r%      s    zfloor._eval_numberc                 C  s   |j r|jrtjS |jrz| \}}|j}|d u r6d S |rH| |  }}t||rXtjS tt	||t|d| grztj
S |jr| \}}|j}|d u rd S |r| |  }}t	| |rtjS tt	d| |t|| grtdS d S N   )r*   is_zeror   r,   is_positiveas_numer_denomis_negativer   r   r   OneNegativeOner   r4   r5   numZdensr"   r"   r#   r&      s2    
zfloor._eval_const_numberc           	      C  s   ddl m} | jd }||d}| |d}|tju sBt||rh|j|dt|j	rXdndd}t
|}|jr||kr|j||dkr|ndd}|j	r|d S |jr|S td| n|S |j|||d	S 
Nr   AccumBounds-+dir   cdirNot sure of sign of %slogxri   )!sympy.calculus.accumulationboundsrb   r   subsr   NaNr1   limitr   rZ   r2   r'   rf   rX   r0   as_leading_term	r?   r!   rl   ri   rb   r5   arg0r:   ndirr"   r"   r#   _eval_as_leading_term   s"    
zfloor._eval_as_leading_termr   c                 C  s   | j d }||d}| |d}|tju rR|j|dt|jrBdndd}t|}|jrddl	m
} ddlm}	 |||||}
|dkr|	d|dfn|dd}|
| S ||kr|j||dkr|ndd	}|jr|d S |jr|S td
| n|S d S )Nr   rc   rd   re   ra   Orderrg   rJ   rh   rj   )r   rn   r   ro   rp   r   rZ   r2   is_infiniterm   rb   sympy.series.orderrw   _eval_nseriesrf   rX   r0   r?   r!   nrl   ri   r5   rs   r:   rb   rw   r_   ort   r"   r"   r#   rz      s(    

 zfloor._eval_nseriesc                 C  s   | j d jS r=   )r   rZ   r>   r"   r"   r#   _eval_is_negative   s    zfloor._eval_is_negativec                 C  s   | j d jS r=   )r   Zis_nonnegativer>   r"   r"   r#   _eval_is_nonnegative   s    zfloor._eval_is_nonnegativec                 K  s   t |  S r   r3   r?   r5   kwargsr"   r"   r#   _eval_rewrite_as_ceiling   s    zfloor._eval_rewrite_as_ceilingc                 K  s   |t | S r   fracr   r"   r"   r#   _eval_rewrite_as_frac   s    zfloor._eval_rewrite_as_fracc                 C  s   t |}| jd jrJ|jr,| jd |d k S |jrJ|jrJ| jd t|k S | jd |krd|jrdt jS |t ju rz| jrzt jS t	| |ddS Nr   rg   Fr   )
r   r   r*   r    r.   r3   trueInfinityr'   r   r?   otherr"   r"   r#   __le__   s    zfloor.__le__c                 C  s   t |}| jd jrF|jr(| jd |kS |jrF|jrF| jd t|kS | jd |krf|jrf|jrft jS |t ju r|| j	r|t j
S t| |ddS Nr   Fr   )r   r   r*   r    r.   r3   is_nonintegerfalseNegativeInfinityr'   r   r   r   r"   r"   r#   __ge__   s    zfloor.__ge__c                 C  s   t |}| jd jrJ|jr,| jd |d kS |jrJ|jrJ| jd t|kS | jd |krd|jrdt jS |t ju rz| jrzt j	S t
| |ddS r   )r   r   r*   r    r.   r3   r   r   r'   r   r   r   r"   r"   r#   __gt__  s    zfloor.__gt__c                 C  s   t |}| jd jrF|jr(| jd |k S |jrF|jrF| jd t|k S | jd |krf|jrf|jrft jS |t ju r|| j	r|t jS t
| |ddS r   )r   r   r*   r    r.   r3   r   r   r   r'   r   r   r"   r"   r#   __lt__  s    zfloor.__lt__N)r   )rD   rE   rF   rG   r/   rI   r%   r&   ru   rz   r~   r   r   r   r   r   r   r   r"   r"   r"   r#   r2   a   s    #
	

r2   c                 C  s    t | t|pt | t|S r   )r   rewriter3   r   lhsrhsr"   r"   r#   _eval_is_eq#  s    r   c                   @  s~   e Zd ZdZdZedd Zedd Z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 )r3   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] https://mathworld.wolfram.com/CeilingFunction.html

    rg   c                 C  sB   |j r| S tdd || fD r*|S |jr>|td S d S )Nc                 s  s&   | ]}t tfD ]}t||V  qqd S r   rK   rL   r"   r"   r#   rO   S  s   z'ceiling._eval_number.<locals>.<genexpr>rg   )rP   r3   rQ   rR   rS   r   r<   r"   r"   r#   r%   O  s    zceiling._eval_numberc                 C  s   |j r|jrtjS |jr|| \}}|j}|d u r6d S |rH| |  }}t||rXtjS t	t
||t|d| gr|tdS |jr| \}}|j}|d u rd S |r| |  }}t
| |rtjS t	t
d| |t|| grtjS d S rT   )r*   rW   r   r,   rX   rY   rZ   r   r[   r   r   r   r\   r]   r"   r"   r#   r&   Y  s2    
zceiling._eval_const_numberc           	      C  s   ddl m} | jd }||d}| |d}|tju sBt||rh|j|dt|j	rXdndd}t
|}|jr||kr|j||dkr|ndd}|j	r|S |jr|d S td| n|S |j|||d	S r`   )rm   rb   r   rn   r   ro   r1   rp   r   rZ   r3   r'   rf   rX   r0   rq   rr   r"   r"   r#   ru   y  s"    
zceiling._eval_as_leading_termr   c                 C  s   | j d }||d}| |d}|tju rR|j|dt|jrBdndd}t|}|jrddl	m
} ddlm}	 |||||}
|dkr|	d|dfn|dd}|
| S ||kr|j||dkr|ndd}|jr|S |jr|d S td	| n|S d S )
Nr   rc   rd   re   ra   rv   rg   rh   rj   )r   rn   r   ro   rp   r   rZ   r3   rx   rm   rb   ry   rw   rz   rf   rX   r0   r{   r"   r"   r#   rz     s(    

 zceiling._eval_nseriesc                 K  s   t |  S r   r2   r   r"   r"   r#   _eval_rewrite_as_floor  s    zceiling._eval_rewrite_as_floorc                 K  s   |t |  S r   r   r   r"   r"   r#   r     s    zceiling._eval_rewrite_as_fracc                 C  s   | j d jS r=   )r   rX   r>   r"   r"   r#   _eval_is_positive  s    zceiling._eval_is_positivec                 C  s   | j d jS r=   )r   Zis_nonpositiver>   r"   r"   r#   _eval_is_nonpositive  s    zceiling._eval_is_nonpositivec                 C  s   t |}| jd jrJ|jr,| jd |d kS |jrJ|jrJ| jd t|kS | jd |krd|jrdt jS |t ju rz| jrzt j	S t
| |ddS r   )r   r   r*   r    r.   r2   r   r   r'   r   r   r   r"   r"   r#   r     s    zceiling.__lt__c                 C  s   t |}| jd jrF|jr(| jd |kS |jrF|jrF| jd t|kS | jd |krf|jrf|jrft jS |t ju r|| j	r|t jS t
| |ddS r   )r   r   r*   r    r.   r2   r   r   r   r'   r   r   r"   r"   r#   r     s    zceiling.__gt__c                 C  s   t |}| jd jrJ|jr,| jd |d kS |jrJ|jrJ| jd t|kS | jd |krd|jrdt jS |t ju rz| jrzt jS t	| |ddS r   )
r   r   r*   r    r.   r2   r   r   r'   r   r   r"   r"   r#   r     s    zceiling.__ge__c                 C  s   t |}| jd jrF|jr(| jd |kS |jrF|jrF| jd t|kS | jd |krf|jrf|jrft jS |t ju r|| j	r|t j
S t| |ddS r   )r   r   r*   r    r.   r2   r   r   r   r'   r   r   r   r"   r"   r#   r     s    zceiling.__le__N)r   )rD   rE   rF   rG   r/   rI   r%   r&   ru   rz   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r3   )  s    #
	

r3   c                 C  s    t | t|pt | t|S r   )r   r   r2   r   r   r"   r"   r#   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d Zd$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] https://mathworld.wolfram.com/FractionalPart.html

    c                   s   ddl m   fdd}tjtj }}t|D ]F}|jsHtj| jrpt	|}|
tjsf||7 }qx||7 }q2||7 }q2||}||}|tj|  S )Nr   ra   c                   sd   | t jt jfv r ddS | jr&t jS | jrX| t ju r<t jS | t ju rLt jS | t|  S | ddS r   )	r   r   r   r    r,   r.   ro   ComplexInfinityr2   )r5   rb   r4   r"   r#   _eval%  s    


zfrac.eval.<locals>._eval)rm   rb   r   r,   r   r-   r(   r)   r*   r   r+   )r4   r5   r   realimagr9   r7   r"   r   r#   r;   !  s    


z	frac.evalc                 K  s   |t | S r   r   r   r"   r"   r#   r   D  s    zfrac._eval_rewrite_as_floorc                 K  s   |t |  S r   r   r   r"   r"   r#   r   G  s    zfrac._eval_rewrite_as_ceilingc                 C  s   dS )NTr"   r>   r"   r"   r#   r@   J  s    zfrac._eval_is_finitec                 C  s   | j d jS r=   )r   is_extended_realr>   r"   r"   r#   rB   M  s    zfrac._eval_is_realc                 C  s   | j d jS r=   )r   r(   r>   r"   r"   r#   _eval_is_imaginaryP  s    zfrac._eval_is_imaginaryc                 C  s   | j d jS r=   )r   r    r>   r"   r"   r#   rC   S  s    zfrac._eval_is_integerc                 C  s   t | jd j| jd jgS r=   )r
   r   rW   r    r>   r"   r"   r#   _eval_is_zeroV  s    zfrac._eval_is_zeroc                 C  s   dS )NFr"   r>   r"   r"   r#   r~   Y  s    zfrac._eval_is_negativec                 C  s@   | j r2t|}|jrtjS | |}|d ur2| S t| |ddS NFr   )r   r   is_extended_nonpositiver   r   _value_one_or_morer   r?   r   resr"   r"   r#   r   \  s    
zfrac.__ge__c                 C  s@   | j r2t|}| |}|d ur&| S |jr2tjS t| |ddS r   )r   r   r   is_extended_negativer   r   r   r   r"   r"   r#   r   h  s    
zfrac.__gt__c                 C  s>   | j r0t|}|jrtjS | |}|d ur0|S t| |ddS r   )r   r   r   r   r   r   r   r   r"   r"   r#   r   t  s    
zfrac.__le__c                 C  s>   | j r0t|}|jrtjS | |}|d ur0|S t| |ddS r   )r   r   r   r   r   r   r   r   r"   r"   r#   r     s    
zfrac.__lt__c                 C  s>   |j r:|jr(|dk}|r(t|ts(tjS |jr:|jr:tjS d S )Nrg   )r   r.   r1   r   r   r   r    rX   r   r"   r"   r#   r     s    zfrac._value_one_or_morec           	      C  s   ddl m} | jd }||d}| |d}|jrn|jrh|j||d}|jrTtj	S || j
|||dS |S n|tjtjtjfv r|ddS |j
|||dS )Nr   ra   rh   rk   rg   )rm   rb   r   rn   r'   rW   rf   rZ   r   r[   rq   r   r   r   rr   r"   r"   r#   ru     s    

zfrac._eval_as_leading_termr   c                 C  s   ddl m} | jd }||d}| |d}|jrvddlm}	 |dkrV|d|dfn|	dd||| |df }
|
S || j||||d}|jr|j	||d}||j
rtjntj7 }n||7 }|S d S )Nr   rv   ra   rg   rk   rh   )ry   rw   r   rn   rx   rm   rb   rz   rW   rf   rZ   r   r[   r,   )r?   r!   r|   rl   ri   rw   r5   rs   r:   rb   r}   r   rt   r"   r"   r#   rz     s    
2zfrac._eval_nseriesN)r   )rD   rE   rF   rG   rI   r;   r   r   r@   rB   r   rC   r   r~   r   r   r   r   r   ru   rz   r"   r"   r"   r#   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   r2   r3   r   r   )r   r   r   r"   r"   r#   r     s    
N))
__future__r   Zsympy.core.basicr   Zsympy.core.exprr   Z
sympy.corer   r   Zsympy.core.evalfr   r   Zsympy.core.functionr	   Zsympy.core.logicr
   r   Zsympy.core.numbersr   r   Zsympy.core.relationalr   r   r   r   r   r   r   r   Zsympy.core.sympifyr   Z$sympy.functions.elementary.complexesr   r   Zsympy.multipledispatchr   r   r2   r   r3   r   r"   r"   r"   r#   <module>   s0   (L C
 C
 L