
    Цi                      ~    S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	J
r
  S SKJr  S SKJr  S SKJr   " S	 S
\5      rg)   )Add)	gcd_terms)Function)
NumberKind)	fuzzy_and	fuzzy_not)Mul)equal_valued)Sc                   X    \ rS rSrSr\r\S 5       rS r	S r
S rS rSS	 jrSS
 jrSrg)Mod   a  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.

Many objects can be evaluated modulo ``n`` much faster than they can be
evaluated directly (or at all).  For this, ``evaluate=False`` is
necessary to prevent eager evaluation:

>>> from sympy import binomial, factorial, Mod, Pow
>>> Mod(Pow(2, 10**16, evaluate=False), 97)
61
>>> Mod(factorial(10**9, evaluate=False), 10**9 + 9)
712524808
>>> Mod(binomial(10**18, 10**12, evaluate=False), (10**5 + 3)**2)
3744312326

Examples
========

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

c           	      R  ^ S nU" UT5      nUb  U$ [        X5      (       aI  UR                  S   nUT-  S:X  a  U " UR                  S   T5      $ UTU-
  -  R                  (       a  U$ GO[        U* U 5      (       aL  U* R                  S   nUT-  S:X  a  U " U* R                  S   * T5      $ UTU-   -  R                  (       a  U$ GO[        U[        5      (       a  / / 4=nu  pxUR                   H   n	U[        X5         R                  U	5        M"     U(       aQ  [        U4S jU 5       5      (       a7  [	        U6 [	        U V
s/ s H  oR                  S   PM     sn
6 -   nU " UT5      $ GO[        U[        5      (       Ga  / / 4=nu  pxUR                   H   n	U[        X5         R                  U	5        M"     U(       a  [        U4S jU 5       5      (       a  [        S UR                   5       5      (       a  TR                  (       a  U Vs/ s H  o" UT5      PM     nn/ n/ nU HD  n[        X5      (       a   UR                  UR                  S   5        M3  UR                  U5        MF     [        U6 n[        U6 n[        U V
s/ s H  oR                  S   PM     sn
6 nUU-  nUU " UT5      -  $ TR                  (       a  T[        R                  Lay  [        S UR                   5       5      (       aX  UR                   V
s/ s H  oR                  (       a  U
T-  OU
PM     nn
[        S U 5       5      (       a  [        R                  $ [        Xx-   6 nSS	KJn  SS
KJn   U" UT5      n[%        US5      (       d$  UT4 V
s/ s H  n
['        U
U-  SSS9PM     sn
u  nmUTnnUR(                  (       a  / nUR                   HT  n
U " U
T5      nUR+                  U 5      U
R+                  U 5      :  a  UR                  U
5        MC  UR                  U5        MV     U[-        UR                  5      :w  a  [	        U6 nOUR/                  5       u  nnTR/                  5       u  nmSnUR0                  (       a  UR0                  (       d.  UU-  n[%        US5      (       a  UU-  nU[3        UU-  5      -  nSnU(       d
  UU-  nUT-  mUR5                  5       (       a/  TR5                  5       (       a  UUT4 V
s/ s H  o* PM     sn
u  nnmU" UT5      nUb  UU-  $ UR6                  (       a  [%        US5      (       a  UU-  nU " UTSS9$ UR8                  (       aq  UR                  S   R6                  (       aS  [%        UR                  S   S5      (       a5  UR                  S   U-  n[        R:                  " UR                  SS  5      nUU " UTUT4UU4:g  S9-  $ s  sn
f s  snf s  sn
f s  sn
f s  sn
f ! U a    [        R                  n GNpf = fs  sn
f )Nc                    UR                   (       a  [        S5      eU [        R                  L d1  U[        R                  L d  U R                  SL d  UR                  SL a  [        R                  $ U [        R
                  L d  XU* 4;   d  U R                  (       a  US:X  a  [        R
                  $ UR                  (       a]  U R                  (       a  X-  $ US:X  aB  U R                  (       a  [        R
                  $ U R                  (       a  [        R                  $ [        U S5      (       a  [        U S5      " U5      nUb  U$ X-  nUR                  (       a  [        R
                  $  [        U5      n[        U[        5      (       a  XU-  -
  nX!-  S:  S:X  a  X!-  nU$  [!        U 5      n[#        S5       H  nU[!        U5      -  nUR$                  (       d  M$  UR&                  (       a.  U R&                  (       a  XA-   s  $ U R$                  (       a  U* s  $ O?UR$                  (       a.  U R&                  (       a  Us  $ U R$                  (       a  U* U-   s  $   g   g! [         a     Nf = f)	zUTry 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
isinstance	TypeErrorabsrangeis_negativeis_positive)pqrvrd_s         M/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/sympy/core/mod.pynumber_evalMod.eval.<locals>.number_eval8   s   
 yy'(899AEEzQ!%%Z1;;%+?1;;RWCWuuAFF{ar7lq||Qvv{{;;3J6yy vv uuq+&&Q,Q/>I A||vv	F a%%qSBqT)I	 & AA1XSV===}}==#$5L]]$%2I +==#$H]]$%26M   s   /I% %
I21I2r   r   c              3   F   >#    U  H  oR                   S    T:H  v   M     g7fr   Nargs.0innerr(   s     r-   	<genexpr>Mod.eval.<locals>.<genexpr>        CUEZZ]a/U   !c              3   F   >#    U  H  oR                   S    T:H  v   M     g7fr1   r2   r4   s     r-   r7   r8      r9   r:   c              3   8   #    U  H  oR                   v   M     g 7fNr   r5   ts     r-   r7   r8      s     Kibh]^LLbh   c              3   8   #    U  H  oR                   v   M     g 7fr=   r>   r?   s     r-   r7   r8      s     4V||VrA   c              3   D   #    U  H  o[         R                  L v   M     g 7fr=   )r   r   )r5   iqs     r-   r7   r8      s     <)B<)s    )PolynomialError)gcdF)clearfractionT)evaluate)r!   r3   is_nonnegativeis_nonpositiver   appendallr	   r   
is_Integerr   r   anyr   sympy.polys.polyerrorsrE   sympy.polys.polytoolsrF   r
   r   is_Addcountlistas_coeff_Mulis_Rationalr    could_extract_minus_signis_Floatis_Mul
_from_args)clsr'   r(   r.   r)   qinnerboth_l	non_mod_lmod_larginetxmodnon_modjprod_modprod_non_mod	prod_mod1rE   rF   Gpwasqwasr3   acpcqokr*   s     `                           r-   evalMod.eval6   s   9	v A>I aVVAYFzQ166!9a((!f*%55 6 C  bYYq\FzQaRIIaL=!,,!f*%55 6 3(*B.F%Yvvz#+,33C8  CUCCC9o-GAffQi-G(HH3{"3(*B.F%Yvvz#+,33C8  CUCCCKibcbhbhKiHiHinonznz09:	1SAY		:"A!!))

166!9-q)	 #
 9"G}U!;U&&)U!;<	(#CQK//||4QVV444GHvv Nv!,,QA!=vI N<)<<< vvi')A 	;-	Aq	A1%%"#Q)!'A "!A#UUC!')1 d 88DVV1I773<!''#,.KKNKKN  tAFF|#J NN$EBNN$EBB>>G1%%GARUOABqDqD %%''A,F,F,H,H$%q!9-9ar9-GAq! A>a4K ::,q!,,FAq!e,,XX!&&),,affQi1K1Kq	!Aqvvabz*AQQFtTl$:;;;} .H ; "< !O) 	A	H .sB   W.
W3W8!W=2 X X*X X$X X! X!c                     U R                   u  p[        UR                  UR                  [        UR                  5      /5      (       a  gg )NT)r3   r   r   r   r   )selfr'   r(   s      r-   _eval_is_integerMod._eval_is_integer   s9    yyallALL)AII2FGHH I    c                 B    U R                   S   R                  (       a  gg Nr   T)r3   r&   rt   s    r-   _eval_is_nonnegativeMod._eval_is_nonnegative       99Q<## $rw   c                 B    U R                   S   R                  (       a  gg ry   )r3   r%   rz   s    r-   _eval_is_nonpositiveMod._eval_is_nonpositive   r}   rw   c                 ,    SSK Jn  XU" X-  5      -  -
  $ )Nr   floor)#sympy.functions.elementary.integersr   )rt   rm   bkwargsr   s        r-   _eval_rewrite_as_floorMod._eval_rewrite_as_floor   s    =U13Z<rw   Nc                 L    SSK Jn  U R                  U5      R                  XUS9$ Nr   r   )logxcdir)r   r   rewrite_eval_as_leading_term)rt   rc   r   r   r   s        r-   r   Mod._eval_as_leading_term   s$    =||E"88D8QQrw   c                 L    SSK Jn  U R                  U5      R                  XX4S9$ r   )r   r   r   _eval_nseries)rt   rc   nr   r   r   s         r-   r   Mod._eval_nseries  s$    =||E"00D0LLrw    )Nr   )r   )__name__
__module____qualname____firstlineno____doc__r   kindclassmethodrq   ru   r{   r   r   r   r   __static_attributes__r   rw   r-   r   r      sD    &P Dt< t<l
 RMrw   r   N)addr   	exprtoolsr   functionr   r   r   logicr   r   mulr	   numbersr
   	singletonr   r   r   rw   r-   <module>r      s-         '  ! yM( yMrw   