o
    Ìn~bD+  ã                   @   s0   d dl mZ ddlmZmZ G dd„ deƒZdS )é   )ÚIntegerBaseé    )Úlong_to_bytesÚbytes_to_longc                   @   s¬  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dfd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eZd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zdgd.d/„Zdgd0d1„Zd2d3„ Zdgd4d5„Zd6d7„ Zd8d9„ Z d:d;„ Z!d<d=„ Z"d>d?„ Z#d@dA„ Z$dBdC„ Z%dDdE„ Z&dFdG„ Z'dHdI„ Z(dJdK„ Z)dLdM„ Z*dNdO„ Z+dPdQ„ Z,dRdS„ Z-dTdU„ Z.dVdW„ Z/dXdY„ Z0dZd[„ Z1d\d]„ Z2d^d_„ Z3d`da„ Z4dbdc„ Z5e6ddde„ ƒZ7d-S )hÚIntegerNativez3A class to model a natural integer (including zero)c                 C   s<   t |tƒr	tdƒ‚z|j| _W d S  ty   || _Y d S w )Nz-A floating point type is not a natural number)Ú
isinstanceÚfloatÚ
ValueErrorÚ_valueÚAttributeError)ÚselfÚvalue© r   úI/usr/local/lib/python3.10/dist-packages/Cryptodome/Math/_IntegerNative.pyÚ__init__'   s   
ÿzIntegerNative.__init__c                 C   s   | j S ©N©r
   ©r   r   r   r   Ú__int__0   s   zIntegerNative.__int__c                 C   s   t t| ƒƒS r   )ÚstrÚintr   r   r   r   Ú__str__3   ó   zIntegerNative.__str__c                 C   s   dt | ƒ S )NzInteger(%s))r   r   r   r   r   Ú__repr__6   r   zIntegerNative.__repr__c                 C   ó
   t | jƒS r   )Úhexr
   r   r   r   r   Ú__hex__:   ó   
zIntegerNative.__hex__c                 C   r   r   ©r   r
   r   r   r   r   Ú	__index__>   r   zIntegerNative.__index__r   c                 C   sF   | j dk r	tdƒ‚t| j |ƒ}t|ƒ|  krdkr!tdƒ‚ |S |S )Nr   ú.Conversion only valid for non-negative numberszValue too large to encode)r
   r	   r   Úlen)r   Ú
block_sizeÚresultr   r   r   Úto_bytesA   s   
ÿzIntegerNative.to_bytesc                 C   s   | t |ƒƒS r   )r   )ÚclsZbyte_stringr   r   r   Ú
from_bytesI   s   zIntegerNative.from_bytesc                 C   s   |d u rdS | j t|ƒkS )NF©r
   r   ©r   Útermr   r   r   Ú__eq__N   s   zIntegerNative.__eq__c                 C   ó   |   |¡ S r   )r*   r(   r   r   r   Ú__ne__S   r   zIntegerNative.__ne__c                 C   s   | j t|ƒk S r   r'   r(   r   r   r   Ú__lt__V   ó   zIntegerNative.__lt__c                 C   s   |   |¡p	|  |¡S r   )r-   r*   r(   r   r   r   Ú__le__Y   ó   zIntegerNative.__le__c                 C   r+   r   )r/   r(   r   r   r   Ú__gt__\   r   zIntegerNative.__gt__c                 C   r+   r   )r-   r(   r   r   r   Ú__ge___   r   zIntegerNative.__ge__c                 C   s
   | j dkS ©Nr   r   r   r   r   r   Ú__nonzero__b   r   zIntegerNative.__nonzero__c                 C   s
   | j dk S r3   r   r   r   r   r   Úis_negativef   r   zIntegerNative.is_negativec              
   C   s4   z|   | jt|ƒ ¡W S  tttfy   t Y S w r   ©Ú	__class__r
   r   r	   r   Ú	TypeErrorÚNotImplementedr(   r   r   r   Ú__add__j   ó
   ÿzIntegerNative.__add__c              
   C   s4   z|   | jt|ƒ ¡W S  tttfy   t Y S w r   r6   r(   r   r   r   Ú__sub__p   r;   zIntegerNative.__sub__c              
   C   s4   z|   | jt|ƒ ¡W S  tttfy   t Y S w r   r6   )r   Úfactorr   r   r   Ú__mul__v   r;   zIntegerNative.__mul__c                 C   s   |   | jt|ƒ ¡S r   ©r7   r
   r   )r   Údivisorr   r   r   Ú__floordiv__|   r0   zIntegerNative.__floordiv__c                 C   s(   t |ƒ}|dk rtdƒ‚|  | j| ¡S )Nr   úModulus must be positive)r   r	   r7   r
   )r   r@   Zdivisor_valuer   r   r   Ú__mod__   s   zIntegerNative.__mod__Nc                 C   sb   t |ƒ}|dk rtdƒ‚|d ur%t |ƒ}|dk rtdƒ‚|dkr$tdƒ‚nd }t| j||ƒ| _| S )Nr   zExponent must not be negativerB   úModulus cannot be zero)r   r	   ÚZeroDivisionErrorÚpowr
   )r   ÚexponentÚmodulusZ	exp_valueZ	mod_valuer   r   r   Úinplace_pow…   s   ÿzIntegerNative.inplace_powc                 C   s   |   | ¡}| ||¡S r   )r7   rI   )r   rG   rH   r#   r   r   r   Ú__pow__•   s   
zIntegerNative.__pow__c                 C   r   r   )Úabsr
   r   r   r   r   Ú__abs__™   r   zIntegerNative.__abs__c                 C   s‚   | j }|d u r,|dk rtdƒ‚|}|d d }||k r)|}|||  d }||k s|}n|dkr4tdƒ‚|  | | |¡}|  |¡S )Nr   zSquare root of negative valuer   é   rB   )r
   r	   Z_tonelli_shanksr7   )r   rH   r   ÚxÚyr#   r   r   r   Úsqrtœ   s   þ
zIntegerNative.sqrtc                 C   s   |  j t|ƒ7  _ | S r   r'   r(   r   r   r   Ú__iadd__±   ó   zIntegerNative.__iadd__c                 C   s   |  j t|ƒ8  _ | S r   r'   r(   r   r   r   Ú__isub__µ   rR   zIntegerNative.__isub__c                 C   s   |  j t|ƒ9  _ | S r   r'   r(   r   r   r   Ú__imul__¹   rR   zIntegerNative.__imul__c                 C   s:   t |ƒ}|dkrtdƒ‚|dk rtdƒ‚|  j|;  _| S )Nr   zDivision by zerorB   )r   rE   r	   r
   )r   r)   rH   r   r   r   Ú__imod__½   s   zIntegerNative.__imod__c                 C   s   |   | jt|ƒ@ ¡S r   r?   r(   r   r   r   Ú__and__Ç   r0   zIntegerNative.__and__c                 C   s   |   | jt|ƒB ¡S r   r?   r(   r   r   r   Ú__or__Ê   r0   zIntegerNative.__or__c                 C   s<   z|   | jt|ƒ? ¡W S  ty   | jdkrY dS Y dS w ©Nr   éÿÿÿÿ)r7   r
   r   ÚOverflowError©r   Úposr   r   r   Ú
__rshift__Í   s   
üzIntegerNative.__rshift__c                 C   s>   z|  j t|ƒL  _ W | S  ty   | j dkrY dS Y dS w rX   )r
   r   rZ   r[   r   r   r   Ú__irshift__Ö   s   û
üzIntegerNative.__irshift__c                 C   s.   z|   | jt|ƒ> ¡W S  ty   tdƒ‚w ©NzIncorrect shift count)r7   r
   r   rZ   r	   r[   r   r   r   Ú
__lshift__à   s
   ÿzIntegerNative.__lshift__c                 C   s0   z|  j t|ƒK  _ W | S  ty   tdƒ‚w r_   )r
   r   rZ   r	   r[   r   r   r   Ú__ilshift__æ   s   þÿzIntegerNative.__ilshift__c                 C   sŒ   | j dk r	tdƒ‚z0z| j |j ? d@ }|j dk rtdƒ‚W W |S  ty9   | j |? d@ }|dk r5tdƒ‚Y W |S w  tyE   d}Y |S w )Nr   z)no bit representation for negative valuesr   znegative bit count)r
   r	   r   rZ   )r   Únr#   r   r   r   Úget_bití   s(   

ÿúÿúþzIntegerNative.get_bitc                 C   s   | j d@ dkS )Nr   r   r   r   r   r   Úis_oddþ   r.   zIntegerNative.is_oddc                 C   s   | j d@ dkS )Nr   r   r   r   r   r   r   Úis_even  r.   zIntegerNative.is_evenc                 C   sF   | j dk r	tdƒ‚| j dkrdS d}| j }|r!|dL }|d7 }|s|S )Nr   r    r   )r
   r	   )r   Zbit_sizeÚtmpr   r   r   Úsize_in_bits  s   

þzIntegerNative.size_in_bitsc                 C   s   |   ¡ d d d S )Nr   é   )rg   r   r   r   r   Úsize_in_bytes  r0   zIntegerNative.size_in_bytesc                 C   sj   | j dk rdS | j dv rdS | j d }|d }|| j kr.|| j  d|  }|d }|| j ks| j |d kS )Nr   F)r   r   TrM   r   )r   rN   Zsquare_xr   r   r   Úis_perfect_square  s   




þzIntegerNative.is_perfect_squarec                 C   s   | j t|ƒ dkrtdƒ‚d S )Nr   zValue is composite)r
   r   r	   )r   Zsmall_primer   r   r   Úfail_if_divisible_by&  s   ÿz"IntegerNative.fail_if_divisible_byc                 C   s   |  j t|ƒt|ƒ 7  _ | S r   r'   )r   ÚaÚbr   r   r   Úmultiply_accumulate*  s   z!IntegerNative.multiply_accumulatec                 C   s   t |ƒ| _d S r   r   )r   Úsourcer   r   r   Úset.  r.   zIntegerNative.setc                 C   s²   t |ƒ}|dkrtdƒ‚|dk rtdƒ‚| j|}}d\}}|dkr<|| }||||  }}||||  }}|dks"|dkrHtdt|ƒ ƒ‚|dk rT||7 }|dk sL|| _| S )Nr   rD   zModulus cannot be negative)r   r   r   z No inverse value can be computed)r   rE   r	   r
   r   )r   rH   Úr_pÚr_nZs_pZs_nÚqr   r   r   Úinplace_inverse1  s&   ýÿzIntegerNative.inplace_inversec                 C   s   |   | ¡}| |¡ |S r   )r7   rt   )r   rH   r#   r   r   r   ÚinverseD  s   

zIntegerNative.inversec                 C   sL   t | jƒt t|ƒƒ}}|dkr!|| }||||  }}|dks|  |¡S r3   )rK   r
   r   r7   )r   r)   rq   rr   rs   r   r   r   ÚgcdI  s   þ
zIntegerNative.gcdc                 C   sD   t |ƒ}| jdks|dkr|  d¡S |  t| j| |  |¡j ƒ¡S r3   )r   r
   r7   rK   rv   r(   r   r   r   ÚlcmP  s   
 zIntegerNative.lcmc                 C   sê   t | ƒ} t |ƒ}|dkrtdƒ‚|d@ dkrtdƒ‚| | } | dks&|dkr(dS | dkr.dS d}| }|d@ dkrF|dL }|d7 }|d@ dks8|d@ dkrOd}n|d dv rXd}nd}|d d	kri|d d	kri| }|| }|t ||¡ S )
Nr   zn must be a positive integerr   z$n must be even for the Jacobi symbolrh   )r   é   rY   é   é   )r   r	   r   Újacobi_symbol)rl   rb   ÚeZa1ÚsZn1r   r   r   r{   V  s4   þzIntegerNative.jacobi_symbol)r   r   )8Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r$   Úclassmethodr&   r*   r,   r-   r/   r1   r2   r4   Ú__bool__r5   r:   r<   r>   rA   rC   rI   rJ   rL   rP   rQ   rS   rT   rU   rV   rW   r]   r^   r`   ra   rc   rd   re   rg   ri   rj   rk   rn   rp   rt   ru   rv   rw   Ústaticmethodr{   r   r   r   r   r   $   sl    	





	
r   N)Z_IntegerBaser   ZCryptodome.Util.numberr   r   r   r   r   r   r   Ú<module>   s   