diff options
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/constants.h | 18 | ||||
| -rw-r--r-- | src/utils/math.h | 39 |
2 files changed, 29 insertions, 28 deletions
diff --git a/src/utils/constants.h b/src/utils/constants.h index e328a4c..f90dda3 100644 --- a/src/utils/constants.h +++ b/src/utils/constants.h | |||
| @@ -1,17 +1,17 @@ | |||
| 1 | #define UINT8_BIT(i) (UINT8_C(1) << (uint8_t)(i)) | 1 | #define UINT8_BIT(i) (UINT8_C(1) << (uint8_t)(i)) |
| 2 | 2 | ||
| 3 | #define FACTORIAL_MAX INT64_C(12) | 3 | #define FACTORIAL_MAX UINT64_C(12) |
| 4 | 4 | ||
| 5 | #define POW_2_11 INT64_C(2048) | 5 | #define POW_2_11 UINT64_C(2048) |
| 6 | #define POW_3_7 INT64_C(2187) | 6 | #define POW_3_7 UINT64_C(2187) |
| 7 | #define FACT_12 INT64_C(479001600) | 7 | #define FACT_12 UINT64_C(479001600) |
| 8 | #define FACT_8 INT64_C(40320) | 8 | #define FACT_8 UINT64_C(40320) |
| 9 | #define COMB_12_4 INT64_C(495) | 9 | #define COMB_12_4 UINT64_C(495) |
| 10 | #define COMB_8_4 INT64_C(70) | 10 | #define COMB_8_4 UINT64_C(70) |
| 11 | 11 | ||
| 12 | #define UINT8_ERROR UINT8_MAX | 12 | #define UINT8_ERROR UINT8_MAX |
| 13 | 13 | ||
| 14 | STATIC int64_t factorial[FACTORIAL_MAX+1] = { | 14 | STATIC uint64_t factorial[FACTORIAL_MAX+1] = { |
| 15 | [0] = 1, | 15 | [0] = 1, |
| 16 | [1] = 1, | 16 | [1] = 1, |
| 17 | [2] = 2, | 17 | [2] = 2, |
| @@ -27,7 +27,7 @@ STATIC int64_t factorial[FACTORIAL_MAX+1] = { | |||
| 27 | [12] = 479001600, | 27 | [12] = 479001600, |
| 28 | }; | 28 | }; |
| 29 | 29 | ||
| 30 | STATIC int64_t binomial[12][12] = { | 30 | STATIC uint64_t binomial[12][12] = { |
| 31 | {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | 31 | {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
| 32 | {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | 32 | {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
| 33 | {1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | 33 | {1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
diff --git a/src/utils/math.h b/src/utils/math.h index ebbd63e..f2176b6 100644 --- a/src/utils/math.h +++ b/src/utils/math.h | |||
| @@ -2,12 +2,13 @@ | |||
| 2 | #define MIN(x, y) ((x) < (y) ? (x) : (y)) | 2 | #define MIN(x, y) ((x) < (y) ? (x) : (y)) |
| 3 | #define MAX(x, y) ((x) > (y) ? (x) : (y)) | 3 | #define MAX(x, y) ((x) > (y) ? (x) : (y)) |
| 4 | #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) | 4 | #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) |
| 5 | #define POSITIVE_MOD(x, y) (((x) % (y) + (y)) % (y)) | ||
| 5 | 6 | ||
| 6 | STATIC int64_t permtoindex(size_t, const uint8_t *); | 7 | STATIC uint64_t permtoindex(size_t, const uint8_t *); |
| 7 | STATIC void indextoperm(int64_t, size_t, uint8_t *); | 8 | STATIC void indextoperm(uint64_t, size_t, uint8_t *); |
| 8 | STATIC int permsign(size_t, const uint8_t *); | 9 | STATIC int permsign(size_t, const uint8_t *); |
| 9 | STATIC int64_t digitstosumzero(size_t, const uint8_t *, uint8_t); | 10 | STATIC uint64_t digitstosumzero(size_t, const uint8_t *, uint8_t); |
| 10 | STATIC void sumzerotodigits(int64_t, size_t, uint8_t, uint8_t *); | 11 | STATIC void sumzerotodigits(uint64_t, size_t, uint8_t, uint8_t *); |
| 11 | STATIC double intpow(double, uint64_t); | 12 | STATIC double intpow(double, uint64_t); |
| 12 | 13 | ||
| 13 | /* This code is only used for assertions in debug mode */ | 14 | /* This code is only used for assertions in debug mode */ |
| @@ -36,14 +37,14 @@ isperm(size_t n, const uint8_t *a) | |||
| 36 | } | 37 | } |
| 37 | #endif | 38 | #endif |
| 38 | 39 | ||
| 39 | STATIC int64_t | 40 | STATIC uint64_t |
| 40 | permtoindex(size_t n, const uint8_t *a) | 41 | permtoindex(size_t n, const uint8_t *a) |
| 41 | { | 42 | { |
| 42 | size_t i, j; | 43 | size_t i, j; |
| 43 | int64_t c, ret; | 44 | uint64_t c, ret; |
| 44 | 45 | ||
| 45 | DBG_ASSERT(n <= FACTORIAL_MAX, "Error: cannot compute permtoindex() " | 46 | DBG_ASSERT(n <= FACTORIAL_MAX, "Error: cannot compute permtoindex() " |
| 46 | "for set of size %zu > %" PRId64 "\n", n, FACTORIAL_MAX); | 47 | "for set of size %zu > %" PRIu64 "\n", n, FACTORIAL_MAX); |
| 47 | DBG_ASSERT(isperm(n, a), "Error: cannot compute permtoindex() for " | 48 | DBG_ASSERT(isperm(n, a), "Error: cannot compute permtoindex() for " |
| 48 | "invalid permutation\n"); | 49 | "invalid permutation\n"); |
| 49 | 50 | ||
| @@ -57,15 +58,15 @@ permtoindex(size_t n, const uint8_t *a) | |||
| 57 | } | 58 | } |
| 58 | 59 | ||
| 59 | STATIC void | 60 | STATIC void |
| 60 | indextoperm(int64_t p, size_t n, uint8_t *r) | 61 | indextoperm(uint64_t p, size_t n, uint8_t *r) |
| 61 | { | 62 | { |
| 62 | int64_t c, k; | 63 | uint64_t c, k; |
| 63 | size_t i, j, used; | 64 | size_t i, j, used; |
| 64 | 65 | ||
| 65 | DBG_ASSERT(n <= FACTORIAL_MAX, "Error: cannot compute indextoperm() " | 66 | DBG_ASSERT(n <= FACTORIAL_MAX, "Error: cannot compute indextoperm() " |
| 66 | "for set of size %zu > %" PRId64 "\n", n, FACTORIAL_MAX); | 67 | "for set of size %zu > %" PRIu64 "\n", n, FACTORIAL_MAX); |
| 67 | DBG_ASSERT(p >= 0 && p < factorial[n], "Error: invalid permutation " | 68 | DBG_ASSERT(p < factorial[n], "Error: invalid permutation index %" |
| 68 | "index %" PRId64 " for set of size %zu\n", p, n); | 69 | PRIu64 " for set of size %zu\n", p, n); |
| 69 | 70 | ||
| 70 | for (i = 0, used = 0; i < n; i++) { | 71 | for (i = 0, used = 0; i < n; i++) { |
| 71 | k = p / factorial[n-i-1]; | 72 | k = p / factorial[n-i-1]; |
| @@ -94,28 +95,28 @@ permsign(size_t n, const uint8_t *a) | |||
| 94 | return ret % 2; | 95 | return ret % 2; |
| 95 | } | 96 | } |
| 96 | 97 | ||
| 97 | STATIC int64_t | 98 | STATIC uint64_t |
| 98 | digitstosumzero(size_t n, const uint8_t *a, uint8_t b) | 99 | digitstosumzero(size_t n, const uint8_t *a, uint8_t b) |
| 99 | { | 100 | { |
| 100 | int64_t ret, p; | 101 | uint64_t ret, p; |
| 101 | size_t i, sum; | 102 | size_t i, sum; |
| 102 | 103 | ||
| 103 | DBG_ASSERT((n == 8 && b == 3 ) || (n == 12 && b == 2), | 104 | DBG_ASSERT((n == 8 && b == 3 ) || (n == 12 && b == 2), |
| 104 | "Error: digitstosumzero() called with n=%zu and b=%" PRIu8 | 105 | "Error: digitstosumzero() called with n=%zu and b=%" PRIu8 |
| 105 | " (use n=8 b=3 or n=12 b=2)\n", n, b); | 106 | " (use n=8 b=3 or n=12 b=2)\n", n, b); |
| 106 | 107 | ||
| 107 | for (i = 1, ret = 0, p = 1, sum = 0; i < n; i++, p *= (int64_t)b) { | 108 | for (i = 1, ret = 0, p = 1, sum = 0; i < n; i++, p *= (uint64_t)b) { |
| 108 | DBG_ASSERT(a[i] < b, "Error: digit %" PRIu8 | 109 | DBG_ASSERT(a[i] < b, "Error: digit %" PRIu8 |
| 109 | " > %" PRIu8 "in digitstosumzero()\n", a[i], b); | 110 | " > %" PRIu8 "in digitstosumzero()\n", a[i], b); |
| 110 | sum += a[i]; | 111 | sum += a[i]; |
| 111 | ret += p * (int64_t)a[i]; | 112 | ret += p * (uint64_t)a[i]; |
| 112 | } | 113 | } |
| 113 | 114 | ||
| 114 | return ret; | 115 | return ret; |
| 115 | } | 116 | } |
| 116 | 117 | ||
| 117 | STATIC void | 118 | STATIC void |
| 118 | sumzerotodigits(int64_t d, size_t n, uint8_t b, uint8_t *a) | 119 | sumzerotodigits(uint64_t d, size_t n, uint8_t b, uint8_t *a) |
| 119 | { | 120 | { |
| 120 | uint8_t sum; | 121 | uint8_t sum; |
| 121 | size_t i; | 122 | size_t i; |
| @@ -124,8 +125,8 @@ sumzerotodigits(int64_t d, size_t n, uint8_t b, uint8_t *a) | |||
| 124 | "Error: sumzerotodigits() called with n=%zu and b=%" PRIu8 | 125 | "Error: sumzerotodigits() called with n=%zu and b=%" PRIu8 |
| 125 | " (use n=8 b=3 or n=12 b=2)\n", n, b); | 126 | " (use n=8 b=3 or n=12 b=2)\n", n, b); |
| 126 | 127 | ||
| 127 | for (i = 1, sum = 0; i < n; i++, d /= (int64_t)b) { | 128 | for (i = 1, sum = 0; i < n; i++, d /= (uint64_t)b) { |
| 128 | a[i] = (uint8_t)(d % (int64_t)b); | 129 | a[i] = (uint8_t)(d % (uint64_t)b); |
| 129 | sum += a[i]; | 130 | sum += a[i]; |
| 130 | } | 131 | } |
| 131 | a[0] = (b - (sum % b)) % b; | 132 | a[0] = (b - (sum % b)) % b; |
