U
    Š¾úg@,  ã                   @   s8   d dl mZ ddlmZmZmZmZ G dd„ deƒZdS )é   )ÚIntegerBaseé    )Úlong_to_bytesÚbytes_to_longÚinverseÚGCDc                   @   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	didd„Z
edjd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dkd/d0„Zdld1d2„Zd3d4„ Zdmd5d6„Zd7d8„ Zd9d:„ Z d;d<„ Z!d=d>„ Z"d?d@„ Z#dAdB„ Z$dCdD„ Z%dEdF„ Z&dGdH„ Z'dIdJ„ Z(dKdL„ Z)dMdN„ Z*dOdP„ Z+dQdR„ Z,dSdT„ Z-dUdV„ Z.dWdX„ Z/dYdZ„ Z0d[d\„ Z1d]d^„ Z2d_d`„ Z3dadb„ Z4dcdd„ Z5e6dedf„ ƒZ7e6dgdh„ ƒZ8d.S )nÚIntegerNativez3A class to model a natural integer (including zero)c                 C   s>   t |tƒrtdƒ‚z|j| _W n tk
r8   || _Y nX d S )Nz-A floating point type is not a natural number)Ú
isinstanceÚfloatÚ
ValueErrorÚ_valueÚAttributeError)ÚselfÚvalue© r   úB/tmp/pip-unpacked-wheel-_q8s9isk/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   s    zIntegerNative.__str__c                 C   s   dt | ƒ S )NzInteger(%s))r   r   r   r   r   Ú__repr__6   s    zIntegerNative.__repr__c                 C   s
   t | jƒS r   )Úhexr   r   r   r   r   Ú__hex__:   s    zIntegerNative.__hex__c                 C   s
   t | jƒS r   ©r   r   r   r   r   r   Ú	__index__>   s    zIntegerNative.__index__r   Úbigc                 C   sz   | j dk rtdƒ‚t| j |ƒ}t|ƒ|  kr6dkrBn ntdƒ‚|dkrLn*|dkrnt|ƒ}| ¡  t|ƒ}ntdƒ‚|S )Nr   ú.Conversion only valid for non-negative numberszValue too large to encoder   ÚlittleúIncorrect byteorder)r   r   r   ÚlenÚ	bytearrayÚreverseÚbytes)r   Ú
block_sizeÚ	byteorderÚresultr   r   r   Úto_bytesA   s    

zIntegerNative.to_bytesc                 C   s8   |dkr
n"|dkr$t |ƒ}| ¡  ntdƒ‚| t|ƒƒS )Nr   r!   r"   )r$   r%   r   r   )ÚclsZbyte_stringr(   r   r   r   Ú
from_bytesQ   s    
zIntegerNative.from_bytesc                 C   s   |d krdS | j t|ƒkS )NF©r   r   ©r   Útermr   r   r   Ú__eq__]   s    zIntegerNative.__eq__c                 C   s   |   |¡ S r   )r0   r.   r   r   r   Ú__ne__b   s    zIntegerNative.__ne__c                 C   s   | j t|ƒk S r   r-   r.   r   r   r   Ú__lt__e   s    zIntegerNative.__lt__c                 C   s   |   |¡p|  |¡S r   )r2   r0   r.   r   r   r   Ú__le__h   s    zIntegerNative.__le__c                 C   s   |   |¡ S r   )r3   r.   r   r   r   Ú__gt__k   s    zIntegerNative.__gt__c                 C   s   |   |¡ S r   )r2   r.   r   r   r   Ú__ge__n   s    zIntegerNative.__ge__c                 C   s
   | j dkS ©Nr   r   r   r   r   r   Ú__nonzero__q   s    zIntegerNative.__nonzero__c                 C   s
   | j dk S r6   r   r   r   r   r   Úis_negativeu   s    zIntegerNative.is_negativec              
   C   s:   z|   | jt|ƒ ¡W S  tttfk
r4   t Y S X d S r   ©Ú	__class__r   r   r   r   Ú	TypeErrorÚNotImplementedr.   r   r   r   Ú__add__y   s    zIntegerNative.__add__c              
   C   s:   z|   | jt|ƒ ¡W S  tttfk
r4   t Y S X d S r   r9   r.   r   r   r   Ú__sub__   s    zIntegerNative.__sub__c              
   C   s:   z|   | jt|ƒ ¡W S  tttfk
r4   t Y S X d S r   r9   )r   Zfactorr   r   r   Ú__mul__…   s    zIntegerNative.__mul__c                 C   s   |   | jt|ƒ ¡S r   ©r:   r   r   )r   Údivisorr   r   r   Ú__floordiv__‹   s    zIntegerNative.__floordiv__c                 C   s(   t |ƒ}|dk rtdƒ‚|  | j| ¡S )Nr   úModulus must be positive)r   r   r:   r   )r   rA   Zdivisor_valuer   r   r   Ú__mod__Ž   s    zIntegerNative.__mod__Nc                 C   sb   t |ƒ}|dk rtdƒ‚|d k	rJt |ƒ}|dk r8tdƒ‚|dkrNtdƒ‚nd }t| j||ƒ| _| S )Nr   zExponent must not be negativerC   ú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   )r:   rJ   )r   rH   rI   r)   r   r   r   Ú__pow__¤   s    
zIntegerNative.__pow__c                 C   s
   t | jƒS r   )Úabsr   r   r   r   r   Ú__abs__¨   s    zIntegerNative.__abs__c                 C   s|   | j }|d krR|dk rtdƒ‚|}|d d }||k rL|}|||  d }q.|}n |dkrbtdƒ‚|  | | |¡}|  |¡S )Nr   zSquare root of negative valuer   é   rC   )r   r   Z_tonelli_shanksr:   )r   rI   r   ÚxÚyr)   r   r   r   Úsqrt«   s    zIntegerNative.sqrtc                 C   s   |  j t|ƒ7  _ | S r   r-   r.   r   r   r   Ú__iadd__À   s    zIntegerNative.__iadd__c                 C   s   |  j t|ƒ8  _ | S r   r-   r.   r   r   r   Ú__isub__Ä   s    zIntegerNative.__isub__c                 C   s   |  j t|ƒ9  _ | S r   r-   r.   r   r   r   Ú__imul__È   s    zIntegerNative.__imul__c                 C   s:   t |ƒ}|dkrtdƒ‚|dk r(tdƒ‚|  j|;  _| S )Nr   zDivision by zerorC   )r   rF   r   r   )r   r/   rI   r   r   r   Ú__imod__Ì   s    zIntegerNative.__imod__c                 C   s   |   | jt|ƒ@ ¡S r   r@   r.   r   r   r   Ú__and__Ö   s    zIntegerNative.__and__c                 C   s   |   | jt|ƒB ¡S r   r@   r.   r   r   r   Ú__or__Ù   s    zIntegerNative.__or__c                 C   sF   z|   | jt|ƒ? ¡W S  tk
r@   | jdkr6Y dS Y dS Y nX d S ©Nr   éÿÿÿÿ)r:   r   r   ÚOverflowError©r   Úposr   r   r   Ú
__rshift__Ü   s    
zIntegerNative.__rshift__c                 C   sF   z|  j t|ƒL  _ W n* tk
r@   | j dkr6Y dS Y dS Y nX | S rX   )r   r   rZ   r[   r   r   r   Ú__irshift__å   s    
zIntegerNative.__irshift__c                 C   s8   z|   | jt|ƒ> ¡W S  tk
r2   tdƒ‚Y nX d S ©NzIncorrect shift count)r:   r   r   rZ   r   r[   r   r   r   Ú
__lshift__ï   s    zIntegerNative.__lshift__c                 C   s8   z|  j t|ƒK  _ W n tk
r2   tdƒ‚Y nX | S r_   )r   r   rZ   r   r[   r   r   r   Ú__ilshift__õ   s
    zIntegerNative.__ilshift__c                 C   sŽ   | j dk rtdƒ‚z^z&| j |j ? d@ }|j dk r8tdƒ‚W n2 tk
rl   | j |? d@ }|dk rhtdƒ‚Y nX W n tk
rˆ   d}Y nX |S )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  s    zIntegerNative.is_oddc                 C   s   | j d@ dkS )Nr   r   r   r   r   r   r   Úis_even  s    zIntegerNative.is_evenc                 C   s*   | j dk rtdƒ‚| j dkr dS | j  ¡ S )Nr   r    r   )r   r   Ú
bit_lengthr   r   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  s    zIntegerNative.size_in_bytesc                 C   sb   | j dk rdS | j dkrdS | j d }|d }|| j krT|| j  d|  }|d }q.| j |d kS )Nr   F)r   r   TrN   r   )r   rO   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_accumulate3  s    z!IntegerNative.multiply_accumulatec                 C   s   t |ƒ| _d S r   r   )r   Úsourcer   r   r   Úset7  s    zIntegerNative.setc                 C   s   t | jt|ƒƒ| _| S r   )r   r   r   )r   rI   r   r   r   Úinplace_inverse:  s    zIntegerNative.inplace_inversec                 C   s   |   | ¡}| |¡ |S r   )r:   rq   )r   rI   r)   r   r   r   r   >  s    

zIntegerNative.inversec                 C   s   |   tt| jƒtt|ƒƒƒ¡S r   )r:   r   rL   r   r   r.   r   r   r   ÚgcdC  s    zIntegerNative.gcdc                 C   sD   t |ƒ}| jdks|dkr$|  d¡S |  t| j| |  |¡j ƒ¡S r6   )r   r   r:   rL   rr   r.   r   r   r   ÚlcmF  s    
zIntegerNative.lcmc                 C   sà   t | ƒ} t |ƒ}|dkr tdƒ‚|d@ dkr4tdƒ‚| | } | dksL|dkrPdS | dkr\dS d}| }|d@ dkr‚|dL }|d7 }qd|d@ dkr”d}n|d dkr¦d}nd}|d d	krÈ|d d	krÈ| }|| }|t ||¡ S )
Nr   zn must be a positive integerr   z#n must be odd for the Jacobi symbolrh   )r   é   rY   é   é   )r   r   r   Újacobi_symbol)rl   rb   ÚeZa1ÚsZn1r   r   r   rw   L  s2    
zIntegerNative.jacobi_symbolc                 C   sR   |dk rt dƒ‚|dkr tdƒ‚|d@ dkr4t dƒ‚tt|ƒƒ}t| | | |ƒS )Nr   rC   rE   r   zOdd modulus is required)r   rF   r#   r   )Zterm1Zterm2rI   Z
number_lenr   r   r   Ú_mult_modulo_bytest  s    z IntegerNative._mult_modulo_bytes)r   r   )r   )N)N)N)9Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r*   Úclassmethodr,   r0   r1   r2   r3   r4   r5   r7   Ú__bool__r8   r=   r>   r?   rB   rD   rJ   rK   rM   rQ   rR   rS   rT   rU   rV   rW   r]   r^   r`   ra   rc   rd   re   rg   ri   rj   rk   rn   rp   rq   r   rr   rs   Ústaticmethodrw   rz   r   r   r   r   r   $   sn   	




	


'r   N)Z_IntegerBaser   ZCryptodome.Util.numberr   r   r   r   r   r   r   r   r   Ú<module>   s   