summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mpi/mpi.c5
-rw-r--r--mpi/mpi.h1
-rw-r--r--rand.c4
-rw-r--r--tests/013/maze.expected118
4 files changed, 67 insertions, 61 deletions
diff --git a/mpi/mpi.c b/mpi/mpi.c
index 24df7c30..20a48a12 100644
--- a/mpi/mpi.c
+++ b/mpi/mpi.c
@@ -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) */
/*
diff --git a/mpi/mpi.h b/mpi/mpi.h
index 49ccd294..fb9e47e8 100644
--- a/mpi/mpi.h
+++ b/mpi/mpi.h
@@ -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))
diff --git a/rand.c b/rand.c
index a2215124..fe3b6044 100644
--- a/rand.c
+++ b/rand.c
@@ -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 @@
+ +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
-| | | | | | |
-| | | | | | |
-+ + + + +----+----+----+----+ + + + + +----+----+----+ + +----+ +
-| | | | | | | | | | |
-| | | | | | | | | | |
-+----+ + + +----+ +----+ +----+----+ +----+----+ +----+ +----+----+ +----+
-| | | | | | | | | | |
-| | | | | | | | | | |
-+----+----+ + + +----+ +----+----+ + +----+----+----+----+----+ +----+----+ +
-| | | | | | | | | | |
-| | | | | | | | | | |
-+ + + +----+----+----+ + +----+----+ + +----+ + + + + +----+----+
-| | | | | | | | | | | | |
-| | | | | | | | | | | | |
-+ +----+----+ +----+ +----+----+----+ + + + +----+ +----+----+ + + +
-| | | | | | | | | | |
-| | | | | | | | | | |
-+----+----+ + + +----+ +----+ + +----+ + + +----+----+----+----+ + +
-| | | | | | | | | | | | |
-| | | | | | | | | | | | |
-+ +----+----+----+ +----+----+ + +----+ + + + + + +----+ + + +
-| | | | | | | | | | | | |
-| | | | | | | | | | | | |
-+ + + + +----+ + +----+----+----+----+ +----+ + + + +----+----+----+
-| | | | | | | | | |
-| | | | | | | | | |
-+ +----+----+----+----+----+----+----+----+ + +----+----+----+ +----+ +----+----+ +
-| | | | | | | |
-| | | | | | | |
-+ + + +----+----+----+----+ +----+ +----+ +----+ +----+----+----+ +----+ +
-| | | | | | | | | | | | |
-| | | | | | | | | | | | |
-+ +----+----+----+ + + +----+ +----+ +----+ + + + + +----+ + +
-| | | | | | | | | | |
-| | | | | | | | | | |
-+----+ + + +----+----+ +----+ + +----+ +----+----+----+----+----+ +----+ +
-| | | | | | | | | | | |
-| | | | | | | | | | | |
-+ + +----+ + +----+----+ +----+ + +----+ + + + +----+----+ + +
-| | | | | | | | |
-| | | | | | | | |
-+ + +----+----+----+----+----+----+ +----+----+----+----+----+----+----+ + +----+ +
-| | | | | | | | |
-| | | | | | | | |
-+ + +----+----+ +----+ +----+----+ + + + + +----+ + +----+----+ +
-| | | | | | | | | | | | | | |
-| | | | | | | | | | | | | | |
-+----+ + + +----+ +----+ + + +----+----+ +----+ +----+----+ + + +
-| | | | | | | | | | |
-| | | | | | | | | | |
-+ +----+ +----+ +----+----+ + +----+----+ +----+----+----+----+ +----+----+ +
-| | | | | | | | | |
-| | | | | | | | | |
-+----+----+ + +----+ + +----+----+ +----+----+----+----+ + +----+ + +----+
-| | | | | | | | | | | |
-| | | | | | | | | | | |
-+ + + + + +----+----+----+ +----+----+----+----+ + +----+ + + + +
-| | | | | | |
-| | | | | | |
+| | | | | | | | |
+| | | | | | | | |
++ + + + +----+ + + + +----+ + +----+----+ + + +----+ +----+
+| | | | | | | | | | | |
+| | | | | | | | | | | |
++----+----+----+----+ + +----+----+----+----+----+ +----+ + +----+ +----+----+ +
+| | | | | | | | |
+| | | | | | | | |
++ +----+ + + + +----+ +----+----+ +----+ + +----+ +----+ +----+ +
+| | | | | | | | | | | | |
+| | | | | | | | | | | | |
++ +----+----+----+----+ + +----+----+ +----+ + + + +----+----+----+ +----+
+| | | | | | | | | | |
+| | | | | | | | | | |
++----+----+ + + +----+ + +----+----+ + + +----+----+----+ + + + +
+| | | | | | | | | | | | |
+| | | | | | | | | | | | |
++ +----+ + +----+----+----+ + + + +----+ +----+ + +----+ + + +
+| | | | | | | | | | | | |
+| | | | | | | | | | | | |
++ + +----+ + +----+ +----+----+ +----+ + + +----+----+ +----+----+----+
+| | | | | | | | | | | |
+| | | | | | | | | | | |
++ +----+ +----+----+ +----+ + + + +----+ + +----+----+----+ + + +
+| | | | | | | | | | | |
+| | | | | | | | | | | |
++ + +----+ + +----+ + +----+----+----+ +----+----+ +----+ + + + +
+| | | | | | | | | | | | | |
+| | | | | | | | | | | | | |
++----+ + + +----+ +----+----+ +----+ + + + +----+----+ +----+----+ +
+| | | | | | | | | | |
+| | | | | | | | | | |
++ +----+----+----+ +----+----+ +----+ + + + +----+----+ + + +----+----+
+| | | | | | | |
+| | | | | | | |
++ +----+ +----+----+----+----+----+ +----+----+ + +----+----+----+----+----+----+ +
+| | | | | | | | | |
+| | | | | | | | | |
++ + +----+ + +----+ + +----+----+----+----+ + +----+ +----+ + +----+
+| | | | | | | | | | |
+| | | | | | | | | | |
++ +----+ +----+----+ +----+ +----+----+ + +----+----+ +----+ +----+----+ +
+| | | | | | | | | | |
+| | | | | | | | | | |
++----+----+ + + + + +----+ +----+----+----+ + + +----+----+----+ +----+
+| | | | | | | | | |
+| | | | | | | | | |
++ +----+----+ +----+----+----+----+----+----+ + +----+----+----+ +----+ + +----+
+| | | | | | | | |
+| | | | | | | | |
++----+ + + +----+ + +----+----+----+ +----+ + + +----+----+ +----+ +
+| | | | | | | | | | |
+| | | | | | | | | | |
++ +----+ +----+----+----+----+----+----+ + +----+----+----+ + +----+----+----+ +
+| | | | | | | | | | |
+| | | | | | | | | | |
++ +----+----+----+ + +----+ +----+ +----+----+ + + + + + + + +
+| | | | | | |
+| | | | | | |
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ +