
    wg                      ~    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
e      Zy)   )Add)	gcd_terms)Function)
NumberKind)	fuzzy_and	fuzzy_not)Mul)equal_valued)Sc                   L    e Zd ZdZeZed        Zd Zd Z	d Z
d Zd
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                 8   |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 t!        |       }t#        d      D ]~  }|t!        |      z  }|j$                  s|j&                  r$| j&                  r||z   c S | j$                  r5| c S |j$                  r$| j&                  r|c S | j$                  r| |z   c S  y y# t        $ r Y w 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absrangeis_negativeis_positive)pqrvrd_s         S/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/core/mod.pynumber_evalzMod.eval.<locals>.number_eval8   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 AA1X SV==}}==#$q5L]]$%2I==#$H]]$%26M  s    H 	HHr   r   c              3   B   K   | ]  }|j                   d    k(    ywr   Nargs.0innerr'   s     r,   	<genexpr>zMod.eval.<locals>.<genexpr>        CEUZZ]a/C   c              3   B   K   | ]  }|j                   d    k(    ywr/   r0   r2   s     r,   r5   zMod.eval.<locals>.<genexpr>   r6   r7   c              3   4   K   | ]  }|j                     y wNr   r3   ts     r,   r5   zMod.eval.<locals>.<genexpr>   s     Ki]^ALLKi   c              3   4   K   | ]  }|j                     y wr:   r;   r<   s     r,   r5   zMod.eval.<locals>.<genexpr>   s     4q||4r>   c              3   @   K   | ]  }|t         j                  u   y wr:   )r   r   )r3   iqs     r,   r5   zMod.eval.<locals>.<genexpr>   s     <B2<<s   )PolynomialError)gcdF)clearfractionT)evaluate)r    r1   is_nonnegativeis_nonpositiver   appendallr	   r   
is_Integerr   r   anyr   sympy.polys.polyerrorsrB   sympy.polys.polytoolsrC   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_mod1rB   rC   Gpwasqwasr1   acpcqokr)   s     `                           r,   evalzMod.eval6   sW   9	v 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)r1   r   r   r   r   )selfr&   r'   s      r,   _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)r1   r%   rp   s    r,   _eval_is_nonnegativezMod._eval_is_nonnegative       99Q<## $rr   c                 8    | j                   d   j                  ryy rt   )r1   r$   ru   s    r,   _eval_is_nonpositivezMod._eval_is_nonpositive   rw   rr   c                 0    ddl m} || |||z        z  z
  S )Nr   floor)#sympy.functions.elementary.integersr|   )rp   rj   bkwargsr|   s        r,   _eval_rewrite_as_floorzMod._eval_rewrite_as_floor   s    =1U1Q3Z<rr   Nc                 T    ddl m} | j                  |      j                  |||      S Nr   r{   )logxcdir)r}   r|   rewrite_eval_as_leading_term)rp   r`   r   r   r|   s        r,   r   zMod._eval_as_leading_term   s&    =||E"88D8QQrr   c                 V    ddl m} | j                  |      j                  ||||      S r   )r}   r|   r   _eval_nseries)rp   r`   nr   r   r|   s         r,   r   zMod._eval_nseries  s(    =||E"00ADt0LLrr   )Nr   )r   )__name__
__module____qualname____doc__r   kindclassmethodrn   rq   rv   ry   r   r   r    rr   r,   r   r      sD    &P Dt< t<l
 RMrr   r   N)addr   	exprtoolsr   functionr   r   r   logicr   r   mulr	   numbersr
   	singletonr   r   r   rr   r,   <module>r      s-         '  ! yM( yMrr   