diff options
-rw-r--r-- | mpi/mpi.c | 5 | ||||
-rw-r--r-- | mpi/mpi.h | 1 | ||||
-rw-r--r-- | rand.c | 4 | ||||
-rw-r--r-- | tests/013/maze.expected | 118 |
4 files changed, 67 insertions, 61 deletions
@@ -2998,6 +2998,11 @@ int mp_count_bits(mp_int *mp) /* }}} */ +int mp_is_pow_two(mp_int *mp) +{ + return s_mp_ispow2(mp) >= 0; +} + /* {{{ mp_read_radix(mp, str, radix) */ /* @@ -223,6 +223,7 @@ int mp_unsigned_bin_size(mp_int *mp); mp_err mp_to_unsigned_bin(mp_int *mp, unsigned char *str); int mp_count_bits(mp_int *mp); +int mp_is_pow_two(mp_int *mp); #if MP_COMPAT_MACROS #define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len)) @@ -185,7 +185,7 @@ val random(val state, val modulus) if (bignump(modulus)) { mp_int *m = mp(modulus); - int bits = mp_count_bits(m); + int bits = mp_count_bits(m) - mp_is_pow_two(m); int rands_needed = (bits + 32 - 1) / 32; int msb_rand_bits = bits % 32; rand32_t msb_rand_mask = convert(rand32_t, -1) >> (32 - msb_rand_bits); @@ -222,10 +222,10 @@ val random(val state, val modulus) return normalize(out); } else if (fixnump(modulus)) { cnum m = c_num(modulus); - int bits = highest_bit(m); if (m == 1) { return zero; } else if (m > 1) { + int bits = highest_bit(m - 1); #if SIZEOF_PTR >= 8 int rands_needed = (bits + 32 - 1) / 32; #endif diff --git a/tests/013/maze.expected b/tests/013/maze.expected index f0a09770..e3cbbf80 100644 --- a/tests/013/maze.expected +++ b/tests/013/maze.expected @@ -1,61 +1,61 @@ + +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ -| | | | | | | -| | | | | | | -+ + + + +----+----+----+----+ + + + + +----+----+----+ + +----+ + -| | | | | | | | | | | -| | | | | | | | | | | -+----+ + + +----+ +----+ +----+----+ +----+----+ +----+ +----+----+ +----+ -| | | | | | | | | | | -| | | | | | | | | | | -+----+----+ + + +----+ +----+----+ + +----+----+----+----+----+ +----+----+ + -| | | | | | | | | | | -| | | | | | | | | | | -+ + + +----+----+----+ + +----+----+ + +----+ + + + + +----+----+ -| | | | | | | | | | | | | -| | | | | | | | | | | | | -+ +----+----+ +----+ +----+----+----+ + + + +----+ +----+----+ + + + -| | | | | | | | | | | -| | | | | | | | | | | -+----+----+ + + +----+ +----+ + +----+ + + +----+----+----+----+ + + -| | | | | | | | | | | | | -| | | | | | | | | | | | | -+ +----+----+----+ +----+----+ + +----+ + + + + + +----+ + + + -| | | | | | | | | | | | | -| | | | | | | | | | | | | -+ + + + +----+ + +----+----+----+----+ +----+ + + + +----+----+----+ -| | | | | | | | | | -| | | | | | | | | | -+ +----+----+----+----+----+----+----+----+ + +----+----+----+ +----+ +----+----+ + -| | | | | | | | -| | | | | | | | -+ + + +----+----+----+----+ +----+ +----+ +----+ +----+----+----+ +----+ + -| | | | | | | | | | | | | -| | | | | | | | | | | | | -+ +----+----+----+ + + +----+ +----+ +----+ + + + + +----+ + + -| | | | | | | | | | | -| | | | | | | | | | | -+----+ + + +----+----+ +----+ + +----+ +----+----+----+----+----+ +----+ + -| | | | | | | | | | | | -| | | | | | | | | | | | -+ + +----+ + +----+----+ +----+ + +----+ + + + +----+----+ + + -| | | | | | | | | -| | | | | | | | | -+ + +----+----+----+----+----+----+ +----+----+----+----+----+----+----+ + +----+ + -| | | | | | | | | -| | | | | | | | | -+ + +----+----+ +----+ +----+----+ + + + + +----+ + +----+----+ + -| | | | | | | | | | | | | | | -| | | | | | | | | | | | | | | -+----+ + + +----+ +----+ + + +----+----+ +----+ +----+----+ + + + -| | | | | | | | | | | -| | | | | | | | | | | -+ +----+ +----+ +----+----+ + +----+----+ +----+----+----+----+ +----+----+ + -| | | | | | | | | | -| | | | | | | | | | -+----+----+ + +----+ + +----+----+ +----+----+----+----+ + +----+ + +----+ -| | | | | | | | | | | | -| | | | | | | | | | | | -+ + + + + +----+----+----+ +----+----+----+----+ + +----+ + + + + -| | | | | | | -| | | | | | | +| | | | | | | | | +| | | | | | | | | ++ + + + +----+ + + + +----+ + +----+----+ + + +----+ +----+ +| | | | | | | | | | | | +| | | | | | | | | | | | ++----+----+----+----+ + +----+----+----+----+----+ +----+ + +----+ +----+----+ + +| | | | | | | | | +| | | | | | | | | ++ +----+ + + + +----+ +----+----+ +----+ + +----+ +----+ +----+ + +| | | | | | | | | | | | | +| | | | | | | | | | | | | ++ +----+----+----+----+ + +----+----+ +----+ + + + +----+----+----+ +----+ +| | | | | | | | | | | +| | | | | | | | | | | ++----+----+ + + +----+ + +----+----+ + + +----+----+----+ + + + + +| | | | | | | | | | | | | +| | | | | | | | | | | | | ++ +----+ + +----+----+----+ + + + +----+ +----+ + +----+ + + + +| | | | | | | | | | | | | +| | | | | | | | | | | | | ++ + +----+ + +----+ +----+----+ +----+ + + +----+----+ +----+----+----+ +| | | | | | | | | | | | +| | | | | | | | | | | | ++ +----+ +----+----+ +----+ + + + +----+ + +----+----+----+ + + + +| | | | | | | | | | | | +| | | | | | | | | | | | ++ + +----+ + +----+ + +----+----+----+ +----+----+ +----+ + + + + +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | ++----+ + + +----+ +----+----+ +----+ + + + +----+----+ +----+----+ + +| | | | | | | | | | | +| | | | | | | | | | | ++ +----+----+----+ +----+----+ +----+ + + + +----+----+ + + +----+----+ +| | | | | | | | +| | | | | | | | ++ +----+ +----+----+----+----+----+ +----+----+ + +----+----+----+----+----+----+ + +| | | | | | | | | | +| | | | | | | | | | ++ + +----+ + +----+ + +----+----+----+----+ + +----+ +----+ + +----+ +| | | | | | | | | | | +| | | | | | | | | | | ++ +----+ +----+----+ +----+ +----+----+ + +----+----+ +----+ +----+----+ + +| | | | | | | | | | | +| | | | | | | | | | | ++----+----+ + + + + +----+ +----+----+----+ + + +----+----+----+ +----+ +| | | | | | | | | | +| | | | | | | | | | ++ +----+----+ +----+----+----+----+----+----+ + +----+----+----+ +----+ + +----+ +| | | | | | | | | +| | | | | | | | | ++----+ + + +----+ + +----+----+----+ +----+ + + +----+----+ +----+ + +| | | | | | | | | | | +| | | | | | | | | | | ++ +----+ +----+----+----+----+----+----+ + +----+----+----+ + +----+----+----+ + +| | | | | | | | | | | +| | | | | | | | | | | ++ +----+----+----+ + +----+ +----+ +----+----+ + + + + + + + + +| | | | | | | +| | | | | | | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ + |