o
    eó+  ã                   @   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	dgdd„Z
edhd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did/d0„Zdid1d2„Zd3d4„ Zdid5d6„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„ ƒZ7d.S )jÚ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   úJD:\Projects\ConvertPro\env\Lib\site-packages\Crypto/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   Úbigc                 C   sx   | j dk r	tdƒ‚t| j |ƒ}t|ƒ|  krdkrtdƒ‚ |dkr&	 |S |dkr8t|ƒ}| ¡  t|ƒ}|S tdƒ‚)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 u rdS | j t|ƒkS )NF©r   r   ©r   Útermr   r   r   Ú__eq__]   s   zIntegerNative.__eq__c                 C   ó   |   |¡ S r   )r3   r1   r   r   r   Ú__ne__b   r   zIntegerNative.__ne__c                 C   s   | j t|ƒk S r   r0   r1   r   r   r   Ú__lt__e   ó   zIntegerNative.__lt__c                 C   s   |   |¡p	|  |¡S r   )r6   r3   r1   r   r   r   Ú__le__h   ó   zIntegerNative.__le__c                 C   r4   r   )r8   r1   r   r   r   Ú__gt__k   r   zIntegerNative.__gt__c                 C   r4   r   )r6   r1   r   r   r   Ú__ge__n   r   zIntegerNative.__ge__c                 C   s
   | j dkS ©Nr   r   r   r   r   r   Ú__nonzero__q   r   zIntegerNative.__nonzero__c                 C   s
   | j dk S r<   r   r   r   r   r   Úis_negativeu   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ÚNotImplementedr1   r   r   r   Ú__add__y   ó
   ÿzIntegerNative.__add__c              
   C   s4   z|   | jt|ƒ ¡W S  tttfy   t Y S w r   r?   r1   r   r   r   Ú__sub__   rD   zIntegerNative.__sub__c              
   C   s4   z|   | jt|ƒ ¡W S  tttfy   t Y S w r   r?   )r   Úfactorr   r   r   Ú__mul__…   rD   zIntegerNative.__mul__c                 C   s   |   | jt|ƒ ¡S r   ©r@   r   r   )r   Údivisorr   r   r   Ú__floordiv__‹   r9   zIntegerNative.__floordiv__c                 C   s(   t |ƒ}|dk rtdƒ‚|  | j| ¡S )Nr   úModulus must be positive)r   r   r@   r   )r   rI   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 negativerK   z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@   rQ   )r   rO   rP   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   é   rK   )r   r   Z_tonelli_shanksr@   )r   rP   r   ÚxÚyr,   r   r   r   Úsqrt«   s   þ
zIntegerNative.sqrtc                 C   s   |  j t|ƒ7  _ | S r   r0   r1   r   r   r   Ú__iadd__À   ó   zIntegerNative.__iadd__c                 C   s   |  j t|ƒ8  _ | S r   r0   r1   r   r   r   Ú__isub__Ä   rZ   zIntegerNative.__isub__c                 C   s   |  j t|ƒ9  _ | S r   r0   r1   r   r   r   Ú__imul__È   rZ   zIntegerNative.__imul__c                 C   s:   t |ƒ}|dkrtdƒ‚|dk rtdƒ‚|  j|;  _| S )Nr   zDivision by zerorK   )r   rM   r   r   )r   r2   rP   r   r   r   Ú__imod__Ì   s   zIntegerNative.__imod__c                 C   s   |   | jt|ƒ@ ¡S r   rH   r1   r   r   r   Ú__and__Ö   r9   zIntegerNative.__and__c                 C   s   |   | jt|ƒB ¡S r   rH   r1   r   r   r   Ú__or__Ù   r9   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   éÿÿÿÿ)r@   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 r`   )r   r   rb   rc   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)r@   r   r   rb   r   rc   r   r   r   Ú
__lshift__ï   s
   ÿzIntegerNative.__lshift__c                 C   s0   z|  j t|ƒK  _ W | S  ty   tdƒ‚w rg   )r   r   rb   r   rc   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   rb   )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  r7   zIntegerNative.is_oddc                 C   s   | j d@ dkS )Nr   r   r   r   r   r   r   Úis_even  r7   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   é   )ro   r   r   r   r   Úsize_in_bytes  r9   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   TrU   r   )r   rV   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   r0   )r   ÚaÚbr   r   r   Úmultiply_accumulate3  s   z!IntegerNative.multiply_accumulatec                 C   s   t |ƒ| _d S r   r    )r   Úsourcer   r   r   Úset7  r7   zIntegerNative.setc                 C   s   t | jt|ƒƒ| _| S r   )r   r   r   )r   rP   r   r   r   Úinplace_inverse:  rZ   zIntegerNative.inplace_inversec                 C   s   |   | ¡}| |¡ |S r   )r@   ry   )r   rP   r,   r   r   r   r   >  s   

zIntegerNative.inversec                 C   s   |   tt| jƒtt|ƒƒƒ¡S r   )r@   r   rS   r   r   r1   r   r   r   ÚgcdC  s   zIntegerNative.gcdc                 C   sD   t |ƒ}| jdks|dkr|  d¡S |  t| j| |  |¡j ƒ¡S r<   )r   r   r@   rS   rz   r1   r   r   r   ÚlcmF  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 odd for the Jacobi symbolrp   )r   é   ra   é   é   )r   r   r   Újacobi_symbol)rt   rj   ÚeZa1ÚsZn1r   r   r   r   L  s4   þzIntegerNative.jacobi_symbol)r   r"   )r"   r   )8Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r!   r-   Úclassmethodr/   r3   r5   r6   r8   r:   r;   r=   Ú__bool__r>   rC   rE   rG   rJ   rL   rQ   rR   rT   rX   rY   r[   r\   r]   r^   r_   re   rf   rh   ri   rk   rl   rm   ro   rq   rr   rs   rv   rx   ry   r   rz   r{   Ústaticmethodr   r   r   r   r   r   $   sl    	




	

r   N)Z_IntegerBaser   ZCrypto.Util.numberr   r   r   r   r   r   r   r   r   Ú<module>   s   