diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2021-08-16 16:10:10 +0200 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2021-08-16 16:10:10 +0200 |
| commit | 8b49bbb0fca317a02cf6f14fa5c7c8784ea4076d (patch) | |
| tree | 3746915f507d2d7dccef97cd35a0f9eb386507ef /core/math/big/internal.odin | |
| parent | 5f072591ba70abf6df59f4ed9372649e7ebda710 (diff) | |
big: Add `_private_mul_karatsuba`.
Diffstat (limited to 'core/math/big/internal.odin')
| -rw-r--r-- | core/math/big/internal.odin | 14 |
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); } /* |