ó
T:´Nc           @   sñ   d  Z  d Z d d d d d d d g Z d	 d
 l m Z d	 d l Z e j d d k rv e j d d k rv d	 d l Tn  d e f d „  ƒ  YZ	 e	 ƒ  Z
 e
 j Z e
 j Z e
 j Z e
 j Z e
 j Z e
 j Z d	 d l m Z m Z m Z m Z d S(   sH   A cryptographically strong version of Python's standard "random" module.s   $Id$t   StrongRandomt   getrandbitst	   randranget   randintt   choicet   shufflet   sampleiÿÿÿÿ(   t   RandomNi    i   i   (   t   *c           B   sM   e  Z d d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C   s   | d  k r$ | d  k r$ d  |  _ nW | d  k	 rH | d  k rH | |  _ n3 | d  k ro | d  k	 ro | j |  _ n t d ƒ ‚ d  S(   Ns(   Cannot specify both 'rng' and 'randfunc'(   t   Nonet	   _randfunct   readt
   ValueError(   t   selft   rngt   randfunc(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyt   __init__$   s    c         C   sR   |  j  d k r$ t j ƒ  j |  _  n  d | >d } | t |  j  t | d ƒ ƒ ƒ @S(   s0   Return a python long integer with k random bits.l    i   i   N(   R
   R	   R   t   newR   t   bytes_to_longt   ceil_div(   R   t   kt   mask(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyR   .   s    c         G   s„  t  | ƒ d k r$ | \ } } } nj t  | ƒ d k rK | \ } } d } nC t  | ƒ d k ru | \ } d } d } n t d t  | ƒ f ƒ ‚ t | t t f ƒ sÐ t | t t f ƒ sÐ t | t t f ƒ rß t d ƒ ‚ n  | d k rú t d ƒ ‚ n  t | | | ƒ } | d k  r"d } n  | d k  rJt d | | | f ƒ ‚ n  | } x% | | k rw|  j t | ƒ ƒ } qSW| | | S(	   sk   randrange([start,] stop[, step]):
        Return a randomly-selected element from range(start, stop, step).i   i   i   i    s.   randrange expected at most 3 arguments, got %ds$   randrange requires integer argumentss(   randrange step argument must not be zeros%   empty range for randrange(%r, %r, %r)(	   t   lent	   TypeErrort
   isinstancet   intt   longR   R   R   t   size(   R   t   argst   startt   stopt   stept   num_choicest   r(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyR   5   s2    				c         C   sw   t  | t t f ƒ s, t  | t t f ƒ r; t d ƒ ‚ n  |  j | | d ƒ } | | k oh | k n ss t ‚ | S(   s0   Return a random integer N such that a <= N <= b.s"   randint requires integer argumentsi   (   R   R   R   R   R   t   AssertionError(   R   t   at   bt   N(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyR   W   s
    ,"c         C   s8   t  | ƒ d k r! t d ƒ ‚ n  | |  j t  | ƒ ƒ S(   sr   Return a random element from a (non-empty) sequence.

        If the seqence is empty, raises IndexError.
        i    s   empty sequence(   R   t
   IndexErrorR   (   R   t   seq(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyR   _   s    c         C   sO   t  | ƒ } x< t t | ƒ ƒ D]( } | j |  j t | ƒ ƒ ƒ | | <q Wd S(   s   Shuffle the sequence in place.N(   t   listt   xrangeR   t   popR   (   R   t   xt   itemst   i(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyR   h   s    c         C   s    t  | ƒ } | | k r' t d ƒ ‚ n  g  } i  } xf t | ƒ D]X } d } x. | d k sj | j | ƒ r| |  j | ƒ } qO W| j | | ƒ d | | <q@ W| S(   sN   Return a k-length list of unique elements chosen from the population sequence.s   sample larger than populationi   N(   R   R   R)   R	   t   has_keyR   t   append(   R   t
   populationR   R    t   retvalt   selectedR-   R!   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyR   r   s    N(
   t   __name__t
   __module__R	   R   R   R   R   R   R   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyR    #   s   
		"				
(   R   R   t   long_to_bytesR   (   t   __doc__t   __revision__t   __all__t   CryptoR   t   syst   version_infot   Crypto.Util.py21compatt   objectR    t   _rR   R   R   R   R   R   t   Crypto.Util.numberR   R   R5   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyt   <module>   s   &`							