o
    3IhzW                     @  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s)tj| jr@t|}|	tjs:| |tj S | |ddS tj
 } }}dd }t|D ]0}|jrg|t| }d urg||tj 7 }qP|| }d urt||7 }qP|jr|||7 }qP||7 }qP|s|s|S |r|r|jr|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evaluatec                 S  s   t | rt| S | jr| S d S N)r   int
is_integer)x r"   c/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/sympy/functions/elementary/integers.py<lambda>-   s    z$RoundFunction.eval.<locals>.<lambda>T)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iipartnpartspartintoftrr"   r"   r#   eval   sj   






zRoundFunction.evalc                 C  s   t  r   )r1   r5   r6   r"   r"   r#   r&   S   s   zRoundFunction._eval_numberc                 C     | j d jS Nr   )r   r(   selfr"   r"   r#   _eval_is_finiteW      zRoundFunction._eval_is_finitec                 C  rA   rB   r   r+   rC   r"   r"   r#   _eval_is_realZ   rF   zRoundFunction._eval_is_realc                 C  rA   rB   rG   rC   r"   r"   r#   _eval_is_integer]   rF   zRoundFunction._eval_is_integerN)__name__
__module____qualname____doc____annotations__classmethodr?   r&   rE   rH   rI   r"   r"   r"   r#   r      s   
 
8
r   c                   @  ~   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  
    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  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 r   r3   r4   r2   .0r8   jr"   r"   r#   	<genexpr>       z%floor._eval_number.<locals>.<genexpr>r   )	is_Numberr3   anyis_NumberSymbolapproximation_intervalr   r@   r"   r"   r#   r&         zfloor._eval_numberc                 C  s   |j rt|jr	tjS |jr=| \}}|j}|d u rd S |r$| | }}t||r,tjS tt	||t|d| gr=tj
S |jrv| \}}|j}|d u rOd S |rX| | }}t	| |ratjS tt	d| |t|| grxtdS d S d S d S N   )r+   is_zeror   r-   is_positiveas_numer_denomis_negativer   r   r   OneNegativeOner   r5   r6   numdensr"   r"   r#   r'      s8   
zfloor._eval_const_numberc           	      C  s   ddl m} | jd }||d}| |d}|tju s!t||r4|j|dt|j	r,dndd}t
|}|jr\||krZ|j||dkrD|ndd}|j	rO|d S |jrT|S td| |S |j|||d	S 
Nr   AccumBounds-+dir   cdirNot sure of sign of %slogxru   )!sympy.calculus.accumulationboundsrn   r   subsr   NaNr2   limitr   re   r3   r(   rr   rc   r1   as_leading_term	rD   r!   rx   ru   rn   r6   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 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rw|j||dkra|ndd	}|jrl|d S |jrq|S td
| |S )Nr   ro   rp   rq   rm   Orderrs   rQ   rt   rv   )r   rz   r   r{   r|   r   re   r3   is_infinitery   rn   sympy.series.orderr   _eval_nseriesrr   rc   r1   rD   r!   nrx   ru   r6   r   r>   rn   r   rk   or   r"   r"   r#   r      s(   

 zfloor._eval_nseriesc                 C  rA   rB   )r   re   rC   r"   r"   r#   _eval_is_negative   rF   zfloor._eval_is_negativec                 C  rA   rB   )r   is_nonnegativerC   r"   r"   r#   _eval_is_nonnegative   rF   zfloor._eval_is_nonnegativec                 K     t |  S r   r4   rD   r6   kwargsr"   r"   r#   _eval_rewrite_as_ceiling   rF   zfloor._eval_rewrite_as_ceilingc                 K     |t | S r   fracr   r"   r"   r#   _eval_rewrite_as_frac   rF   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   rs   Fr   )
r   r   r+   r    r/   r4   trueInfinityr(   r   rD   otherr"   r"   r#   __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r3|jr3|jr3t jS |t ju r>| j	r>t j
S t| |ddS Nr   Fr   )r   r   r+   r    r/   r4   is_nonintegerfalseNegativeInfinityr(   r   r   r   r"   r"   r#   __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/   r4   r   r   r(   r   r   r   r"   r"   r#   __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r3|jr3|jr3t jS |t ju r>| j	r>t jS t
| |ddS r   )r   r   r+   r    r/   r4   r   r   r   r(   r   r   r"   r"   r#   __lt__  r   zfloor.__lt__Nr   )rJ   rK   rL   rM   r0   rO   r&   r'   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r3   a   "    #
	

r3   c                 C      t | t|pt | t|S r   )r   rewriter4   r   lhsrhsr"   r"   r#   _eval_is_eq#  s   r   c                   @  rP   )r4   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

    rs   c                 C  rR   )Nc                 s  rS   r   rT   rU   r"   r"   r#   rX   S  rY   z'ceiling._eval_number.<locals>.<genexpr>rs   )rZ   r4   r[   r\   r]   r   r@   r"   r"   r#   r&   O  r^   zceiling._eval_numberc                 C  s   |j rt|jr	tjS |jr>| \}}|j}|d u rd S |r$| | }}t||r,tjS t	t
||t|d| gr>tdS |jrv| \}}|j}|d u rPd S |rY| | }}t
| |rbtjS t	t
d| |t|| grxtjS d S d S d S r_   )r+   rb   r   r-   rc   rd   re   r   rf   r   r   r   rg   rh   r"   r"   r#   r'   Y  s8   
zceiling._eval_const_numberc           	      C  s   ddl m} | jd }||d}| |d}|tju s!t||r4|j|dt|j	r,dndd}t
|}|jr\||krZ|j||dkrD|ndd}|j	rM|S |jrT|d S td| |S |j|||d	S rl   )ry   rn   r   rz   r   r{   r2   r|   r   re   r4   r(   rr   rc   r1   r}   r~   r"   r"   r#   r   y  s"   
zceiling._eval_as_leading_termr   c                 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rw|j||dkra|ndd}|jrj|S |jrq|d S td	| |S )
Nr   ro   rp   rq   rm   r   rs   rt   rv   )r   rz   r   r{   r|   r   re   r4   r   ry   rn   r   r   r   rr   rc   r1   r   r"   r"   r#   r     s(   

 zceiling._eval_nseriesc                 K  r   r   r3   r   r"   r"   r#   _eval_rewrite_as_floor  rF   zceiling._eval_rewrite_as_floorc                 K     |t |  S r   r   r   r"   r"   r#   r        zceiling._eval_rewrite_as_fracc                 C  rA   rB   )r   rc   rC   r"   r"   r#   _eval_is_positive  rF   zceiling._eval_is_positivec                 C  rA   rB   )r   is_nonpositiverC   r"   r"   r#   _eval_is_nonpositive  rF   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/   r3   r   r   r(   r   r   r   r"   r"   r#   r     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r3|jr3|jr3t 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#   r     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/   r3   r   r   r(   r   r   r"   r"   r#   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r3|jr3|jr3t 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"   r#   r     r   zceiling.__le__Nr   )rJ   rK   rL   rM   r0   rO   r&   r'   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r4   )  r   r4   c                 C  r   r   )r   r   r3   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 ]#}|js$tj| jr8t	|}|
tjs3||7 }q||7 }q||7 }q||}||}|tj|  S )Nr   rm   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/   r{   ComplexInfinityr3   )r6   rn   r5   r"   r#   _eval%  s   


zfrac.eval.<locals>._eval)ry   rn   r   r-   r   r.   r)   r*   r+   r   r,   )r5   r6   r   realimagr=   r8   r"   r   r#   r?   !  s   


z	frac.evalc                 K  r   r   r   r   r"   r"   r#   r   D  rF   zfrac._eval_rewrite_as_floorc                 K  r   r   r   r   r"   r"   r#   r   G  r   zfrac._eval_rewrite_as_ceilingc                 C     dS )NTr"   rC   r"   r"   r#   rE   J     zfrac._eval_is_finitec                 C  rA   rB   )r   is_extended_realrC   r"   r"   r#   rH   M  rF   zfrac._eval_is_realc                 C  rA   rB   )r   r)   rC   r"   r"   r#   _eval_is_imaginaryP  rF   zfrac._eval_is_imaginaryc                 C  rA   rB   )r   r    rC   r"   r"   r#   rI   S  rF   zfrac._eval_is_integerc                 C  s   t | jd j| jd jgS rB   )r
   r   rb   r    rC   r"   r"   r#   _eval_is_zeroV  s   zfrac._eval_is_zeroc                 C  r   )NFr"   rC   r"   r"   r#   r   Y  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   rD   r   resr"   r"   r#   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   r"   r"   r#   r   h  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   r"   r"   r#   r   t     
zfrac.__le__c                 C  r   r   )r   r   r   r   r   r   r   r   r"   r"   r#   r     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 )Nrs   )r   r/   r2   r   r   r   r    rc   r   r"   r"   r#   r     s   zfrac._value_one_or_morec           	      C  s   ddl m} | jd }||d}| |d}|jr6|jr4|j||d}|jr*tj	S || j
|||dS |S |tjtjtjfv rE|ddS |j
|||dS )Nr   rm   rt   rw   rs   )ry   rn   r   rz   r(   rb   rr   re   r   rf   r}   r   r   r   r~   r"   r"   r#   r     s   

zfrac._eval_as_leading_termr   c                 C  s   ddl m} | jd }||d}| |d}|jr=ddlm}	 |dkr-|d|df}
|
S |	dd||| |df }
|
S || j||||d}|jrb|j	||d}||j
r\tj7 }|S tj7 }|S ||7 }|S )Nr   r   rm   rs   rw   rt   )r   r   r   rz   r   ry   rn   r   rb   rr   re   r   rf   r-   )rD   r!   r   rx   ru   r   r6   r   r>   rn   r   r   r   r"   r"   r#   r     s&   
zfrac._eval_nseriesNr   )rJ   rK   rL   rM   rO   r?   r   r   rE   rH   r   rI   r   r   r   r   r   r   r   r   r   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   r3   r4   r   r   )r   r   r   r"   r"   r#   r     s   
N))
__future__r   sympy.core.basicr   sympy.core.exprr   
sympy.corer   r   sympy.core.evalfr   r   sympy.core.functionr	   sympy.core.logicr
   r   sympy.core.numbersr   r   sympy.core.relationalr   r   r   r   r   r   r   r   sympy.core.sympifyr   $sympy.functions.elementary.complexesr   r   sympy.multipledispatchr   r   r3   r   r4   r   r"   r"   r"   r#   <module>   s2    (L C
 C
 L