§
    8·tc{,  ã                   óŠ   — d Z ddlmZ ddlmZ ddlmZ dZdZdd„Z	d„ Z
dd	lmZ  eedd
…         ¦  «        Zdd„Zd„ Zd„ ZdS )zHFunctions to create and test prime numbers.

:undocumented: __package__
é    )ÚRandom)ÚInteger)Ú
iter_rangeé   Nc                 óø  — t          | t          ¦  «        st          | ¦  «        } | dv rt          S |                      ¦   «         rt          S t          d¦  «        }t          | dz
  ¦  «        }|€t          j        ¦   «         j        }t          |¦  «        }d}|                     ¦   «         r|dz  }|dz  }|                     ¦   «         °t          |¦  «        D ]œ}d}|||fv r4t          j	        d| dz
  |¬¦  «        }d|cxk    r	| dz
  k    sn J ‚|||fv °4t          ||| ¦  «        }	|	||fv rŒVt          d|¦  «        D ],}
t          |	d| ¦  «        }	|	|k    r n|	|k    rt          c c S Œ-t          c S Œ�t          S )a:  Perform a Miller-Rabin primality test on an integer.

    The test is specified in Section C.3.1 of `FIPS PUB 186-4`__.

    :Parameters:
      candidate : integer
        The number to test for primality.
      iterations : integer
        The maximum number of iterations to perform before
        declaring a candidate a probable prime.
      randfunc : callable
        An RNG function where bases are taken from.

    :Returns:
      ``Primality.COMPOSITE`` or ``Primality.PROBABLY_PRIME``.

    .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
    ©r   é   é   é   r   Nr   r	   )Úmin_inclusiveÚmax_inclusiveÚrandfunc)Ú
isinstancer   ÚPROBABLY_PRIMEÚis_evenÚ	COMPOSITEr   ÚnewÚreadr   Úrandom_rangeÚpow)Ú	candidateÚ
iterationsr   ÚoneÚ	minus_oneÚmÚaÚiÚbaseÚzÚjs              ú;/usr/lib/python3/dist-packages/Cryptodome/Math/Primality.pyÚmiller_rabin_testr"   -   sñ  € õ( �i¥Ñ)Ô)ð 'Ý˜IÑ&Ô&ˆ	à�LÐ Ð ÝÐà×ÒÑÔð ÝÐå
�!‰*Œ*€CÝ˜	 A™Ñ&Ô&€IàÐÝ”:‘<”<Ô$ˆõ 	�	ÑÔ€AØ	€AØ
�)Š)‰+Œ+ð Ø	ˆa‰ˆØ	ˆQ‰ˆð �)Š)‰+Œ+ð õ ˜
Ñ#Ô#ð ð ˆð ˆØ�s˜IÐ&Ð&Ð&ÝÔ'°aØ"+¨a¡-Ø%ð'ñ 'ô 'ˆDð ˜Ð-Ð-Ò-Ð- 	¨A¡Ò-Ð-Ð-Ð-Ð-Ð-ð	 �s˜IÐ&Ð&Ð&õ ��a˜Ñ#Ô#ˆØ��iÐ Ð Ð Øõ ˜A˜qÑ!Ô!ð 	ð 	ˆAÝ�A�q˜)Ñ$Ô$ˆAØ�IŠ~ˆ~Ø�Ø�CŠxˆxÝ Ð Ð Ð Ð Ð ð õ ÐÐÐð	 õ Ðó    c                 óÖ  — t          | t          ¦  «        st          | ¦  «        } | dv rt          S |                      ¦   «         s|                      ¦   «         rt
          S d„ } |¦   «         D ]6}| || fv rŒ
t          j        || ¦  «        }|dk    r	t
          c S |dk    r nŒ7| dz   }|                     ¦   «         dz
  }t          d¦  «        }t          d¦  «        }t          d¦  «        }t          d¦  «        }	t          |dz
  dd¦  «        D �]F}
| 	                    |¦  «         ||z  }|| z  }|	 	                    |¦  «         |	|z  }	|	|z  }	|	 
                    ||¦  «         |	                     ¦   «         r|	| z  }	|	dz  }	|	| z  }	|                     |
¦  «        r�| 	                    |¦  «         ||	z  }|                     ¦   «         r|| z  }|dz  }|| z  }| 	                    |	¦  «         | 
                    ||¦  «         |                     ¦   «         r|| z  }|dz  }|| z  }�Œ| 	                    |¦  «         | 	                    |	¦  «         �ŒH|dk    rt          S t
          S )a_  Perform a Lucas primality test on an integer.

    The test is specified in Section C.3.3 of `FIPS PUB 186-4`__.

    :Parameters:
      candidate : integer
        The number to test for primality.

    :Returns:
      ``Primality.COMPOSITE`` or ``Primality.PROBABLY_PRIME``.

    .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
    r   c               3   ó>   K  — d} 	 | V — | dk    r| dz  } n| dz  } |  } Œ)Nr   Tr   r	   © )Úvalues    r!   Ú	alternatezlucas_test.<locals>.alternate�   sB   è è € Øˆð	ØˆKˆKˆKØ�qŠyˆyØ˜‘
��à˜‘
�Ø�FˆEð	r#   r   éÿÿÿÿr   )r   r   r   r   Úis_perfect_squarer   Újacobi_symbolÚsize_in_bitsr   ÚsetÚmultiply_accumulateÚis_oddÚget_bit)r   r(   ÚDÚjsÚKÚrÚU_iÚV_iÚU_tempÚV_tempr   s              r!   Ú
lucas_testr9   w   s«  € õ �i¥Ñ)Ô)ð 'Ý˜IÑ&Ô&ˆ	ð �LÐ Ð ÝÐØ×ÒÑÔð ˜i×9Ò9Ñ;Ô;ð ÝÐðð ð ð ˆY‰[Œ[ð ð ˆØ˜˜Q˜B˜ÐÐØÝÔ" 1 iÑ0Ô0ˆØ�Š7ˆ7ÝÐÐÐØ�Š8ˆ8ØˆEð ð 	�A‰€Aà	�ŠÑÔ˜1Ñ€Aõ �!‰*Œ*€CÝ
�!‰*Œ*€CÝ�Q‰ZŒZ€FÝ�Q‰ZŒZ€Få˜˜A™˜r 2Ñ&Ô&ð !ñ !ˆð 	�
Š
�3‰ŒˆØ�#‰ˆØ�)Ñˆà�
Š
�3‰ŒˆØ�#‰ˆØ�!‰ˆØ×"Ò" 3¨Ñ,Ô,Ð,Ø�=Š=‰?Œ?ð 	 Ø�iÑˆFØ�1‰ˆØ�)Ñˆà�9Š9�Q‰<Œ<ð 	à�GŠG�F‰OŒOˆOØ�6‰MˆCØ�zŠz‰|Œ|ð !Ø�yÑ �Ø�A‰IˆCØ�9ÑˆCà�GŠG�F‰OŒOˆOØ×#Ò# F¨AÑ.Ô.Ð.Ø�zŠz‰|Œ|ð !Ø�yÑ �Ø�A‰IˆCØ�9ÑˆC‰Cà�GŠG�F‰OŒOˆOØ�GŠG�F‰OŒOˆO‰Oà
ˆa‚x€xÝÐÝÐr#   )Ú
sieve_baseéd   c                 ó\  ‡— |€t          j        ¦   «         j        }t          | t          ¦  «        st	          | ¦  «        } t          | ¦  «        t          v rt          S 	 t          | j	        t          ¦  «         n# t          $ r
 t          cY S w xY wd}|                      ¦   «         Š	 t          t          ˆfd„|¦  «        ¦  «        d         d         }n# t          $ r d}Y nw xY wt!          | ||¬¦  «        t          k    rt          S t#          | ¦  «        t          k    rt          S t          S )að  Test if a number is prime.

    A number is qualified as prime if it passes a certain
    number of Miller-Rabin tests (dependent on the size
    of the number, but such that probability of a false
    positive is less than 10^-30) and a single Lucas test.

    For instance, a 1024-bit candidate will need to pass
    4 Miller-Rabin tests.

    :Parameters:
      candidate : integer
        The number to test for primality.
      randfunc : callable
        The routine to draw random bytes from to select Miller-Rabin bases.
    :Returns:
      ``PROBABLE_PRIME`` if the number if prime with very high probability.
      ``COMPOSITE`` if the number is a composite.
      For efficiency reasons, ``COMPOSITE`` is also returned for small primes.
    N)
)éÜ   é   )i  é   )i†  é   )i   é
   )il  é   )iä  é   )iz  r   )i°  é   )i¤  r
   )it  r	   c                 ó   •— ‰| d         k     S )Nr   r&   )ÚxÚbit_sizes    €r!   ú<lambda>z%test_probable_prime.<locals>.<lambda>  s   ø€ ¨h¸¸1¼ªo€ r#   r   r   ©r   )r   r   r   r   r   ÚintÚ_sieve_baser   ÚmapÚfail_if_divisible_byÚ
ValueErrorr   r,   ÚlistÚfilterÚ
IndexErrorr"   r9   )r   r   Ú	mr_rangesÚmr_iterationsrG   s       @r!   Útest_probable_primerT   Þ   s_  ø€ ð, ÐÝ”:‘<”<Ô$ˆå�i¥Ñ)Ô)ð 'Ý˜IÑ&Ô&ˆ	õ ˆ9�~„~�Ð$Ð$ÝÐðÝˆIÔ*­KÑ8Ô8Ð8Ð8øÝð ð ð ÝÐÐÐðøøøð'€Ið ×%Ò%Ñ'Ô'€HðÝ�VÐ$=Ð$=Ð$=Ð$=Ø$-ñ/ô /ñ 0ô 0Ø01ô3Ø34ô6ˆˆøåð ð ð Øˆˆˆðøøøõ ˜ MØ"*ð,ñ ,ô ,Ý/8ò9ð 9åÐÝ�)ÑÔ¥	Ò)Ð)ÝÐÝÐs$   ÁA9 Á9BÂBÂ',C ÃC#Ã"C#c                  óü  — |                       dd¦  «        }|                       dd¦  «        }|                       dd„ ¦  «        }| r$t          d|                      ¦   «         z   ¦  «        ‚|€t          d¦  «        ‚|dk     rt          d	¦  «        ‚|€t          j        ¦   «         j        }t          }|t          k    r@t          j        ||¬
¦  «        dz  } ||¦  «        sŒ0t          ||¦  «        }|t          k    °@|S )ax  Generate a random probable prime.

    The prime will not have any specific properties
    (e.g. it will not be a *strong* prime).

    Random numbers are evaluated for primality until one
    passes all tests, consisting of a certain number of
    Miller-Rabin tests with random bases followed by
    a single Lucas test.

    The number of Miller-Rabin iterations is chosen such that
    the probability that the output number is a non-prime is
    less than 1E-30 (roughly 2^{-100}).

    This approach is compliant to `FIPS PUB 186-4`__.

    :Keywords:
      exact_bits : integer
        The desired size in bits of the probable prime.
        It must be at least 160.
      randfunc : callable
        An RNG function where candidate primes are taken from.
      prime_filter : callable
        A function that takes an Integer as parameter and returns
        True if the number can be passed to further primality tests,
        False if it should be immediately discarded.

    :Return:
        A probable prime in the range 2^exact_bits > p > 2^(exact_bits-1).

    .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
    Ú
exact_bitsNr   Úprime_filterc                 ó   — dS )NTr&   )rF   s    r!   rH   z)generate_probable_prime.<locals>.<lambda><  s   € ¸€ r#   úUnknown parameters: zMissing exact_bits parameteré    zPrime number is not big enough.©rV   r   r   )
ÚpoprN   Úkeysr   r   r   r   r   ÚrandomrT   )ÚkwargsrV   r   rW   Úresultr   s         r!   Úgenerate_probable_primera     s  € ðD —’˜L¨$Ñ/Ô/€JØ�zŠz˜* dÑ+Ô+€HØ—:’:˜n¨n¨nÑ=Ô=€LØð AÝÐ/°&·+²+±-´-Ñ?Ñ@Ô@Ð@àÐÝÐ7Ñ8Ô8Ð8Ø�CÒÐÝÐ:Ñ;Ô;Ð;àÐÝ”:‘<”<Ô$ˆå€FØ
•IÒ
Ð
Ý”N¨jØ,4ð6ñ 6ô 6Ø89ñ:ˆ	àˆ|˜IÑ&Ô&ð 	ØÝ$ Y°Ñ9Ô9ˆð •IÒ
Ð
ð Ðr#   c                  ó¤  — |                       dd¦  «        }|                       dd¦  «        }| r$t          d|                      ¦   «         z   ¦  «        ‚|€t          j        ¦   «         j        }t          }|t          k    rQt          |dz
  |¬¦  «        }|dz  dz   }|                     ¦   «         |k    rŒ@t          ||¬¦  «        }|t          k    °Q|S )	a›  Generate a random, probable safe prime.

    Note this operation is much slower than generating a simple prime.

    :Keywords:
      exact_bits : integer
        The desired size in bits of the probable safe prime.
      randfunc : callable
        An RNG function where candidate primes are taken from.

    :Return:
        A probable safe prime in the range
        2^exact_bits > p > 2^(exact_bits-1).
    rV   Nr   rY   r   r[   r	   rI   )
r\   rN   r]   r   r   r   r   ra   r,   rT   )r_   rV   r   r`   Úqr   s         r!   Úgenerate_probable_safe_primerd   R  s×   € ð  —’˜L¨$Ñ/Ô/€JØ�zŠz˜* dÑ+Ô+€HØð AÝÐ/°&·+²+±-´-Ñ?Ñ@Ô@Ð@àÐÝ”:‘<”<Ô$ˆå€FØ
•IÒ
Ð
Ý#¨z¸A©~ÈÐQÑQÔQˆØ˜‘E˜A‘Iˆ	Ø×!Ò!Ñ#Ô# zÒ1Ð1ØÝ$ Y¸ÐBÑBÔBˆð •IÒ
Ð
ð Ðr#   )N)Ú__doc__Ú
Cryptodomer   ÚCryptodome.Math.Numbersr   ÚCryptodome.Util.py3compatr   r   r   r"   r9   ÚCryptodome.Util.numberr:   Ú_sieve_base_larger-   rK   rT   ra   rd   r&   r#   r!   ú<module>rk      së   ðð>ð ð
 Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +à 0Ð 0Ð 0Ð 0Ð 0Ð 0à€	Ø€ðGð Gð Gð GðT^ð ^ð ^ðB CÐ BÐ BÐ BÐ BÐ Bð ˆcÐ# D S DÔ)Ñ*Ô*€ð7ð 7ð 7ð 7ðt7ð 7ð 7ðtð ð ð ð r#   