a
    ‘db   ã                   @   sP   d Z dd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZedkrLddlZe 	¡  dS )z/Common functionality shared by several modules.c                 C   sh   | dkrdS | dk r|  } | d@  d|  }t |ƒd d dddddddddddddddddœ|d   S )as  
    Number of bits needed to represent a integer excluding any prefix
    0 bits.

    As per definition from https://wiki.python.org/moin/BitManipulation and
    to match the behavior of the Python 3 API.

    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%xé   é   é   )Ú0Ú1Ú2Ú3Ú4Ú5Ú6Ú7Ú8Ú9ÚaÚbÚcÚdÚeÚf)Úlen)ÚnumZhex_num© r   ú[/home/tom/ab/renpy-build/tmp/install.linux-x86_64/lib/python3.9/site-packages/rsa/common.pyÚbit_size   s    üûr   c                 C   s>   | dk rt d|  ƒ‚| dkr dS d}| r:|d7 }| dL } q$|S )zM
    Returns the number of bits required to hold a specific long number.
    r   z%Only nonnegative numbers possible: %sr   )Ú
ValueError)ÚnumberÚbitsr   r   r   Ú	_bit_size=   s    
r   c                 C   s*   t t| ƒdƒ\}}|s| dkr&|d7 }|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   r   )Údivmodr   )r   ÚquantaÚmodr   r   r   Ú	byte_sizeQ   s    r#   c           	      C   s†   d}d}d}d}| }|}|dkr\| | }|| |  } }|||  | }}|||  | }}q|dk rl||7 }|dk r|||7 }| ||fS )z@Returns a tuple (r, i, j) such that r = gcd(a, b) = ia + jb
    r   r   r   )	r   r   ÚxÚyZlxZlyZoaÚobÚqr   r   r   Úextended_gcdl   s     r(   c                 C   s,   t | |ƒ\}}}|dkr(td| |f ƒ‚|S )z`Returns x^-1 (mod n)

    >>> inverse(7, 4)
    3
    >>> (inverse(143, 4) * 143) % 4
    1
    r   z*x (%d) and n (%d) are not relatively prime)r(   r   )r$   ÚnÚdividerÚinvÚ_r   r   r   Úinverse…   s    	r-   c           	      C   sX   d}d}|D ]}||9 }qt || ƒD ].\}}|| }t||ƒ}||| |  | }q$|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-   )	Za_valuesZmodulo_valuesÚmr$   ÚmoduloZm_iZa_iZM_ir+   r   r   r   Úcrt–   s    

r1   Ú__main__r   N)
Ú__doc__r   r   r#   r(   r-   r1   Ú__name__ÚdoctestÚtestmodr   r   r   r   Ú<module>   s   )#