U
    ZÊ¹jÎM  ã                   @   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 d dlmZ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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Ú
int_valued)ÚGtÚLtÚGeÚLeÚ
RelationalÚis_eq)Ú_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 k	r|S |js&|jdkr*|S |js<tj| jrjt|ƒ}| tj¡s^| |ƒtj S | |dd�S tj	 } }}dd„ }t
 |¡D ]`}|jr¸|t|ƒƒ }d k	r¸||tj 7 }qŠ||ƒ }d k	rÒ||7 }qŠ|jrâ||7 }qŠ||7 }qŠ|sø|sø|S |�rˆ|�r2|j�r"|j�s2tj| j�s2|j�rˆ|j�rˆz:t|| ji dd�\}	}|t|	ƒt|ƒtj  7 }tj	}W n ttfk
�r†   Y nX ||7 }|�sš|S |j�s°t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   úb/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/functions/elementary/integers.pyÚ<lambda>,   s   z$RoundFunction.eval.<locals>.<lambda>T)Zreturn_ints)Ú_eval_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npartZspartZintofÚtÚrr   r   r    Úeval   sl    



ÿþþ
þýý   ÿ

zRoundFunction.evalc                 C   s
   t ƒ ‚d S r   )r,   ©r0   r1   r   r   r    r"   R   s    zRoundFunction._eval_numberc                 C   s   | j d jS ©Nr   )r   r#   ©Úselfr   r   r    Ú_eval_is_finiteV   s    zRoundFunction._eval_is_finitec                 C   s   | j d jS r8   ©r   r&   r9   r   r   r    Ú_eval_is_realY   s    zRoundFunction._eval_is_realc                 C   s   | j d jS r8   r<   r9   r   r   r    Ú_eval_is_integer\   s    zRoundFunction._eval_is_integerN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚtTupler   Ú__annotations__Úclassmethodr6   r"   r;   r=   r>   r   r   r   r    r      s   

7
r   c                   @   st   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] 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   ©r.   r/   r-   ©Ú.0r3   Újr   r   r    Ú	<genexpr>Š   s    
 ÿz%floor._eval_number.<locals>.<genexpr>r   )Ú	is_Numberr.   ÚanyÚis_NumberSymbolÚapproximation_intervalr   r7   r   r   r    r"   †   s    ÿzfloor._eval_numberNr   c           	      C   sÊ   ddl m} | jd }| |d¡}|  |d¡}|tjk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©ÚlogxrY   )Ú!sympy.calculus.accumulationboundsrR   r   Úsubsr   ÚNaNr-   Úlimitr   Úis_negativer.   r#   rV   Úis_positiver,   Úas_leading_term©	r:   r   r\   rY   rR   r1   Úarg0r5   Úndirr   r   r    Ú_eval_as_leading_term�   s"    
zfloor._eval_as_leading_termc                 C   sø   | j d }| |d¡}|  |d¡}|tjkrR|j|dt|ƒjrBdndd�}t|ƒ}|jr¨d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   rS   rT   rU   rQ   ©ÚOrderrW   rF   rX   rZ   )r   r^   r   r_   r`   r   ra   r.   Úis_infiniter]   rR   Úsympy.series.orderri   Ú_eval_nseriesrV   rb   r,   ©r:   r   Únr\   rY   r1   re   r5   rR   ri   ÚsÚorf   r   r   r    rl   ¥   s(    

 zfloor._eval_nseriesc                 C   s   | j d jS r8   )r   ra   r9   r   r   r    Ú_eval_is_negative½   s    zfloor._eval_is_negativec                 C   s   | j d jS r8   )r   Zis_nonnegativer9   r   r   r    Ú_eval_is_nonnegativeÀ   s    zfloor._eval_is_nonnegativec                 K   s   t | ƒ S r   ©r/   ©r:   r1   Úkwargsr   r   r    Ú_eval_rewrite_as_ceilingÃ   s    zfloor._eval_rewrite_as_ceilingc                 K   s   |t |ƒ S r   ©Úfracrt   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krz| jrzt jS t	| |dd�S ©Nr   rW   Fr   )
r   r   r&   r   r*   r/   Ú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r`|jr`t jS |t jkrv| jrvt j	S t
| |dd�S ©Nr   Fr   )r   r   r&   r   r*   r/   Ú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krz| jrzt j	S t
| |dd�S rz   )r   r   r&   r   r*   r/   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r`|jr`t jS |t jkrv| jrvt j	S t
| |dd�S r€   )r   r   r&   r   r*   r/   r�   r|   r#   r{   r   r}   r   r   r    Ú__lt__ó   s    zfloor.__lt__)Nr   )r   )r?   r@   rA   rB   r+   rE   r"   rg   rl   rq   rr   rv   ry   r   rƒ   r„   r…   r   r   r   r    r.   `   s   #
	

r.   c                 C   s    t |  t¡|ƒpt |  t¡|ƒS r   )r   Úrewriter/   rx   ©ÚlhsÚrhsr   r   r    Ú_eval_is_eq  s    ÿrŠ   c                   @   st   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÷  
    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

    rW   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   rG   rH   r   r   r    rK   2  s    
 ÿz'ceiling._eval_number.<locals>.<genexpr>rW   )rL   r/   rM   rN   rO   r   r7   r   r   r    r"   .  s    ÿzceiling._eval_numberNr   c           	      C   sÊ   ddl m} | jd }| |d¡}|  |d¡}|tjk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 rP   )r]   rR   r   r^   r   r_   r-   r`   r   ra   r/   r#   rV   rb   r,   rc   rd   r   r   r    rg   8  s"    
zceiling._eval_as_leading_termc                 C   sø   | j d }| |d¡}|  |d¡}|tjkrR|j|dt|ƒjrBdndd�}t|ƒ}|jr¨d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   rS   rT   rU   rQ   rh   rW   rX   rZ   )r   r^   r   r_   r`   r   ra   r/   rj   r]   rR   rk   ri   rl   rV   rb   r,   rm   r   r   r    rl   M  s(    

 zceiling._eval_nseriesc                 K   s   t | ƒ S r   ©r.   rt   r   r   r    Ú_eval_rewrite_as_floore  s    zceiling._eval_rewrite_as_floorc                 K   s   |t | ƒ S r   rw   rt   r   r   r    ry   h  s    zceiling._eval_rewrite_as_fracc                 C   s   | j d jS r8   )r   rb   r9   r   r   r    Ú_eval_is_positivek  s    zceiling._eval_is_positivec                 C   s   | j d jS r8   )r   Zis_nonpositiver9   r   r   r    Ú_eval_is_nonpositiven  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krz| jrzt j	S t
| |dd�S rz   )r   r   r&   r   r*   r.   r�   r|   r#   r{   r   r}   r   r   r    r…   q  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r`|jr`t jS |t jkrv| jrvt j	S t
| |dd�S r€   )r   r   r&   r   r*   r.   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krz| jrzt jS t	| |dd�S rz   )
r   r   r&   r   r*   r.   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r`|jr`t jS |t jkrv| jrvt j	S t
| |dd�S r€   )r   r   r&   r   r*   r.   r�   r|   r#   r{   r   r}   r   r   r    r   ›  s    zceiling.__le__)Nr   )r   )r?   r@   rA   rB   r+   rE   r"   rg   rl   rŒ   ry   r�   rŽ   r…   r„   rƒ   r   r   r   r   r    r/     s   #
	

r/   c                 C   s    t |  t¡|ƒpt |  t¡|ƒS r   )r   r†   r.   rx   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 d!„Zd%d"d#„ZdS )&rx   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   rQ   c                    sd   | t jt jfkrˆ ddƒS | jr&t jS | jrX| t jkr<t jS | t jkrLt jS | t| ƒ S ˆ| dd�S rz   )	r   r|   r‚   r   r(   r*   r_   ÚComplexInfinityr.   )r1   ©rR   r0   r   r    Ú_evalä  s    


zfrac.eval.<locals>._eval)r]   rR   r   r(   r   r)   r$   r%   r&   r   r'   )r0   r1   r‘   ÚrealÚimagr4   r3   r   r�   r    r6   à  s    


z	frac.evalc                 K   s   |t |ƒ S r   r‹   rt   r   r   r    rŒ     s    zfrac._eval_rewrite_as_floorc                 K   s   |t | ƒ S r   rs   rt   r   r   r    rv     s    zfrac._eval_rewrite_as_ceilingc                 C   s   dS )NTr   r9   r   r   r    r;   	  s    zfrac._eval_is_finitec                 C   s   | j d jS r8   )r   Úis_extended_realr9   r   r   r    r=     s    zfrac._eval_is_realc                 C   s   | j d jS r8   )r   r$   r9   r   r   r    Ú_eval_is_imaginary  s    zfrac._eval_is_imaginaryc                 C   s   | j d jS r8   )r   r   r9   r   r   r    r>     s    zfrac._eval_is_integerc                 C   s   t | jd j| jd jgƒS r8   )r
   r   Úis_zeror   r9   r   r   r    Ú_eval_is_zero  s    zfrac._eval_is_zeroc                 C   s   dS )NFr   r9   r   r   r    rq     s    zfrac._eval_is_negativec                 C   s@   | j r2t|ƒ}|jrtjS |  |¡}|d k	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 k	r&| S |jr2tjS t| |dd�S r˜   )r”   r   rš   Úis_extended_negativer   r{   r   r›   r   r   r    r„   '  s    
zfrac.__gt__c                 C   s>   | j r0t|ƒ}|jrtjS |  |¡}|d k	r0|S t| |dd�S r˜   )r”   r   r�   r   r�   rš   r   r›   r   r   r    r   3  s    
zfrac.__le__c                 C   s>   | j r0t|ƒ}|jrtjS |  |¡}|d k	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 )NrW   )r”   r*   r-   r   r   r{   r   rb   r›   r   r   r    rš   K  s    zfrac._value_one_or_moreNr   c           	      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krŒ|ddƒS |j
|||d�S )Nr   rQ   rX   r[   rW   )r]   rR   r   r^   r#   r–   rV   ra   r   ÚOnerc   r�   r|   r‚   rd   r   r   r    rg   T  s    

zfrac._eval_as_leading_termc                 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
r®tjntj7 }n||7 }|S d S )Nr   rh   rQ   rW   r[   rX   )rk   ri   r   r^   rj   r]   rR   rl   r–   rV   ra   r   rž   r(   )r:   r   rn   r\   rY   ri   r1   re   r5   rR   rp   rœ   rf   r   r   r    rl   f  s    
2zfrac._eval_nseries)Nr   )r   )r?   r@   rA   rB   rE   r6   rŒ   rv   r;   r=   r•   r>   r—   rq   rƒ   r„   r   r…   rš   rg   rl   r   r   r   r    rx   ¯  s$   0
"	
rx   c                 C   sD   |   t¡|ks|   t¡|kr dS |jr*dS |  |¡}|d k	r@dS d S )NTF)r†   r.   r/   r�   rš   )rˆ   r‰   rœ   r   r   r    rŠ   z  s    ÿ
N)'Útypingr   rC   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
   Zsympy.core.numbersr   r   Zsympy.core.relationalr   r   r   r   r   r   Zsympy.core.sympifyr   Z$sympy.functions.elementary.complexesr   r   Zsympy.multipledispatchr   r   r.   rŠ   r/   rx   r   r   r   r    Ú<module>   s0    K #
 #
 L