| @@ 191-210 (lines=20) @@ | ||
| 188 | randomdata = os.urandom(nbytes) |
|
| 189 | return bytes2int(randomdata) |
|
| 190 | ||
| 191 | def randint(minvalue, maxvalue): |
|
| 192 | """Returns a random integer x with minvalue <= x <= maxvalue""" |
|
| 193 | ||
| 194 | # Safety - get a lot of random data even if the range is fairly |
|
| 195 | # small |
|
| 196 | min_nbits = 32 |
|
| 197 | ||
| 198 | # The range of the random numbers we need to generate |
|
| 199 | range = (maxvalue - minvalue) + 1 |
|
| 200 | ||
| 201 | # Which is this number of bytes |
|
| 202 | rangebytes = ((bit_size(range) + 7) / 8) |
|
| 203 | ||
| 204 | # Convert to bits, but make sure it's always at least min_nbits*2 |
|
| 205 | rangebits = max(rangebytes * 8, min_nbits * 2) |
|
| 206 | ||
| 207 | # Take a random number of bits between min_nbits and rangebits |
|
| 208 | nbits = random.randint(min_nbits, rangebits) |
|
| 209 | ||
| 210 | return (read_random_int(nbits) % range) + minvalue |
|
| 211 | ||
| 212 | def jacobi(a, b): |
|
| 213 | """Calculates the value of the Jacobi symbol (a/b) |
|
| @@ 112-131 (lines=20) @@ | ||
| 109 | ||
| 110 | return int(math.ceil(x)) |
|
| 111 | ||
| 112 | def randint(minvalue, maxvalue): |
|
| 113 | """Returns a random integer x with minvalue <= x <= maxvalue""" |
|
| 114 | ||
| 115 | # Safety - get a lot of random data even if the range is fairly |
|
| 116 | # small |
|
| 117 | min_nbits = 32 |
|
| 118 | ||
| 119 | # The range of the random numbers we need to generate |
|
| 120 | range = maxvalue - minvalue |
|
| 121 | ||
| 122 | # Which is this number of bytes |
|
| 123 | rangebytes = ceil(math.log(range, 2) / 8.) |
|
| 124 | ||
| 125 | # Convert to bits, but make sure it's always at least min_nbits*2 |
|
| 126 | rangebits = max(rangebytes * 8, min_nbits * 2) |
|
| 127 | ||
| 128 | # Take a random number of bits between min_nbits and rangebits |
|
| 129 | nbits = random.randint(min_nbits, rangebits) |
|
| 130 | ||
| 131 | return (read_random_int(nbits) % range) + minvalue |
|
| 132 | ||
| 133 | def fermat_little_theorem(p): |
|
| 134 | """Returns 1 if p may be prime, and something else if p definitely |
|