a
    {d<                     @   sx   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 d dlmZ G d	d
 d
eZdS )   )Add	gcd_terms)Function)
NumberKind)	fuzzy_and	fuzzy_not)Mul)equal_valued)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 |rd|jd }| dkrN|jd S ||  jr`|S nt | r| jd }| dkr| jd  S ||  jr|S nt |tr4g g f }\}}|jD ]}	|t |	 |	 q|rhtfdd|D rht| tdd |D   }
|
S n4t |trhg g f }\}}|jD ]}	|t |	 |	 qV|r6tfd	d|D r6td
d |jD r6jr6fdd|D }g }g }|D ].}t |r||jd  n
|| 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} z4|| t ds fdd|fD \}W n |y   t
j Y n0 | }}|jrDg }|jD ]<}|}||kr|| n
|| q|t|jkrt| }nr| \}} \}d}|jrp|js|| }t|dr |9  |t|| 9 }d}|s|| }| | r rdd  |fD \ }||}|d ur |  S  jr*t dr*| 9 }|ddS  jrt jd jrtt jd drt jd | }t jdd    ||f||fkd S )Nc                 S   s  |j rtd| tju s6|tju s6| jdu s6|jdu r<tjS | tju sb| || fv sb| jrh|dkrhtjS |jr| jr|| | S |dkr| jrtjS | j	rtj
S t| drt| d|}|dur|S | | }|jrtjS zt|}W n ty   Y n80 t|tr*| ||  }|| dk dkr&||7 }|S t| }tdD ]~}|t|8 }|jr:|jr| jrn||   S | jr|   S n.|jr| jr|  S | jr| |   S  qq:d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      Z	_eval_ModN    T)is_zeroZeroDivisionErrorr   NaN	is_finiteZero
is_integerZ	is_NumberZis_evenZis_oddOnehasattrgetattrint	TypeError
isinstanceabsrangeis_negativeis_positive)pqrvrd_ r%   W/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/sympy/core/mod.pynumber_eval,   sZ    (&
zMod.eval.<locals>.number_evalr   r   c                 3   s   | ]}|j d   kV  qdS r   Nargs.0innerr    r%   r&   	<genexpr>       zMod.eval.<locals>.<genexpr>c                 S   s   g | ]}|j d  qS r   r)   r,   ir%   r%   r&   
<listcomp>   r0   zMod.eval.<locals>.<listcomp>c                 3   s   | ]}|j d   kV  qdS r(   r)   r+   r.   r%   r&   r/      r0   c                 s   s   | ]}|j V  qd S )N)r   )r,   tr%   r%   r&   r/      r0   c                    s   g | ]} |qS r%   r%   )r,   x)clsr    r%   r&   r4      r0   c                 S   s   g | ]}|j d  qS r1   r)   r2   r%   r%   r&   r4      r0   c                    s,   g | ]$}|j r$|  tjur$|  n|qS r%   )
is_Integerr   r   r2   r.   r%   r&   r4      s   )PolynomialError)gcdc                    s   g | ]}t |  d d dqS )F)clearfractionr   r2   )Gr%   r&   r4      s   FTc                 S   s   g | ]
}| qS r%   r%   r2   r%   r%   r&   r4      r0   )evaluate)r   r*   Zis_nonnegativeZis_nonpositiver   appendallr	   r   r8   r   r   Zsympy.polys.polyerrorsr9   Zsympy.polys.polytoolsr:   r
   Zis_AddcountlistZas_coeff_MulZis_Rationalr   Zcould_extract_minus_signZis_FloatZis_MulZ
_from_args)r7   r   r    r'   r!   ZqinnerZboth_lZ	non_mod_lZmod_largnetmodZnon_modjZprod_modZprod_non_modZ	prod_mod1r9   r:   ZpwasZqwasr*   r3   acpZcqokr"   r%   )r=   r7   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   s   | j d jrdS d S Nr   T)r*   r   rK   r%   r%   r&   _eval_is_nonnegative   s    zMod._eval_is_nonnegativec                 C   s   | j d jrdS d S rM   )r*   r   rN   r%   r%   r&   _eval_is_nonpositive   s    zMod._eval_is_nonpositivec                 K   s    ddl m} |||||   S )Nr   )floor)Z#sympy.functions.elementary.integersrQ   )rK   rG   bkwargsrQ   r%   r%   r&   _eval_rewrite_as_floor   s    zMod._eval_rewrite_as_floorN)__name__
__module____qualname____doc__r   kindclassmethodrJ   rL   rO   rP   rT   r%   r%   r%   r&   r      s   
 5r   N)addr   Z	exprtoolsr   functionr   rY   r   Zlogicr   r   mulr	   Znumbersr
   Z	singletonr   r   r%   r%   r%   r&   <module>   s   