
    Sf              	          d Z ddlZ G d de          ZdedefdZdedefd	Zded
edefdZdededej        eeef         fdZ	dededefdZ
dej        e         dej        e         defdZedk    rddlZ ej                     dS dS )z/Common functionality shared by several modules.    Nc                   6     e Zd Zd	dededededdf
 fdZ xZS )
NotRelativePrimeError abdmsgreturnNc                     t                                          |pd|||fz             || _        || _        || _        d S )Nz.%d and %d are not relatively prime, divider=%i)super__init__r   r   r   )selfr   r   r   r	   	__class__s        </var/www/html/env/lib/python3.11/site-packages/rsa/common.pyr   zNotRelativePrimeError.__init__   sI    \ PTUWXZ[S\ \]]]    )r   )__name__
__module____qualname__intstrr   __classcell__)r   s   @r   r   r      se         # # # C           r   r   numr
   c                     	 |                                  S # t          $ r%}t          dt          |           z            |d}~ww xY w)a  
    Number of bits needed to represent a integer excluding any prefix
    0 bits.

    Usage::

        >>> bit_size(1023)
        10
        >>> bit_size(1024)
        11
        >>> bit_size(1025)
        11

    :param num:
        Integer value. If num is 0, returns 0. Only the absolute value of the
        number is considered. Therefore, signed integers will be abs(num)
        before the number's bit length is determined.
    :returns:
        Returns the number of bits in the integer.
    z,bit_size(num) only supports integers, not %rN)
bit_lengthAttributeError	TypeErrortype)r   exs     r   bit_sizer      sX    ,\~~ \ \ \FcRSSY[[\s    
A A  Anumberc                 L    | dk    rdS t          t          |           d          S )a  
    Returns the number of bytes required to hold a specific long number.

    The number of bytes is rounded up.

    Usage::

        >>> byte_size(1 << 1023)
        128
        >>> byte_size((1 << 1024) - 1)
        128
        >>> byte_size(1 << 1024)
        129

    :param number:
        An unsigned integer
    :returns:
        The number of bytes required to hold a specific long number.
    r         )ceil_divr   )r    s    r   	byte_sizer%   8   s*    ( {{qHV$$a(((r   divc                 :    t          | |          \  }}|r|dz  }|S )av  
    Returns the ceiling function of a division between `num` and `div`.

    Usage::

        >>> ceil_div(100, 7)
        15
        >>> ceil_div(100, 10)
        10
        >>> ceil_div(1, 4)
        1

    :param num: Division's numerator, a number
    :param div: Division's divisor, a number

    :return: Rounded up result of the division between the parameters.
    r"   )divmod)r   r&   quantamods       r   r$   r$   Q   s-    $ c""KFC
 !Mr   r   r   c                     d}d}d}d}| }|}|dk    r&| |z  }|| |z  }} |||z  z
  |}}|||z  z
  |}}|dk    &|dk     r||z  }|dk     r||z  }| ||fS )z;Returns a tuple (r, i, j) such that r = gcd(a, b) = ia + jbr   r"    )	r   r   xylxlyoaobqs	            r   extended_gcdr4   i   s     	
A	A	
B	
B	
B	
B
q&&FQUA!a%L1B!a%L1B	 q&&
 
Avv
b	Avv
bb"9r   r-   nc                 \    t          | |          \  }}}|dk    rt          | ||          |S )zReturns the inverse of x % n under multiplication, a.k.a x^-1 (mod n)

    >>> inverse(7, 4)
    3
    >>> (inverse(143, 4) * 143) % 4
    1
    r"   )r4   r   )r-   r5   dividerinv_s        r   inverser:      s:     %Q**Wc1!||#Aq'222Jr   a_valuesmodulo_valuesc                     d}d}|D ]}||z  }t          ||           D ](\  }}||z  }t          ||          }|||z  |z  z   |z  })|S )a  Chinese Remainder Theorem.

    Calculates x such that x = a[i] (mod m[i]) for each i.

    :param a_values: the a-values of the above equation
    :param modulo_values: the m-values of the above equation
    :returns: x such that x = a[i] (mod m[i]) for each i


    >>> crt([2, 3], [3, 5])
    8

    >>> crt([2, 3, 2], [3, 5, 7])
    23

    >>> crt([2, 3, 0], [7, 11, 15])
    135
    r"   r   )zipr:   )	r;   r<   mr-   modulom_ia_iM_ir8   s	            r   crtrD      s{    ( 	
A	A  	V-22 & &
c3hc3sS A%Hr   __main__)__doc__typing
ValueErrorr   r   r   r%   r$   Tupler4   r:   IterablerD   r   doctesttestmodr,   r   r   <module>rM      s   6 5     J   \# \# \ \ \ \8)c )c ) ) ) )2# C C    0C C FLc3$?    0s s s    " &/#&  vs7K  PS        F zNNNGO r   