a
    t@8bô  ã                   @   sz   d Z ddlmZmZmZ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
d„ ZdS )z1Implementation of :class:`ModularInteger` class. é    )ÚAnyÚDictÚTupleÚTypeN)Ú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   úAlib/python3.9/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   s8   t || ƒr|jS z| j |¡W S  ty2   Y d S 0 d S r   )r   r   r   r   r   )ÚclsÚotherr   r   r   Ú_get_val:   s    
zModularInteger._get_valc                 C   s*   |   |¡}|d u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 u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 ur"|  | j| ¡S tS d S r   r(   r*   r   r   r   Ú__mul__Z   s    
zModularInteger.__mul__c                 C   s
   |   |¡S r   )r1   r-   r   r   r   Ú__rmul__b   s    zModularInteger.__rmul__c                 C   s0   |   |¡}|d u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   )Úinvertr1   r-   r   r   r   Ú__rtruediv__m   s    zModularInteger.__rtruediv__c                 C   s*   |   |¡}|d ur"|  | j| ¡S tS d S r   r(   r*   r   r   r   Ú__mod__p   s    
zModularInteger.__mod__c                 C   s*   |   |¡}|d u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   Zoner5   r   Úpowr   r   )r   Zexpr   r   r   r   Ú__pow__€   s    zModularInteger.__pow__c                 C   s,   |   |¡}|d u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   r5   r   )r%   Úvaluer   r   r   r3   ¨   s    zModularInteger._invertc                 C   s   |   |  | j¡¡S r   )r   r3   r   r   r   r   r   r5   ¬   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/   r0   r1   r2   r4   r6   r7   r8   r:   r<   r?   rA   rC   rE   rG   rI   rK   r3   r5   r   r   r   r   r
      sH   	
	
r
   c                    s¬   zˆ   ˆ¡‰W n ty$   d}Y n0 d}|r6ˆdk rBtdˆ ƒ‚ˆˆ ˆf}zt| }W nN ty¦   G ‡ ‡‡‡fdd„dtƒ}ˆrdˆ |_n
dˆ |_|t|< Y n0 |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   Ú
ValueErrorÚ_modular_integer_cacheÚKeyErrorr
   r   )rU   rT   rV   r   ÚokÚkeyr%   r   rS   r   ÚModularIntegerFactory±   s"    


r\   )rO   Útypingr   r   ZtDictr   ZtTupler   r=   Zsympy.polys.polyutilsr   Zsympy.polys.polyerrorsr   Z!sympy.polys.domains.domainelementr   Zsympy.utilitiesr	   r
   rX   r\   r   r   r   r   Ú<module>   s    !