ó
BwLc           @   s¼   d  Z  d Z d d d d d d d g Z d	 d
 l m Z d	 d l Td 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   Random(   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   4   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   V   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   sW   t  | ƒ } xD t t | ƒ ƒ D]0 } |  j t | ƒ ƒ } | | | | <| | =q Wd S(   s   Shuffle the sequence in place.N(   t   listt   xrangeR   R   (   R   t   xt   itemst   it   p(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyR   g   s
    c         C   s   t  | ƒ } | | k r' t d ƒ ‚ n  g  } i  } xc t | ƒ D]U } d } x+ | d k sg | | k ry |  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	   R   t   append(   R   t
   populationR   R    t   retvalt   selectedR,   R!   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyR   s   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   N(   t   __doc__t   __revision__t   __all__t   CryptoR   t   Crypto.Util.python_compatt   objectR    t   _rR   R   R   R   R   R   t   Crypto.Util.numberR   R   R4   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/Random/random.pyt   <module>   s   
b							