
    (phG              	       .   S r SSKr " S S\5      rS\S\4S jrS\S\4S	 jrS\S
\S\4S jrS\S\S\R                  \\\4   4S jr	S\S\S\4S jr
S\R                  \   S\R                  \   S\4S jr\S:X  a  SSKr\R                  " 5         gg)z/Common functionality shared by several modules.    Nc                   D   ^  \ rS rSrS
S\S\S\S\SS4
U 4S jjjrS	rU =r$ )NotRelativePrimeError   abdmsgreturnNc                 d   > [         TU ]  U=(       d    SXU4-  5        Xl        X l        X0l        g )Nz.%d and %d are not relatively prime, divider=%i)super__init__r   r   r   )selfr   r   r   r	   	__class__s        =/var/www/html/venv/lib/python3.13/site-packages/rsa/common.pyr   NotRelativePrimeError.__init__   s1    \ PTUZ[S\ \]    )r   r   r   ) )	__name__
__module____qualname____firstlineno__intstrr   __static_attributes____classcell__)r   s   @r   r   r      s0    # # # C   r   r   numr
   c                 x     U R                  5       $ ! [         a  n[        S[        U 5      -  5      UeSnAff = f)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#      s?    ,\~~ \FcRSY[[\s    
949numberc                 :    U S:X  a  g[        [        U 5      S5      $ )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     ( {HV$a((r   divc                 8    [        X5      u  p#U(       a  US-  nU$ )aF  
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!    $ "KF
!Mr   r   r   c                     SnSnSnSnU nUnUS:w  a!  X-  nXU-  pXHU-  -
  UpBXXU-  -
  UpSUS:w  a  M!  US:  a  XG-  nUS:  a  XV-  nXU4$ )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_gcdr8   i   s     	
A	A	
B	
B	
B	
B
q&FUAa%L1Ba%L1B	 q&
 
Av
	Av
"9r   r1   nc                 F    [        X5      u  p#nUS:w  a  [        XU5      eU$ )z}Returns 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&   )r8   r   )r1   r9   dividerinv_s        r   inverser>      s,     %Q*W1!|#A'22Jr   a_valuesmodulo_valuesc                     SnSnU H  nX$-  nM	     [        X5       H!  u  pVX%-  n[        Xu5      nX6U-  U-  -   U-  nM#     U$ )aY  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@   mr1   modulom_ia_iM_ir<   s	            r   crtrH      s_    ( 	
A	A	   -2
hcsS A%	 3 Hr   __main__)__doc__typing
ValueErrorr   r   r#   r)   r(   Tupler8   r>   IterablerH   r   doctesttestmodr0   r   r   <module>rQ      s    6 J \# \# \8)c )c )2# C C 0C C FLLc3$? 0s s s " &//#&  vs7K  PS  F zOO r   