o
    +< iš  ã                   @  s   U d Z ddlmZ ddlmZ ddlZ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 eG d
d„ deeƒƒZi Zded< dd„ ZdS )z1Implementation of :class:`ModularInteger` class. é    )Úannotations)ÚAnyN)ÚPicklableWithSlots)ÚCoercionFailed)ÚDomainElement)Úpublic)Úsympy_deprecation_warningc                   @  s0  e Zd ZdZd\ZZZZdZdd„ Z	dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Z d2d3„ Z!d4d5„ Z"d6d7„ Z#d8d9„ Z$d:d;„ Z%d<d=„ Z&d>d?„ Z'd@dA„ Z(edBdC„ ƒZ)dDdE„ Z*dFS )GÚModularIntegerz(A class representing a modular integer. )NNNN)Úvalc                 C  ó   | j S ©N)Ú_parent©Úself© r   ú]/home/app/PyTorch/.pytorch/lib/python3.10/site-packages/sympy/polys/domains/modularinteger.pyÚparent   ó   zModularInteger.parentc                 C  s6   t || jƒr|j| j | _d S | j |¡| j | _d S r   )Ú
isinstanceÚ	__class__r
   ÚmodÚdomÚconvert)r   r
   r   r   r   Ú__init__   s   zModularInteger.__init__c                 C  r   r   )r   r   r   r   r   Úmodulus    r   zModularInteger.modulusc                 C  s   t | j| jfƒS r   )Úhashr
   r   r   r   r   r   Ú__hash__#   ó   zModularInteger.__hash__c                 C  s   d| j j| jf S )Nz%s(%s))r   Ú__name__r
   r   r   r   r   Ú__repr__&   ó   zModularInteger.__repr__c                 C  s   d| j | jf S )Nz	%s mod %s)r
   r   r   r   r   r   Ú__str__)   r   zModularInteger.__str__c                 C  ó
   t | jƒS r   )Úintr
   r   r   r   r   Ú__int__,   ó   
zModularInteger.__int__c                 C  s<   t dddd | jr| j| jd kr| jS | j| j S | jS )NzModularInteger.to_int() is deprecated.

            Use int(a) or K = GF(p) and K.to_int(a) instead of a.to_int().
            ú1.13zmodularinteger-to-int)Údeprecated_since_versionÚactive_deprecations_targeté   )r   Úsymr
   r   r   r   r   r   Úto_int/   s   ú	zModularInteger.to_intc                 C  s   | S r   r   r   r   r   r   Ú__pos__B   s   zModularInteger.__pos__c                 C  s   |   | j ¡S r   )r   r
   r   r   r   r   Ú__neg__E   ó   zModularInteger.__neg__c                 C  s4   t || ƒr|jS z| j |¡W S  ty   Y d S w r   )r   r
   r   r   r   )ÚclsÚotherr   r   r   Ú_get_valH   s   
ÿzModularInteger._get_valc                 C  s&   |   |¡}|d ur|  | j| ¡S tS r   ©r1   r   r
   ÚNotImplemented©r   r0   r
   r   r   r   Ú__add__R   ó   
zModularInteger.__add__c                 C  ó
   |   |¡S r   ©r5   ©r   r0   r   r   r   Ú__radd__Z   r%   zModularInteger.__radd__c                 C  s&   |   |¡}|d ur|  | j| ¡S tS r   r2   r4   r   r   r   Ú__sub__]   r6   zModularInteger.__sub__c                 C  s   |    |¡S r   r8   r9   r   r   r   Ú__rsub__e   s   zModularInteger.__rsub__c                 C  s&   |   |¡}|d ur|  | j| ¡S tS r   r2   r4   r   r   r   Ú__mul__h   r6   zModularInteger.__mul__c                 C  r7   r   )r=   r9   r   r   r   Ú__rmul__p   r%   zModularInteger.__rmul__c                 C  s,   |   |¡}|d ur|  | j|  |¡ ¡S tS r   )r1   r   r
   Ú_invertr3   r4   r   r   r   Ú__truediv__s   s   
zModularInteger.__truediv__c                 C  s   |   ¡  |¡S r   )Úinvertr=   r9   r   r   r   Ú__rtruediv__{   r.   zModularInteger.__rtruediv__c                 C  s&   |   |¡}|d ur|  | j| ¡S tS r   r2   r4   r   r   r   Ú__mod__~   r6   zModularInteger.__mod__c                 C  s&   |   |¡}|d ur|  || j ¡S tS r   r2   r4   r   r   r   Ú__rmod__†   r6   zModularInteger.__rmod__c                 C  sL   |s	|   | jj¡S |dk r|  ¡ j| }}n| j}|   t|t|ƒ| jƒ¡S )Nr   )r   r   ÚonerA   r
   Úpowr#   r   )r   Úexpr
   r   r   r   Ú__pow__Ž   s   zModularInteger.__pow__c                 C  s(   |   |¡}|d u rtS || j|| j ƒS r   )r1   r3   r
   r   ©r   r0   Úopr
   r   r   r   Ú_compare™   s   
zModularInteger._comparec                 C  s8   |   |¡}|d u rtS tddddd || j|| j ƒS )Nz~Ordered comparisons with modular integers are deprecated.

            Use e.g. int(a) < int(b) instead of a < b.
            r&   zmodularinteger-compareé   )r'   r(   Ú
stacklevel)r1   r3   r   r
   r   rI   r   r   r   Ú_compare_deprecated¡   s   
ù
z"ModularInteger._compare_deprecatedc                 C  ó   |   |tj¡S r   )rK   ÚoperatorÚeqr9   r   r   r   Ú__eq__³   r.   zModularInteger.__eq__c                 C  rO   r   )rK   rP   Úner9   r   r   r   Ú__ne__¶   r.   zModularInteger.__ne__c                 C  rO   r   )rN   rP   Últr9   r   r   r   Ú__lt__¹   r.   zModularInteger.__lt__c                 C  rO   r   )rN   rP   Úler9   r   r   r   Ú__le__¼   r.   zModularInteger.__le__c                 C  rO   r   )rN   rP   Úgtr9   r   r   r   Ú__gt__¿   r.   zModularInteger.__gt__c                 C  rO   r   )rN   rP   Úger9   r   r   r   Ú__ge__Â   r.   zModularInteger.__ge__c                 C  r"   r   )Úboolr
   r   r   r   r   Ú__bool__Å   r%   zModularInteger.__bool__c                 C  s   | j  || j¡S r   )r   rA   r   )r/   Úvaluer   r   r   r?   È   s   zModularInteger._invertc                 C  s   |   |  | j¡¡S r   )r   r?   r
   r   r   r   r   rA   Ì   r    zModularInteger.invertN)+r   Ú
__module__Ú__qualname__Ú__doc__r   r   r*   r   Ú	__slots__r   r   r   r   r   r!   r$   r+   r,   r-   Úclassmethodr1   r5   r:   r;   r<   r=   r>   r@   rB   rC   rD   rH   rK   rN   rR   rT   rV   rX   rZ   r\   r^   r?   rA   r   r   r   r   r	      sN    
	
r	   z0dict[tuple[Any, Any, Any], type[ModularInteger]]Ú_modular_integer_cachec                   s¬   zˆ   ˆ¡‰W n ty   d}Y nw d}|rˆdk r!tdˆ ƒ‚ˆˆ ˆf}zt| }W |S  tyU   G ‡ ‡‡‡fdd„dtƒ}ˆrIdˆ |_ndˆ |_|t|< Y |S w )	z1Create custom class for specific integer modulus.FTé   z*modulus must be a positive integer, got %sc                      s    e Zd Z”” ”ZZZ”ZdS )z"ModularIntegerFactory.<locals>.clsN)r   r`   ra   r   r   r*   r   r   ©Ú_domÚ_modÚ_symr   r   r   r/   â   s    r/   zSymmetricModularIntegerMod%szModularIntegerMod%s)r   r   Ú
ValueErrorre   ÚKeyErrorr	   r   )ri   rh   rj   r   ÚokÚkeyr/   r   rg   r   ÚModularIntegerFactoryÑ   s(   ÿ

ô

ôro   )rb   Ú
__future__r   Útypingr   rP   Zsympy.polys.polyutilsr   Zsympy.polys.polyerrorsr   Z!sympy.polys.domains.domainelementr   Zsympy.utilitiesr   Zsympy.utilities.exceptionsr   r	   re   Ú__annotations__ro   r   r   r   r   Ú<module>   s     @