
    \h                          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JrJrJr  S S	KJr   " S
 S\5      rg)   )Add)	gcd_terms)DefinedFunction)
NumberKind)	fuzzy_and	fuzzy_not)Mul)equal_valued)is_leis_ltis_geis_gt)Sc                   T    \ rS rSrSr\r\S 5       rS r	S r
S rS rS 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                 j   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R                   (       a  ["        [$        peOUR&                  (       a  [(        [*        peOgS	U-  nX-
  n[-        S
5       H)  nU" Xp5      (       d    gU" X75      (       a  X-
  s  $ Xq-  nM+     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is_positiver   r   is_negativer   r   range)	pqrvrdcomp1comp2ls_s	            F/var/www/auris/envauris/lib/python3.13/site-packages/sympy/core/mod.pynumber_evalMod.eval.<locals>.number_eval9   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	 & }}$eu$euABA1XR||<<6M '  s   /H% %
H21H2r   r   c              3   F   >#    U  H  oR                   S    T:H  v   M     g7fr   Nargs.0innerr-   s     r5   	<genexpr>Mod.eval.<locals>.<genexpr>        CUEZZ]a/U   !c              3   F   >#    U  H  oR                   S    T:H  v   M     g7fr9   r:   r<   s     r5   r?   r@      rA   rB   c              3   8   #    U  H  oR                   v   M     g 7fNr   r=   ts     r5   r?   r@      s     Kibh]^LLbh   c              3   8   #    U  H  oR                   v   M     g 7frE   rF   rG   s     r5   r?   r@      s     4V||VrI   c              3   D   #    U  H  o[         R                  L v   M     g 7frE   )r   r   )r=   iqs     r5   r?   r@      s     <)B<)s    )PolynomialError)gcdF)clearfractionT)evaluate)r'   r;   is_nonnegativeis_nonpositiver   appendallr	   r   
is_Integerr   r#   anyr   sympy.polys.polyerrorsrM   sympy.polys.polytoolsrN   r
   r   is_Addcountlistas_coeff_Mulis_Rationalr&   could_extract_minus_signis_Floatis_Mul
_from_args)clsr,   r-   r6   r.   qinnerboth_l	non_mod_lmod_larginetxmodnon_modjprod_modprod_non_mod	prod_mod1rM   rN   Gpwasqwasr;   acpcqokr/   s     `                           r5   evalMod.eval7   s   8	t 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)r;   r   r   r   r   )selfr,   r-   s      r5   _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)r;   r)   r|   s    r5   _eval_is_nonnegativeMod._eval_is_nonnegative       99Q<## $r   c                 B    U R                   S   R                  (       a  gg r   )r;   r*   r   s    r5   _eval_is_nonpositiveMod._eval_is_nonpositive   r   r   c                 ,    SSK Jn  XU" X-  5      -  -
  $ )Nr   floor)#sympy.functions.elementary.integersr   )r|   ru   bkwargsr   s        r5   _eval_rewrite_as_floorMod._eval_rewrite_as_floor   s    =U13Z<r   c                 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)r|   rk   r   r   r   s        r5   r   Mod._eval_as_leading_term   s$    =||E"88D8QQr   c                 L    SSK Jn  U R                  U5      R                  XX4S9$ r   )r   r   r   _eval_nseries)r|   rk   nr   r   r   s         r5   r   Mod._eval_nseries  s$    =||E"00D0LLr    N)r   )__name__
__module____qualname____firstlineno____doc__r   kindclassmethodry   r}   r   r   r   r   r   __static_attributes__r   r   r5   r   r      sD    &P Ds< s<j
 RMr   r   N)addr   	exprtoolsr   functionr   r   r   logicr   r   mulr	   numbersr
   
relationalr   r   r   r   	singletonr   r   r   r   r5   <module>r      s3       %  '  ! 2 2 xM/ xMr   