§
    jŠtjò  ã                   óL  — d Z ddlZddlZddgZde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fd„Z
dedefd„Zdededefd„Zedk    rY ed¦  «         ddlZ ed¦  «        D ]1Z ej        ¦   «         \  ZZer nedz  dk    rer edez  ¦  «         Œ2 ed¦  «         dS dS )z�Numerical 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                 ó,   — |dk    r|| |z  }} |dk    °| S )zPReturns the greatest common divisor of p and q

    >>> gcd(48, 180)
    12
    r   © )r   r   s     úG/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/rsa/prime.pyÚgcdr      s*   € ð ˆqŠ&ˆ&Ø�Q˜‘UˆAˆð ˆqŠ&ˆ&à€Hó    Únumberc                 ót   — 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   Úbitsizes     r
   Úget_primality_testing_roundsr   '   sH   € õ Œj×!Ò! &Ñ)Ô)€Gà�$‚€ØˆqØ�$‚€ØˆqØ�#‚~€~Øˆqàˆ2r   ÚnÚkc                 óx  — | dk     rdS | dz
  }d}|dz  s|dz  }|dz  }|dz  ¯t          |¦  «        D ]†}t          j                             | dz
  ¦  «        dz   }t	          ||| ¦  «        }|dk    s	|| dz
  k    rŒHt          |dz
  ¦  «        D ](}t	          |d| ¦  «        }|dk    r  dS || dz
  k    r nŒ) dS Œ‡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Úxs          r
   Úmiller_rabin_primality_testingr&   A   s  € ð" 	ˆ1‚u€uØˆuð 	
ˆA‰€AØ	€Aà�1‰uð Ø	ˆQ‰ˆØ	ˆa‰ˆð �1‰uð õ
 �1‰XŒXð ð ˆåŒK×Ò  A¡Ñ&Ô&¨Ñ*ˆå��1�a‰LŒLˆØ�Š6ˆ6�Q˜!˜a™%’Z�ZØå�q˜1‘u‘”ð 
	ð 
	ˆAÝ�A�q˜!‘”ˆAØ�AŠvˆvà�u�u�uØ�A˜‘EŠzˆzà�ð ð
 �5�5ð ð
 ˆ4r   c                 óh   — | dk     r| dv S | dz  sdS t          | ¦  «        }t          | |dz   ¦  «        S )z™Returns 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   s     r
   Úis_primer)   v   sP   € ð �‚{€{Ø˜Ð%Ð%ð �Q‰Jð Øˆuõ 	% VÑ,Ô,€Aõ *¨&°!°a±%Ñ8Ô8Ð8r   Únbitsc                 óv   — | dk    sJ ‚	 t           j                             | ¦  «        }t          |¦  «        r|S Œ1)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*   Úintegers     r
   r   r   �   sG   € ð  �1Š9ˆ9ˆ9ˆ9ðÝ”+×1Ò1°%Ñ8Ô8ˆõ �GÑÔð 	ØˆNðr   r$   Úbc                 ó.   — t          | |¦  «        }|dk    S )z«Returns 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!   s      r
   r   r   ¬   s   € õ 	ˆAˆq‰	Œ	€AØ�Š6€Mr   Ú__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
   ú<module>r?      s½  ððð ð Ð Ð Ð Ø Ð Ð Ð àÐ-Ð
.€ð	ˆ3ð 	�3ð 	˜3ð 	ð 	ð 	ð 	ð¨ð °ð ð ð ð ð42 cð 2¨cð 2°dð 2ð 2ð 2ð 2ðj9�Sð 9˜Tð 9ð 9ð 9ð 9ð4�Cð ˜Cð ð ð ð ð8˜Cð  Cð ¨Dð ð ð ð ð ˆzÒÐØ	€EÐ
3Ñ4Ô4Ð4Ø€N€N€Nà��t‘”ð &ð &ˆØ+˜GœOÑ-Ô-Ñˆ�5Øð 	ØˆEà�3‰;˜!ÒÐ ÐØˆE�*˜uÑ$Ñ%Ô%Ð%øà	€Eˆ/ÑÔÐÐÐð Ðr   