diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2021-09-01 14:36:15 +0200 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2021-09-01 19:13:47 +0200 |
| commit | fd83cbf40bad98e7d50d75bee2cdf4a5d3d54921 (patch) | |
| tree | 981e80475ca2334062676d97c2d8d1c300c5588e /core/math | |
| parent | 7d7ed6b95f50ec36e6ed5ad6bded466ca75de26e (diff) | |
big: Add `ilog2`.
Diffstat (limited to 'core/math')
| -rw-r--r-- | core/math/big/example.odin | 10 | ||||
| -rw-r--r-- | core/math/big/private.odin | 2 | ||||
| -rw-r--r-- | core/math/big/public.odin | 6 |
3 files changed, 7 insertions, 11 deletions
diff --git a/core/math/big/example.odin b/core/math/big/example.odin index 64ac30424..449a851d1 100644 --- a/core/math/big/example.odin +++ b/core/math/big/example.odin @@ -213,16 +213,6 @@ int_to_byte_little :: proc(v: ^Int) { demo :: proc() { a, b, c, d, e, f, res := &Int{}, &Int{}, &Int{}, &Int{}, &Int{}, &Int{}, &Int{}; defer destroy(a, b, c, d, e, f, res); - - set(a, 42); - set(b, 6); - set(c, 131); - - if err := internal_int_exponent_mod(res, a, b, c); err != nil { - fmt.printf("Error: %v\n", err); - } - - print("res: ", res); } main :: proc() { diff --git a/core/math/big/private.odin b/core/math/big/private.odin index d2878fcc1..72f5bb9e2 100644 --- a/core/math/big/private.odin +++ b/core/math/big/private.odin @@ -1437,7 +1437,7 @@ _private_int_factorial_binary_split :: proc(res: ^Int, n: int, allocator := cont internal_one(inner, false) or_return;
internal_one(outer, false) or_return;
- bits_used := int(_DIGIT_TYPE_BITS - intrinsics.count_leading_zeros(n));
+ bits_used := ilog2(n);
for i := bits_used; i >= 0; i -= 1 {
start := (n >> (uint(i) + 1)) + 1 | 1;
diff --git a/core/math/big/public.odin b/core/math/big/public.odin index d69b3ba22..68c574905 100644 --- a/core/math/big/public.odin +++ b/core/math/big/public.odin @@ -10,6 +10,8 @@ */
package math_big
+import "core:intrinsics"
+
/*
===========================
User-level routines
@@ -383,6 +385,10 @@ digit_log :: proc(a: DIGIT, base: DIGIT) -> (log: int, err: Error) { }
log :: proc { int_log, digit_log, };
+ilog2 :: proc(value: $T) -> (log2: T) {
+ return (size_of(T) * 8) - intrinsics.count_leading_zeros(value);
+}
+
/*
Calculate `dest = base^power` using a square-multiply algorithm.
*/
|