Ë
    O/æjò   ã                   ó~   — 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        «      r…g g fx}\  }}|j                  D ]   }	|t        |	| «         j                  |	«       Œ" |�rt        ˆfd„|D «       «      �rît	        |Ž t	        |D �
cg c]  }
|
j                  d   ‘Œ c}
Ž z   } | |‰«      S t        |t        «      �r¨g g fx}\  }}|j                  D ]   }	|t        |	| «         j                  |	«       Œ" |rÝt        ˆfd„|D «       «      rÉt        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(                  rƒg }|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         úQ/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/sympy/core/mod.pyÚnumber_evalzMod.eval.<locals>.number_eval8   sÐ  € ð
 �yŠyÜ'Ð(8Ó9Ð9Ø”A—E‘E‰z˜Q¤!§%¡%™Z¨1¯;©;¸%Ñ+?À1Ç;Á;ÐRWÑCWÜ—u‘u�Ø”A—F‘F‰{˜a A¨ r 7™l¨q¯|ª|ÀÀQÂÜ—v‘v�à�{Š{Ø—;’;Ø˜Q™3�JØ˜’6Ø—y’yÜ Ÿv™v˜ØŸšÜ Ÿu™u˜ä�q˜+Ô&Ø,”W˜Q Ó,¨QÓ/�Ø�>Ø�Ið �!‘ˆAØ�|Š|Ü—v‘v�ð	Ü˜“F�ô ˜a¤Ô%Ø˜Q˜q™S™�BØ˜1™˜q™ TÒ)Ø˜a™˜Ø�Iô �A“ˆAÜ˜1“Xò �Ø”S˜“V‘�Ø—=“=Ø—}’}ØŸ=š=Ø#$ q¡5šLØŸ]š]Ø$% 2šIØŸšØŸ=š=Ø#$šHØŸ]š]Ø$% 2¨¡6šMÙñøô ò Ùðú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>Œ   ó   øè ø€ ÒC°E˜UŸZ™Z¨™]¨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Ð]^ÈAÏLÍLÑKiùó   ‚c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr:   r;   r<   s     r,   r5   zMod.eval.<locals>.<genexpr>§   s   è ø€ Ò4¨�q—|•|Ñ4ùr>   c              3   ó@   K  — | ]  }|t         j                  u –— Œ y ­wr:   )r   r   )r3   Úiqs     r,   r5   zMod.eval.<locals>.<genexpr>©   s   è ø€ Ò<¨B˜2¤§¡œ<Ñ<ù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˜ÔØ—V‘V˜A‘YˆFØ˜‰z˜QŠÙ˜1Ÿ6™6 !™9 aÓ(Ð(Ø˜!˜f™*Ñ%×5Ó5à�Ü˜˜˜CÔ Ø�b—Y‘Y˜q‘\ˆFØ˜‰z˜QŠÙ˜a˜RŸI™I a™L˜=¨!Ó,Ð,Ø˜!˜f™*Ñ%×5Ó5à�Ü˜œ3Ôà(*¨B¨Ð.ˆFÑ%�Y Ø—v‘vò 9�Ø”z # sÓ+Ñ,×3Ñ3°CÕ8ð9ò œÓC¸UÔCÕCÜ˜9�o¬ÀÖ-G¸A¨a¯f©f°Q«iÒ-GÐ(HÑH�Ù˜3 “{Ð"ä˜œ3Õà(*¨B¨Ð.ˆFÑ%�Y Ø—v‘vò 9�Ø”z # sÓ+Ñ,×3Ñ3°CÕ8ð9ñ œÓC¸UÔCÔCÌÑKiÐbc×bhÑbhÔKiÔHiÐno×nzÒnzà09Ö:¨1™S  A�YÐ:�	Ð:Ø�Ø�Ø"ò *�AÜ! ! SÔ)ØŸ
™
 1§6¡6¨!¡9Õ-àŸ™ qÕ)ð	*ô
  ˜9�Ü" G˜}�Ü°UÖ!;° !§&¡&¨£)Ò!;Ð<�	Ø Ñ(�Ø#¡C¨¨Q£KÑ/Ð/à�|Š| ¬¯©¡ÜÑ4¨Q¯V©VÔ4Ô4ØGHÇvÁvÖ NÀ!¨!¯,ª,  Q¢¸AÑ!=Ð N�IÐ NÜÑ<°)Ô<Ô<Ü Ÿv™v˜ä�i %Ñ'Ð)ˆAõ 	;Ý-ð	Ù�A�q“	ˆAÜ  1Ô%à"# Q ö)Øô " ! A¡#¨U¸UÖCò )‘��1ð ˜ˆdˆð �8Š8ØˆDØ—V‘Vò #�Ù˜˜1“I�Ø—7‘7˜3“< !§'¡'¨#£,Ò.Ø—K‘K •Nà—K‘K •Nð#ð ”t˜AŸF™F“|Ò#Ü˜�J‘ð —N‘NÓ$‰EˆB�Ø—N‘NÓ$‰EˆB�ØˆBØ—>’>¨¯ªØ˜‘G�Ü  1Ô%Ø˜‘G�AØœ˜R ™U›‘O�AØ�BÙØ�q‘D�Ø�q‘D�ð ×%Ñ%Ô'¨A×,FÑ,FÔ,HØ$% q¨! 9Ö-˜a˜’rÒ-‰GˆAˆq�!ñ ˜˜AÓˆØˆ>Ø�a‘4ˆKð �:Š:œ, q¨!Ô,Ø�‰FˆAÙ�q˜! eÔ,Ð,Ø�XŠX˜!Ÿ&™& ™)×,Ò,´¸a¿f¹fÀQ¹iÈÔ1KØ—‘�q‘	˜!‘ˆAÜ—‘˜qŸv™v a b˜zÓ*ˆAØ‘�Q˜ Q¨ F¨t°T¨lÑ$:Ô;Ñ;Ð;ùò} .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   € Ø�y‰y‰ˆˆ1Ü�a—l‘l A§L¡L´)¸A¿I¹IÓ2FÐ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ò   ó   € Ø�9‰9�Q‰<×#Ò#Øð $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   € Ý=Ø�1‘U˜1˜Q™3“Z‘<ÑÐ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°°A¸DÀtÐ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   