aboutsummaryrefslogtreecommitdiff
path: root/core/math/big/internal.odin
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2021-08-16 16:10:10 +0200
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2021-08-16 16:10:10 +0200
commit8b49bbb0fca317a02cf6f14fa5c7c8784ea4076d (patch)
tree3746915f507d2d7dccef97cd35a0f9eb386507ef /core/math/big/internal.odin
parent5f072591ba70abf6df59f4ed9372649e7ebda710 (diff)
big: Add `_private_mul_karatsuba`.
Diffstat (limited to 'core/math/big/internal.odin')
-rw-r--r--core/math/big/internal.odin14
1 files changed, 4 insertions, 10 deletions
diff --git a/core/math/big/internal.odin b/core/math/big/internal.odin
index 2c988f91e..d5cb03cc4 100644
--- a/core/math/big/internal.odin
+++ b/core/math/big/internal.odin
@@ -36,8 +36,6 @@ import "core:mem"
import "core:intrinsics"
import rnd "core:math/rand"
-import "core:fmt"
-
/*
Low-level addition, unsigned. Handbook of Applied Cryptography, algorithm 14.7.
@@ -651,7 +649,6 @@ internal_int_mul :: proc(dest, src, multiplier: ^Int, allocator := context.alloc
Fast comba?
*/
err = #force_inline _private_int_sqr_comba(dest, src);
- //err = #force_inline _private_int_sqr(dest, src);
} else {
err = #force_inline _private_int_sqr(dest, src);
}
@@ -679,8 +676,8 @@ internal_int_mul :: proc(dest, src, multiplier: ^Int, allocator := context.alloc
// err = s_mp_mul_balance(a,b,c);
} else if false && min_used >= MUL_TOOM_CUTOFF {
// err = s_mp_mul_toom(a, b, c);
- } else if false && min_used >= MUL_KARATSUBA_CUTOFF {
- // err = s_mp_mul_karatsuba(a, b, c);
+ } else if min_used >= MUL_KARATSUBA_CUTOFF {
+ err = #force_inline _private_mul_karatsuba(dest, src, multiplier);
} else if digits < _WARRAY && min_used <= _MAX_COMBA {
/*
Can we use the fast multiplier?
@@ -1628,16 +1625,13 @@ internal_int_set_from_integer :: proc(dest: ^Int, src: $T, minimize := false, al
internal_set :: proc { internal_int_set_from_integer, internal_int_copy };
-internal_copy_digits :: #force_inline proc(dest, src: ^Int, digits: int) -> (err: Error) {
+internal_copy_digits :: #force_inline proc(dest, src: ^Int, digits: int, offset := int(0)) -> (err: Error) {
#force_inline internal_error_if_immutable(dest) or_return;
/*
If dest == src, do nothing
*/
- if (dest == src) { return nil; }
-
- #force_inline mem.copy_non_overlapping(&dest.digit[0], &src.digit[0], size_of(DIGIT) * digits);
- return nil;
+ return #force_inline _private_copy_digits(dest, src, digits, offset);
}
/*