o a@sdZddlZddlZddgZdededefdd Zd edefd d Zd ededefddZ d edefddZ dedefddZ dededefddZ e dkr{edddlZedD]Ze\ZZerfneddkrtertedeqZeddSdS)zNumerical functions related to primes. Implementation based on the book Algorithm Design by Michael T. Goodrich and Roberto Tamassia, 2002. Ngetprimeare_relatively_primepqreturncCs"|dkr|||}}|dks|S)zPReturns the greatest common divisor of p and q >>> gcd(48, 180) 12 r)rrrr+/usr/lib/python3/dist-packages/rsa/prime.pygcdsr numbercCs4tj|}|dkr dS|dkrdS|dkrdSdS)aReturns 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 iii )rsacommonbit_size)r bitsizerrrget_primality_testing_rounds's rnkcCs|dkrdS|d}d}|d@s|d7}|dL}|d@rt|D]?}tj|dd}t|||}|dks<||dkr=q t|dD]}t|d|}|dkrSdS||dkr[nqCdSq dS)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 Frr T)rangerrandnumrandintpow)rrdr_axrrrmiller_rabin_primality_testingAs.    r!cCs2|dkr|dvS|d@sdSt|}t||dS)zReturns True if the number is prime, and False otherwise. >>> is_prime(2) True >>> is_prime(42) False >>> is_prime(41) True r>rr r rF)rr!)r rrrris_primevs  r#nbitscCs(|dksJ tj|}t|r|Sq)aReturns 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 )rrread_random_odd_intr#)r$integerrrrrs  rbcCst||}|dkS)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 )rr'rrrrrs __main__z'Running doctests 1000x or until failureidz%i timesz Doctests done)__doc__ rsa.commonr rsa.randnum__all__intr rboolr!r#rr__name__printdoctestrcounttestmodfailurestestsrrrrs, 5