§
    «³Ùgò   ã                   ó†   — 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dS )é   )ÚAdd©Ú	gcd_terms)ÚFunction)Ú
NumberKind)Ú	fuzzy_andÚ	fuzzy_not)ÚMul)Úequal_valued)ÚSc                   óT   — 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dS )Ú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          |‰ ¦  «        r>|j        d         }|‰z  dk    r ‰ |j        d         ‰¦  «        S |‰|z
  z  j        r|S �n�t          | ‰ ¦  «        rA| j        d         }|‰z  dk    r ‰ | j        d          ‰¦  «        S |‰|z   z  j        r|S �n;t          |t          ¦  «        r„g g fx}\  }}|j        D ]+}	|t          |	‰ ¦  «                                      |	¦  «         Œ,|rDt          ˆfd„|D ¦   «         ¦  «        r)t	          |Ž t	          d„ |D ¦   «         Ž z   }
 ‰ |
‰¦  «        S �n¢t          |t          ¦  «        �rŒg g fx}\  }}|j        D ]+}	|t          |	‰ ¦  «                                      |	¦  «         Œ,|r×t          ˆfd„|D ¦   «         ¦  «        r¼t          d„ |j        D ¦   «         ¦  «        rž‰j        r—ˆ ˆfd„|D ¦   «         }g }g }|D ]H}t          |‰ ¦  «        r!|                     |j        d         ¦  «         Œ3|                     |¦  «         ŒIt          |Ž }t          |Ž }t          d	„ |D ¦   «         Ž }||z  }
| ‰ |
‰¦  «        z  S ‰j	        rd‰t          j        urVt          d
„ |j        D ¦   «         ¦  «        r8ˆfd„|j        D ¦   «         }t          d„ |D ¦   «         ¦  «        rt          j        S t          ||z   Ž }ddlm} ddlm} 	  ||‰¦  «        Št%          ‰d¦  «        sˆfd„|‰fD ¦   «         \  }Šn# |$ r t          j        ŠY nw xY w|‰}}|j        r‘g }|j        D ]e} ‰ |‰¦  «        }|                     ‰ ¦  «        |                     ‰ ¦  «        k    r|                     |¦  «         ŒP|                     |¦  «         Œf|t+          |j        ¦  «        k    r	t	          |Ž }n{|                     ¦   «         \  }}‰                     ¦   «         \  }Šd}|j        r|j        s1||z  }t%          |d¦  «        r‰|z  Š|t1          ||z  ¦  «        z  }d}|s
||z  }|‰z  Š|                     ¦   «         r'‰                     ¦   «         rd„ ‰|‰fD ¦   «         \  Š}Š ||‰¦  «        }|�|‰z  S ‰j        r#t%          ‰d¦  «        r|‰z  } ‰ |‰d¬¦  «        S ‰j        r^‰j        d         j        rLt%          ‰j        d         d¦  «        r1‰j        d         |z  }t          j        ‰j        dd …         ¦  «        Š‰ ‰ |‰|‰f||fk    ¬¦  «        z  S )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        r8| j        r| |z  S |dk    r&| 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 n# t          $ r Y nw xY wt!          | ¦  «        }t#          d¦  «        D ]a}|t!          |¦  «        z  }|j        rF|j        r| j        r||z   c S | j        r| c S n!|j        r| j        r|c S | j        r| |z   c S  dS ŒbdS )	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         úD/granary/edev/quantum/lib/python3.11/site-packages/sympy/core/mod.pyÚnumber_evalzMod.eval.<locals>.number_eval8   sT  € ð
 Œyð :Ý'Ð(8Ñ9Ô9Ð9Ø•A”Eˆzˆz˜Q¥!¤%˜Z˜Z¨1¬;¸%Ð+?Ð+?À1Ä;ÐRWÐCWÐCWÝ”u�Ø•A”Fˆ{ˆ{˜a A¨ r 7˜l˜l¨q¬|˜lÀÀQÂÀÝ”v�àŒ{ð %Ø”;ð Ø˜Q™3�JØ˜’6�6Ø”yð %Ý œv˜Øœð %Ý œu˜å�q˜+Ñ&Ô&ð Ø,•W˜Q Ñ,Ô,¨QÑ/Ô/�Ø�>Ø�Ið �!‘ˆAØŒ|ð Ý”v�ð	Ý˜‘F”F�õ ˜a¥Ñ%Ô%ð Ø˜Q˜q™S™�BØ˜1™˜qš TÒ)Ð)Ø˜a™˜Ø�Ið	øõ ð ð ð Ø�ðøøøõ �A‘”ˆAÝ˜1‘X”Xð ð �Ø•S˜‘V”V‘�Ø”=ð Ø”}ð 	*Øœ=ð &Ø#$ q¡5˜L˜L˜LØœ]ð &Ø$% 2˜I˜I˜Ið&àœð *Øœ=ð *Ø#$˜H˜H˜HØœ]ð *Ø$% 2¨¡6˜M˜M˜MØ�E�Eððð s   ÄE Å
EÅEr   r   c              3   ó:   •K  — | ]}|j         d          ‰k    V — ŒdS ©r   N©Úargs©Ú.0Úinnerr(   s     €r-   ú	<genexpr>zMod.eval.<locals>.<genexpr>Œ   ó.   øè è € ÐCÐC°E˜UœZ¨œ]¨aÒ/ÐCÐCÐCÐCÐCÐCó    c                 ó(   — g | ]}|j         d          ‘ŒS ©r   r1   ©r4   Úis     r-   ú
<listcomp>zMod.eval.<locals>.<listcomp>�   s   € Ð-GÐ-GÐ-G¸A¨a¬f°Q¬iÐ-GÐ-GÐ-Gr8   c              3   ó:   •K  — | ]}|j         d          ‰k    V — ŒdS r0   r1   r3   s     €r-   r6   zMod.eval.<locals>.<genexpr>–   r7   r8   c              3   ó$   K  — | ]}|j         V — Œd S ©N©r   ©r4   Úts     r-   r6   zMod.eval.<locals>.<genexpr>–   s%   è è € ÐKiÐKiÐ]^ÈAÌLÐKiÐKiÐKiÐKiÐKiÐKir8   c                 ó(   •— g | ]} ‰|‰¦  «        ‘ŒS © rE   )r4   ÚxÚclsr(   s     €€r-   r=   zMod.eval.<locals>.<listcomp>˜   s#   ø€ Ð:Ð:Ð:¨1˜S˜S  A™YœYÐ:Ð:Ð:r8   c                 ó(   — g | ]}|j         d          ‘ŒS r:   r1   r;   s     r-   r=   zMod.eval.<locals>.<listcomp>¢   s   € Ð!;Ð!;Ð!;° !¤&¨¤)Ð!;Ð!;Ð!;r8   c              3   ó$   K  — | ]}|j         V — Œd S r@   rA   rB   s     r-   r6   zMod.eval.<locals>.<genexpr>§   s$   è è € Ð4Ð4¨�q”|Ð4Ð4Ð4Ð4Ð4Ð4r8   c                 ó,   •— g | ]}|j         r|‰z  n|‘ŒS rE   )Ú
is_Integer)r4   r<   r(   s     €r-   r=   zMod.eval.<locals>.<listcomp>¨   s(   ø€ Ð NÐ NÐ NÀ!¨!¬,Ð!=  Q¡ ¸AÐ NÐ NÐ Nr8   c              3   ó2   K  — | ]}|t           j        u V — Œd S r@   )r   r   )r4   Úiqs     r-   r6   zMod.eval.<locals>.<genexpr>©   s(   è è € Ð<Ð<¨B˜2¥¤˜<Ð<Ð<Ð<Ð<Ð<Ð<r8   )ÚPolynomialError)Úgcdc                 ó:   •— g | ]}t          |‰z  d d ¬¦  «        ‘ŒS )F)ÚclearÚfractionr   )r4   r<   ÚGs     €r-   r=   zMod.eval.<locals>.<listcomp>·   s<   ø€ ð )ð )ð )Øõ " ! A¡#¨U¸UÐCÑCÔCð )ð )ð )r8   FTc                 ó   — g | ]}| ‘ŒS rE   rE   r;   s     r-   r=   zMod.eval.<locals>.<listcomp>Ý   s   € Ð-Ð-Ð-˜a˜�rÐ-Ð-Ð-r8   )Úevaluate)r!   r2   Úis_nonnegativeÚis_nonpositiver   ÚappendÚallr
   r   rK   r   r   Úanyr   Úsympy.polys.polyerrorsrN   Úsympy.polys.polytoolsrO   r   Úis_AddÚcountÚlistÚas_coeff_MulÚis_Rationalr    Úcould_extract_minus_signÚis_FloatÚis_MulÚ
_from_args)rG   r'   r(   r.   r)   ÚqinnerÚboth_lÚ	non_mod_lÚmod_lÚargÚnetÚmodÚnon_modÚjÚprod_modÚprod_non_modÚ	prod_mod1rN   rO   ÚpwasÚqwasr2   r<   ÚaÚcpÚcqÚokr*   rS   s   ` `                         @r-   ÚevalzMod.eval6   s¯  øøø€ ð9	ð 9	ð 9	ðv ˆ[˜˜AÑÔˆØˆ>ØˆIõ �a˜ÑÔð 4	*Ø”V˜A”YˆFØ˜‰z˜QŠˆØ�s˜1œ6 !œ9 aÑ(Ô(Ð(Ø˜!˜f™*Ñ%Ô5ð à�ñõ ˜˜˜CÑ Ô ð -	*Ø�b”Y˜q”\ˆFØ˜‰z˜QŠˆØ�s˜a˜RœI aœL˜=¨!Ñ,Ô,Ð,Ø˜!˜f™*Ñ%Ô5ð à�ñõ ˜�3ÑÔð &	*à(*¨B¨Ð.ˆFÑ%�Y Ø”vð 9ð 9�Ø•z # sÑ+Ô+Ô,×3Ò3°CÑ8Ô8Ð8Ð8àð #�ÐCÐCÐCÐC¸UÐCÑCÔCÑCÔCð #Ý˜9�o­Ð-GÐ-GÀÐ-GÑ-GÔ-GÐ(HÑH�Ø�s˜3 ‘{”{Ð"ùå˜�3ÑÔñ 	*à(*¨B¨Ð.ˆFÑ%�Y Ø”vð 9ð 9�Ø•z # sÑ+Ô+Ô,×3Ò3°CÑ8Ô8Ð8Ð8àð 0�ÐCÐCÐCÐC¸UÐCÑCÔCÑCÔCð 0ÍÐKiÐKiÐbcÔbhÐKiÑKiÔKiÑHiÔHið 0ÐnoÔnzð 0à:Ð:Ð:Ð:Ð:°	Ð:Ñ:Ô:�	Ø�Ø�Ø"ð *ð *�AÝ! ! SÑ)Ô)ð *ØŸ
š
 1¤6¨!¤9Ñ-Ô-Ð-Ð-àŸš qÑ)Ô)Ð)Ð)Ý ˜9�Ý" G˜}�ÝÐ!;Ð!;°UÐ!;Ñ!;Ô!;Ð<�	Ø Ñ(�Ø# C C¨¨Q¡K¤KÑ/Ð/àŒ|ð & ­¬  ÝÐ4Ð4¨Q¬VÐ4Ñ4Ô4Ñ4Ô4ð &Ø NÐ NÐ NÐ NÀqÄvÐ NÑ NÔ N�IÝÐ<Ð<°)Ð<Ñ<Ô<Ñ<Ô<ð &Ý œv˜å�i %Ñ'Ð)ˆAð 	;Ð:Ð:Ð:Ð:Ð:Ø-Ð-Ð-Ð-Ð-Ð-ð	Ø��A�q‘	”	ˆAÝ  1Ñ%Ô%ð )ð)ð )ð )ð )Ø"# Q ð)ñ )ô )‘��1øøàð 	ð 	ð 	Ý”ˆAˆAˆAð	øøøà˜ˆdˆð Œ8ð 	ØˆDØ”Vð #ð #�Ø�C˜˜1‘I”I�Ø—7’7˜3‘<”< !§'¢'¨#¡,¤,Ò.Ð.Ø—K’K ‘N”N�N�Nà—K’K ‘N”N�N�NØ•t˜Aœ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Ô,Hð 	.Ø-Ð- A q¨! 9Ð-Ñ-Ô-‰GˆAˆq�!ð ˆ[˜˜AÑÔˆØˆ>Ø�a‘4ˆKð Œ:ð 	+�, q¨!Ñ,Ô,ð 	+Ø�‰FˆAØ�3�q˜! eÐ,Ñ,Ô,Ð,ØŒXð 	+˜!œ& œ)Ô,ð 	+µ¸a¼fÀQ¼iÈÑ1KÔ1Kð 	+Ø”�q”	˜!‘ˆAÝ”˜qœv a b bœzÑ*Ô*ˆAØ���Q˜ Q¨ F¨t°T¨lÒ$:Ð;Ñ;Ô;Ñ;Ð;s   Ë?/L/ Ì/MÍMc                 óz   — | j         \  }}t          |j        |j        t          |j        ¦  «        g¦  «        rdS d S )NT)r2   r   r   r	   r   )Úselfr'   r(   s      r-   Ú_eval_is_integerzMod._eval_is_integerí   sA   € ØŒy‰ˆˆ1Ý�a”l A¤Lµ)¸A¼IÑ2FÔ2FÐGÑHÔHð 	Ø�4ð	ð 	r8   c                 ó.   — | j         d         j        rdS d S ©Nr   T)r2   r&   ©rz   s    r-   Ú_eval_is_nonnegativezMod._eval_is_nonnegativeò   ó"   € ØŒ9�QŒ<Ô#ð 	Ø�4ð	ð 	r8   c                 ó.   — | j         d         j        rdS d S r}   )r2   r%   r~   s    r-   Ú_eval_is_nonpositivezMod._eval_is_nonpositiveö   r€   r8   c                 ó6   — ddl m} || |||z  ¦  «        z  z
  S )Nr   ©Úfloor)Ú#sympy.functions.elementary.integersr…   )rz   rt   ÚbÚkwargsr…   s        r-   Ú_eval_rewrite_as_floorzMod._eval_rewrite_as_floorú   s/   € Ø=Ð=Ð=Ð=Ð=Ð=Ø�1�U�U˜1˜Q™3‘Z”Z‘<ÑÐr8   Nr   c                 ód   — ddl m} |                      |¦  «                             |||¬¦  «        S ©Nr   r„   )ÚlogxÚcdir)r†   r…   ÚrewriteÚ_eval_as_leading_term)rz   rF   rŒ   r�   r…   s        r-   r�   zMod._eval_as_leading_termþ   s;   € Ø=Ð=Ð=Ð=Ð=Ð=Ø�|Š|˜EÑ"Ô"×8Ò8¸ÀÈDÐ8ÑQÔQÐQr8   c                 óf   — ddl m} |                      |¦  «                             ||||¬¦  «        S r‹   )r†   r…   rŽ   Ú_eval_nseries)rz   rF   ÚnrŒ   r�   r…   s         r-   r‘   zMod._eval_nseries  s=   € Ø=Ð=Ð=Ð=Ð=Ð=Ø�|Š|˜EÑ"Ô"×0Ò0°°A¸DÀtÐ0ÑLÔLÐLr8   )Nr   r:   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚkindÚclassmethodrx   r{   r   r‚   r‰   r�   r‘   rE   r8   r-   r   r      s±   € € € € € ð&ð &ðP €Dàðt<ð t<ñ „[ðt<ðlð ð ð
ð ð ðð ð ð ð  ð  ðRð Rð Rð RðMð Mð Mð Mð Mð Mr8   r   N)Úaddr   Ú	exprtoolsr   Úfunctionr   r—   r   Úlogicr   r	   Úmulr
   Únumbersr   Ú	singletonr   r   rE   r8   r-   ú<module>r       sã   ðØ Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð ðyMð yMð yMð yMð yMˆ(ñ yMô yMð yMð yMð yMr8   