U
    9%e<                     @   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 k	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k	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 |k
r   t
j Y nX | }}|jrFg }|jD ]<}|}||kr|| n
|| q|t|jkrt| }nr| \}} \}d}|jrr|js|| }t|dr |9  |t|| 9 }d}|s|| }| | r rdd  |fD \ }||}|d k	r|  S  jr,t dr,| 9 }|ddS  jrv jd jrvt jd drv jd | }t jdd    ||f||fkd S )Nc                 S   s  |j rtd| tjks6|tjks6| jdks6|jdkr<tjS | tjksb| || fk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k	r|S | | }|jrtjS zt|}W n tk
r   Y n8X t|tr,| ||  }|| dk dkr(||7 }|S t| }tdD ]~}|t|8 }|jr<|jr| jrp||   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%   M/var/www/html/Darija-Ai-API/env/lib/python3.8/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>   s     zMod.eval.<locals>.<genexpr>c                 S   s   g | ]}|j d  qS r   r)   r,   ir%   r%   r&   
<listcomp>   s     zMod.eval.<locals>.<listcomp>c                 3   s   | ]}|j d   kV  qdS r(   r)   r+   r.   r%   r&   r/      s     c                 s   s   | ]}|j V  qd S )N)r   )r,   tr%   r%   r&   r/      s     c                    s   g | ]} |qS r%   r%   )r,   x)clsr    r%   r&   r3      s     c                 S   s   g | ]}|j d  qS r0   r)   r1   r%   r%   r&   r3      s     c                    s,   g | ]$}|j r$|  tjk	r$|  n|qS r%   )
is_Integerr   r   r1   r.   r%   r&   r3      s   )PolynomialError)gcdc                    s   g | ]}t |  d d dqS )F)clearfractionr   r1   )Gr%   r&   r3      s   FTc                 S   s   g | ]
}| qS r%   r%   r1   r%   r%   r&   r3      s     )evaluate)r   r*   Zis_nonnegativeZis_nonpositiver   appendallr	   r   r7   r   r   Zsympy.polys.polyerrorsr8   Zsympy.polys.polytoolsr9   r
   Zis_AddcountlistZas_coeff_MulZis_Rationalr   Zcould_extract_minus_signZis_FloatZis_MulZ
_from_args)r6   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_mod1r8   r9   ZpwasZqwasr*   r2   acpZcqokr"   r%   )r<   r6   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   rJ   r%   r%   r&   _eval_is_nonnegative   s    zMod._eval_is_nonnegativec                 C   s   | j d jrdS d S rL   )r*   r   rM   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.integersrP   )rJ   rF   bkwargsrP   r%   r%   r&   _eval_rewrite_as_floor   s    zMod._eval_rewrite_as_floorN)__name__
__module____qualname____doc__r   kindclassmethodrI   rK   rN   rO   rS   r%   r%   r%   r&   r      s   
 5r   N)addr   Z	exprtoolsr   functionr   rX   r   Zlogicr   r   mulr	   numbersr
   Z	singletonr   r   r%   r%   r%   r&   <module>   s   