o
    e                     @   s   d Z ddlZddlZddgZdededefdd	Zd
edefddZdededefddZ	d
edefddZ
dedefddZdededefddZedkr{ed ddlZedD ]Ze \ZZerf ned dkrtertede  qZed dS dS )zNumerical functions related to primes.

Implementation based on the book Algorithm Design by Michael T. Goodrich and
Roberto Tamassia, 2002.
    Ngetprimeare_relatively_primepqreturnc                 C   s"   |dkr|| | } }|dks| S )zPReturns the greatest common divisor of p and q

    >>> gcd(48, 180)
    12
    r    )r   r   r   r   4/usr/local/lib/python3.10/dist-packages/rsa/prime.pygcd   s   r	   numberc                 C   s4   t j| }|dkrdS |dkrdS |dkrdS dS )a  Returns minimum number of rounds for Miller-Rabing primality testing,
    based on number bitsize.

    According to NIST FIPS 186-4, Appendix C, Table C.3, minimum number of
    rounds of M-R testing, using an error probability of 2 ** (-100), for
    different p, q bitsizes are:
      * p, q bitsize: 512; rounds: 7
      * p, q bitsize: 1024; rounds: 4
      * p, q bitsize: 1536; rounds: 3
    See: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
    i      i      i      
   )rsacommonbit_size)r
   bitsizer   r   r   get_primality_testing_rounds'   s   r   nkc                 C   s   | dk rdS | d }d}|d@ s|d7 }|dL }|d@ rt |D ]?}tj| d d }t||| }|dks<|| d kr=q t |d D ]}t|d| }|dkrS  dS || d kr[ nqC dS q dS )a.  Calculates whether n is composite (which is always correct) or prime
    (which theoretically is incorrect with error probability 4**-k), by
    applying Miller-Rabin primality testing.

    For reference and implementation example, see:
    https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test

    :param n: Integer to be tested for primality.
    :type n: int
    :param k: Number of rounds (witnesses) of Miller-Rabin testing.
    :type k: int
    :return: False if the number is composite, True if it's probably prime.
    :rtype: bool
       F   r   r   T)ranger   randnumrandintpow)r   r   dr_axr   r   r   miller_rabin_primality_testingA   s.   r!   c                 C   s2   | dk r| dv S | d@ sdS t | }t| |d S )zReturns True if the number is prime, and False otherwise.

    >>> is_prime(2)
    True
    >>> is_prime(42)
    False
    >>> is_prime(41)
    True
    r   >   r   r      r   r   F)r   r!   )r
   r   r   r   r   is_primev   s   r#   nbitsc                 C   s(   | dksJ 	 t j| }t|r|S q)a  Returns a prime number that can be stored in 'nbits' bits.

    >>> p = getprime(128)
    >>> is_prime(p-1)
    False
    >>> is_prime(p)
    True
    >>> is_prime(p+1)
    False

    >>> from rsa import common
    >>> common.bit_size(p) == 128
    True
    r   )r   r   read_random_odd_intr#   )r$   integerr   r   r   r      s   r   bc                 C   s   t | |}|dkS )zReturns True if a and b are relatively prime, and False if they
    are not.

    >>> are_relatively_prime(2, 3)
    True
    >>> are_relatively_prime(2, 4)
    False
    r   )r	   )r   r'   r   r   r   r   r      s   

__main__z'Running doctests 1000x or until failurei  d   z%i timeszDoctests done)__doc__
rsa.commonr   rsa.randnum__all__intr	   r   boolr!   r#   r   r   __name__printdoctestr   counttestmodfailurestestsr   r   r   r   <module>   s,   5