o
    5h<,                     @   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dkd1d2Zd3d4 Zdkd5d6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 )l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   n/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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   )cls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   )r4   r2   r   r   r   __ne__b   r   zIntegerNative.__ne__c                 C   s   | j t|k S r   r1   r2   r   r   r   __lt__e      zIntegerNative.__lt__c                 C   s   |  |p	| |S r   )r7   r4   r2   r   r   r   __le__h      zIntegerNative.__le__c                 C   r5   r   )r9   r2   r   r   r   __gt__k   r   zIntegerNative.__gt__c                 C   r5   r   )r7   r2   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NotImplementedr2   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@   r2   r   r   r   __sub__   rE   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__   rE   zIntegerNative.__mul__c                 C   s   |  | jt| S r   rA   r   r   )r   divisorr   r   r   __floordiv__   r:   zIntegerNative.__floordiv__c                 C   s(   t |}|dk rtd| | j| S )Nr   Modulus must be positive)r   r   rA   r   )r   rJ   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 negativerL   Modulus cannot be zero)r   r   ZeroDivisionErrorpowr   )r   exponentmodulus	exp_value	mod_valuer   r   r   inplace_pow   s   zIntegerNative.inplace_powc                 C   s   |  | }|||S r   )rA   rV   )r   rR   rS   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      rL   )r   r   _tonelli_shanksrA   )r   rS   r   xyr,   r   r   r   sqrt   s   
zIntegerNative.sqrtc                 C   s   |  j t|7  _ | S r   r1   r2   r   r   r   __iadd__      zIntegerNative.__iadd__c                 C   s   |  j t|8  _ | S r   r1   r2   r   r   r   __isub__   r`   zIntegerNative.__isub__c                 C   s   |  j t|9  _ | S r   r1   r2   r   r   r   __imul__   r`   zIntegerNative.__imul__c                 C   s:   t |}|dkrtd|dk rtd|  j|;  _| S )Nr   zDivision by zerorL   )r   rP   r   r   )r   r3   rS   r   r   r   __imod__   s   zIntegerNative.__imod__c                 C   s   |  | jt|@ S r   rI   r2   r   r   r   __and__   r:   zIntegerNative.__and__c                 C   s   |  | jt|B S r   rI   r2   r   r   r   __or__   r:   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   )rA   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 rf   )r   r   rh   ri   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)rA   r   r   rh   r   ri   r   r   r   
__lshift__   s
   zIntegerNative.__lshift__c                 C   s0   z|  j t|K  _ W | S  ty   tdw rm   )r   r   rh   r   ri   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   rh   )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  r8   zIntegerNative.is_oddc                 C   s   | j d@ dkS )Nr   r   r   r   r   r   r   is_even  r8   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      )ru   r   r   r   r   size_in_bytes  r:   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   TrZ   r   )r   r\   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   small_primer   r   r   fail_if_divisible_by/  s   z"IntegerNative.fail_if_divisible_byc                 C   s   |  j t|t| 7  _ | S r   r1   )r   abr   r   r   multiply_accumulate3  s   z!IntegerNative.multiply_accumulatec                 C   s   t || _d S r   r    )r   sourcer   r   r   set7  r8   zIntegerNative.setc                 C   s   t | jt|| _| S r   )r   r   r   )r   rS   r   r   r   inplace_inverse:  r`   zIntegerNative.inplace_inversec                 C   s   |  | }|| |S r   )rA   r   )r   rS   r,   r   r   r   r   >  s   

zIntegerNative.inversec                 C   s   |  tt| jtt|S r   )rA   r   rX   r   r   r2   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   rA   rX   r   r2   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 symbolrv   )r      rg         )r   r   r   jacobi_symbol)r|   rp   ea1sn1r   r   r   r   L  s4   zIntegerNative.jacobi_symbolc                 C   sR   |dk rt d|dkrtd|d@ dkrt dtt|}t| | | |S )Nr   rL   rO   r   zOdd modulus is required)r   rP   r&   r   )term1term2rS   
number_lenr   r   r   _mult_modulo_bytest  s   z IntegerNative._mult_modulo_bytes)r   r"   )r"   r   )9__name__
__module____qualname____doc__r   r   r   r   r   r!   r-   classmethodr0   r4   r6   r7   r9   r;   r<   r>   __bool__r?   rD   rF   rH   rK   rN   rV   rW   rY   r^   r_   ra   rb   rc   rd   re   rk   rl   rn   ro   rq   rr   rs   ru   rw   ry   r{   r~   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   $   sp    	




	


'r   N)_IntegerBaser   Crypto.Util.numberr   r   r   r   r   r   r   r   r   <module>   s   