o
    *ήc                     @   sl   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lmZ G dd	 d	eZd
S )   )Add	gcd_terms)Function)
NumberKind)	fuzzy_and	fuzzy_not)Mul)Sc                   @   s@   e Zd ZdZeZedd Zdd Zdd Z	dd	 Z
d
d ZdS )Moda  Represents a modulo operation on symbolic expressions.

    Parameters
    ==========

    p : Expr
        Dividend.

    q : Expr
        Divisor.

    Notes
    =====

    The convention used is the same as Python's: the remainder always has the
    same sign as the divisor.

    Examples
    ========

    >>> from sympy.abc import x, y
    >>> x**2 % y
    Mod(x**2, y)
    >>> _.subs({x: 5, y: 6})
    1

    c                    s\  dd }||}|d ur|S t |r1|jd }| dkr'|jd S ||  jr0|S nt | rW| jd }| dkrM| jd  S ||  jrV|S nt |trg g f }\}}|jD ]}	|t |	 |	 qg|rtfdd|D rt| tdd |D   }
|
S nt |trg g f }\}}|jD ]}	|t |	 |	 q|rtfd	d|D rfd
d|D }g }g }|D ]}t |r||jd  q|| qt| }t| }tdd |D  }|| }
||
 S jrt	j
urfdd|D }t||  }ddlm} ddlm} z||  dkr@ fdd|fD \}W n |yN   t	j
 Y nw |}}|jrg }|jD ]}|}||krv|| q]|| q]|t|jkrt| }n8| \}} \}d}|jr|js|| }|dkr |9  |t|| 9 }d}|s|| }| | rو rdd  |fD \ }||}|d ur|  S  jr dkr| 9 }|ddS  jr jd jr jd dkr jd | }t jdd    ||f||fkd S )Nc                 S   s  |j rtd| tju s|tju s| jdu s|jdu rtjS | tju s1| || fv s1| jr4|dkr4tjS |jrN| jr>| | S |dkrN| jrHtjS | j	rNtj
S t| dr`t| d|}|dur`|S | | }|jrjtjS zt|}W n	 tyy   Y nw t|tr| ||  }|| dk dkr||7 }|S t| }tdD ]9}|t|8 }|jr|jr| jr||   S | jr|   S  dS |jr| jr|  S | jr| |   S  dS qdS )	zmTry to return p % q if both are numbers or +/-p is known
            to be less than or equal q.
            zModulo by zeroFr      	_eval_ModN    T)is_zeroZeroDivisionErrorr
   NaN	is_finiteZero
is_integer	is_Numberis_evenis_oddOnehasattrgetattrint	TypeError
isinstanceabsrangeis_negativeis_positive)pqrvrd_ r(   5/tmp/pip-target-vg8gfxp4/lib/python/sympy/core/mod.pynumber_eval+   sb   (&


zMod.eval.<locals>.number_evalr   r   c                 3       | ]
}|j d   kV  qdS r   Nargs.0innerr#   r(   r)   	<genexpr>       zMod.eval.<locals>.<genexpr>c                 S      g | ]}|j d  qS r   r-   r0   ir(   r(   r)   
<listcomp>       zMod.eval.<locals>.<listcomp>c                 3   r+   r,   r-   r/   r2   r(   r)   r3      r4   c                    s   g | ]} |qS r(   r(   )r0   x)clsr#   r(   r)   r9      r:   c                 S   r5   r6   r-   r7   r(   r(   r)   r9      r:   c                    s,   g | ]}|j r|  tjur|  n|qS r(   )
is_Integerr
   r   r7   r2   r(   r)   r9      s    $)PolynomialError)gcdc                    s   g | ]}t |  d d dqS )F)clearfractionr   r7   )Gr(   r)   r9      s    FTc                 S   s   g | ]}| qS r(   r(   r7   r(   r(   r)   r9      s    )evaluate)r   r.   is_nonnegativeis_nonpositiver   appendallr	   r=   r
   r   sympy.polys.polyerrorsr>   sympy.polys.polytoolsr?   is_Addcountlistas_coeff_Mulis_Rationalr   could_extract_minus_signis_Floatis_Mul
_from_args)r<   r"   r#   r*   r$   qinnerboth_l	non_mod_lmod_largnetmodnon_modjprod_modprod_non_mod	prod_mod1r>   r?   pwasqwasr.   r8   acpcqokr%   r(   )rB   r<   r#   r)   eval)   s   
;


















&zMod.evalc                 C   s*   | j \}}t|j|jt|jgrdS d S )NT)r.   r   r   r   r   )selfr"   r#   r(   r(   r)   _eval_is_integer   s   
zMod._eval_is_integerc                 C      | j d jrdS d S Nr   T)r.   r!   rf   r(   r(   r)   _eval_is_nonnegative      zMod._eval_is_nonnegativec                 C   rh   ri   )r.   r    rj   r(   r(   r)   _eval_is_nonpositive   rl   zMod._eval_is_nonpositivec                 K   s    ddl m} |||||   S )Nr   )floor)#sympy.functions.elementary.integersrn   )rf   ra   bkwargsrn   r(   r(   r)   _eval_rewrite_as_floor   s   zMod._eval_rewrite_as_floorN)__name__
__module____qualname____doc__r   kindclassmethodre   rg   rk   rm   rr   r(   r(   r(   r)   r   
   s    
 5r   N)addr   	exprtoolsr   functionr   rw   r   logicr   r   mulr	   	singletonr
   r   r(   r(   r(   r)   <module>   s    