@@ 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 |