U
    	Ç-eæ  ã                   @  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 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)Úpublicc                   @  s   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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d.d/„ Zd0d1„ Z d2d3„ Z!d4d5„ Z"d6d7„ Z#d8d9„ Z$d:d;„ Z%d<d=„ Z&ed>d?„ ƒZ'd@dA„ Z(dBS )CÚModularIntegerz(A class representing a modular integer. )NNNN)Úvalc                 C  s   | j S ©N)Ú_parent©Úself© r   úc/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sympy/polys/domains/modularinteger.pyÚparent   s    zModularInteger.parentc                 C  s4   t || jƒr|j| j | _n| j |¡| j | _d S r
   )Ú
isinstanceÚ	__class__r	   ÚmodÚdomÚconvert)r   r	   r   r   r   Ú__init__   s    zModularInteger.__init__c                 C  s   t | j| jfƒS r
   )Úhashr	   r   r   r   r   r   Ú__hash__   s    zModularInteger.__hash__c                 C  s   d| j j| jf S )Nz%s(%s))r   Ú__name__r	   r   r   r   r   Ú__repr__"   s    zModularInteger.__repr__c                 C  s   d| j | jf S )Nz	%s mod %s)r	   r   r   r   r   r   Ú__str__%   s    zModularInteger.__str__c                 C  s   t |  ¡ ƒS r
   )ÚintÚto_intr   r   r   r   Ú__int__(   s    zModularInteger.__int__c                 C  s4   | j r*| j| jd kr| jS | j| j S n| jS d S )Né   )Úsymr	   r   r   r   r   r   r   +   s
    zModularInteger.to_intc                 C  s   | S r
   r   r   r   r   r   Ú__pos__4   s    zModularInteger.__pos__c                 C  s   |   | j ¡S r
   )r   r	   r   r   r   r   Ú__neg__7   s    zModularInteger.__neg__c                 C  s:   t || ƒr|jS z| j |¡W S  tk
r4   Y d S X d S r
   )r   r	   r   r   r   )ÚclsÚotherr   r   r   Ú_get_val:   s    
zModularInteger._get_valc                 C  s*   |   |¡}|d k	r"|  | j| ¡S tS d S r
   ©r%   r   r	   ÚNotImplemented©r   r$   r	   r   r   r   Ú__add__D   s    
zModularInteger.__add__c                 C  s
   |   |¡S r
   ©r)   ©r   r$   r   r   r   Ú__radd__L   s    zModularInteger.__radd__c                 C  s*   |   |¡}|d k	r"|  | j| ¡S tS d S r
   r&   r(   r   r   r   Ú__sub__O   s    
zModularInteger.__sub__c                 C  s   |    |¡S r
   r*   r+   r   r   r   Ú__rsub__W   s    zModularInteger.__rsub__c                 C  s*   |   |¡}|d k	r"|  | j| ¡S tS d S r
   r&   r(   r   r   r   Ú__mul__Z   s    
zModularInteger.__mul__c                 C  s
   |   |¡S r
   )r/   r+   r   r   r   Ú__rmul__b   s    zModularInteger.__rmul__c                 C  s0   |   |¡}|d k	r(|  | j|  |¡ ¡S tS d S r
   )r%   r   r	   Ú_invertr'   r(   r   r   r   Ú__truediv__e   s    
zModularInteger.__truediv__c                 C  s   |   ¡  |¡S r
   )Úinvertr/   r+   r   r   r   Ú__rtruediv__m   s    zModularInteger.__rtruediv__c                 C  s*   |   |¡}|d k	r"|  | j| ¡S tS d S r
   r&   r(   r   r   r   Ú__mod__p   s    
zModularInteger.__mod__c                 C  s*   |   |¡}|d k	r"|  || j ¡S tS d S r
   r&   r(   r   r   r   Ú__rmod__x   s    
zModularInteger.__rmod__c                 C  sL   |s|   | jj¡S |dk r.|  ¡ j|  }}n| j}|   t|t|ƒ| jƒ¡S )Nr   )r   r   Úoner3   r	   Úpowr   r   )r   Úexpr	   r   r   r   Ú__pow__€   s    zModularInteger.__pow__c                 C  s,   |   |¡}|d k	r$|| j|| j ƒS tS d S r
   )r%   r	   r   r'   )r   r$   Úopr	   r   r   r   Ú_compare‹   s    
zModularInteger._comparec                 C  s   |   |tj¡S r
   )r<   ÚoperatorÚeqr+   r   r   r   Ú__eq__“   s    zModularInteger.__eq__c                 C  s   |   |tj¡S r
   )r<   r=   Úner+   r   r   r   Ú__ne__–   s    zModularInteger.__ne__c                 C  s   |   |tj¡S r
   )r<   r=   Últr+   r   r   r   Ú__lt__™   s    zModularInteger.__lt__c                 C  s   |   |tj¡S r
   )r<   r=   Úler+   r   r   r   Ú__le__œ   s    zModularInteger.__le__c                 C  s   |   |tj¡S r
   )r<   r=   Úgtr+   r   r   r   Ú__gt__Ÿ   s    zModularInteger.__gt__c                 C  s   |   |tj¡S r
   )r<   r=   Úger+   r   r   r   Ú__ge__¢   s    zModularInteger.__ge__c                 C  s
   t | jƒS r
   )Úboolr	   r   r   r   r   Ú__bool__¥   s    zModularInteger.__bool__c                 C  s   | j  || j¡S r
   )r   r3   r   )r#   Úvaluer   r   r   r1   ¨   s    zModularInteger._invertc                 C  s   |   |  | j¡¡S r
   )r   r1   r	   r   r   r   r   r3   ¬   s    zModularInteger.invertN))r   Ú
__module__Ú__qualname__Ú__doc__r   r   r    r   Ú	__slots__r   r   r   r   r   r   r   r!   r"   Úclassmethodr%   r)   r,   r-   r.   r/   r0   r2   r4   r5   r6   r:   r<   r?   rA   rC   rE   rG   rI   rK   r1   r3   r   r   r   r   r      sH   	
	
r   z0dict[tuple[Any, Any, Any], type[ModularInteger]]Ú_modular_integer_cachec                   s°   zˆ   ˆ¡‰W n tk
r&   d}Y nX d}|r8ˆdk rDtdˆ ƒ‚ˆˆ ˆf}zt| }W nP tk
rª   G ‡ ‡‡‡fdd„dtƒ}ˆr”dˆ |_n
dˆ |_|t|< Y nX |S )	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   rM   rN   r   r   r    r   r   ©Ú_domÚ_modÚ_symr   r   r   r#   Â   s   r#   zSymmetricModularIntegerMod%szModularIntegerMod%s)r   r   Ú
ValueErrorrR   ÚKeyErrorr   r   )rV   rU   rW   r   ÚokÚkeyr#   r   rT   r   ÚModularIntegerFactory±   s"    


r\   )rO   Ú
__future__r   Útypingr   r=   Zsympy.polys.polyutilsr   Zsympy.polys.polyerrorsr   Z!sympy.polys.domains.domainelementr   Zsympy.utilitiesr   r   rR   Ú__annotations__r\   r   r   r   r   Ú<module>   s    !