
    oVh                          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mZmZmZ d d	lmZ  G d
 de      Zy)   )Add)	gcd_terms)DefinedFunction)
NumberKind)	fuzzy_and	fuzzy_not)Mul)equal_valued)is_leis_ltis_geis_gt)Sc                   J    e Zd ZdZeZed        Zd Zd Z	d Z
d Zd Zd
dZy	)Modai  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                 
   d } ||      }||S t        ||       rB|j                  d   }|z  dk(  r | |j                  d         S ||z
  z  j                  r|S t        | |       rE| j                  d   }|z  dk(  r | | j                  d          S ||z   z  j                  rP|S t        |t              rg g fx}\  }}|j                  D ]   }	|t        |	|          j                  |	       " |rt        fd|D              rt	        | t	        |D 
cg c]  }
|
j                  d    c}
 z   } | |      S t        |t              rg g fx}\  }}|j                  D ]   }	|t        |	|          j                  |	       " |rt        fd|D              rt        d |j                  D              rj                  r|D cg c]  } | |       }}g }g }|D ]>  }t        ||       r|j                  |j                  d          .|j                  |       @ t        | }t        | }t        |D 
cg c]  }
|
j                  d    c}
 }||z  }| | |      z  S j                  rzt        j                  urht        d |j                  D              rL|j                  D 
cg c]  }
|
j                  r|
z  n|
 }}
t        d |D              rt        j                  S t        ||z    }dd	lm} dd
lm} 	  ||      }t%        |d      s$|fD 
cg c]  }
t'        |
|z  dd       c}
\  }|}}|j(                  rg }|j                  D ]Q  }
 | |
      }|j+                  |       |
j+                  |       kD  r|j                  |
       A|j                  |       S |t-        |j                        k7  r~t	        | }nu|j/                         \  }}j/                         \  }d}|j0                  r|j0                  s)||z  }t%        |d      r||z  }|t3        ||z        z  }d}|s
||z  }|z  |j5                         r(j5                         r||fD 
cg c]  }
|
  c}
\  }} ||      }|||z  S |j6                  rt%        |d      r||z  } | |d      S |j8                  rf|j                  d   j6                  rMt%        |j                  d   d      r4|j                  d   |z  }t        j:                  |j                  dd        }| | ||f||fk7        z  S c c}
w c c}w c c}
w c c}
w c c}
w # |$ r t        j                  }Y 0w xY wc c}
w )Nc                    |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 s| || fv s| j                  r|dk(  rt        j
                  S |j                  rN| j                  r| |z  S |dk(  r8| j                  rt        j
                  S | j                  rt        j                  S t        | d      r t        | d      |      }||S | |z  }|j                  rt        j
                  S 	 t        |      }t        |t              r| ||z  z
  }||z  dk  dk(  r||z  }|S |j                   rt"        t$        }}n|j&                  rt(        t*        }}nyd	|z  }| |z
  }t-        d
      D ]"  } |||       s y |||      r| |z
  c S ||z  }$ y# t        $ r Y yw xY w)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
isinstance	TypeErroris_positiver   r   is_negativer   r   range)	pqrvrdcomp1comp2ls_s	            >/home/dcms/DCMS/lib/python3.12/site-packages/sympy/core/mod.pynumber_evalzMod.eval.<locals>.number_eval9   s   
 yy'(899AEEzQ!%%Z1;;%+?1;;RWCWuuAFF{aAr7lq||Qvv{{;;Q3J6yy vv uuq+&,WQ,Q/>I !A||vv	F a%QqSB1qT)aI }}$eu$euABAA1X R|B<r6Ma'  s    G# #	G/.G/r   r   c              3   B   K   | ]  }|j                   d    k(    ywr   Nargs.0innerr,   s     r4   	<genexpr>zMod.eval.<locals>.<genexpr>        CEUZZ]a/C   c              3   B   K   | ]  }|j                   d    k(    ywr7   r8   r:   s     r4   r=   zMod.eval.<locals>.<genexpr>   r>   r?   c              3   4   K   | ]  }|j                     y wNr   r;   ts     r4   r=   zMod.eval.<locals>.<genexpr>   s     Ki]^ALLKi   c              3   4   K   | ]  }|j                     y wrB   rC   rD   s     r4   r=   zMod.eval.<locals>.<genexpr>   s     4q||4rF   c              3   @   K   | ]  }|t         j                  u   y wrB   )r   r   )r;   iqs     r4   r=   zMod.eval.<locals>.<genexpr>   s     <B2<<s   )PolynomialError)gcdF)clearfractionT)evaluate)r&   r9   is_nonnegativeis_nonpositiver   appendallr	   r   
is_Integerr   r"   anyr   sympy.polys.polyerrorsrJ   sympy.polys.polytoolsrK   r
   r   is_Addcountlistas_coeff_Mulis_Rationalr%   could_extract_minus_signis_Floatis_Mul
_from_args)clsr+   r,   r5   r-   qinnerboth_l	non_mod_lmod_larginetxmodnon_modjprod_modprod_non_mod	prod_mod1rJ   rK   Gpwasqwasr9   acpcqokr.   s     `                           r4   evalzMod.eval7   sW   8	t A>I aVVAYFzQ166!9a((!f*%55C bYYq\FzQaRIIaL=!,,!f*%553(*B.F%Yvv 9z#s+,33C89 CUCC9o-GAaffQi-G(HH3{"3(*B.F%Yvv 9z#s+,33C89 CUCCKibcbhbhKiHinonznz09:1SAY:	:" *A!!S)

166!9-q)	*
 9"G}U!;!&&)!;<	(#CQK//||4QVV44GHvv N!!,,QA!= NI N<)<< vvi%')A 	;-	Aq	A1%"#Q) "!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$%q!9-ar-GAq! A>a4K ::,q!,FAq!e,,XX!&&),,affQi1Kq	!Aqvvabz*AQQFtTl$:;;;} .H ; "< !O) 	A	H .sB   "U
U
U7UU (U U 5
U:U U76U7c                     | j                   \  }}t        |j                  |j                  t        |j                        g      ryy )NT)r9   r   r   r   r   )selfr+   r,   s      r4   _eval_is_integerzMod._eval_is_integer   s8    yy1allALL)AII2FGH I    c                 8    | j                   d   j                  ryy Nr   T)r9   r(   rx   s    r4   _eval_is_nonnegativezMod._eval_is_nonnegative       99Q<## $rz   c                 8    | j                   d   j                  ryy r|   )r9   r)   r}   s    r4   _eval_is_nonpositivezMod._eval_is_nonpositive   r   rz   c                 0    ddl m} || |||z        z  z
  S )Nr   floor)#sympy.functions.elementary.integersr   )rx   rr   bkwargsr   s        r4   _eval_rewrite_as_floorzMod._eval_rewrite_as_floor   s    =1U1Q3Z<rz   c                 T    ddl m} | j                  |      j                  |||      S Nr   r   )logxcdir)r   r   rewrite_eval_as_leading_term)rx   rh   r   r   r   s        r4   r   zMod._eval_as_leading_term   s&    =||E"88D8QQrz   c                 V    ddl m} | j                  |      j                  ||||      S r   )r   r   r   _eval_nseries)rx   rh   nr   r   r   s         r4   r   zMod._eval_nseries  s(    =||E"00ADt0LLrz   N)r   )__name__
__module____qualname____doc__r   kindclassmethodrv   ry   r~   r   r   r   r    rz   r4   r   r      sD    &P Ds< s<j
 RMrz   r   N)addr   	exprtoolsr   functionr   r   r   logicr   r   mulr	   numbersr
   
relationalr   r   r   r   	singletonr   r   r   rz   r4   <module>r      s3       %  '  ! 2 2 xM/ xMrz   